gitlab 如何接入企业微信机器人


theme: smartblue

概述

为什么要接入企业微信机器人?

比如我们在每次 Merge Request 的时候我们都需要手动去@代码评审人,提醒对方去做代码评审,利用机器人帮助我们去完成这件事情它不香么,我们甚至可以去定制化它的消息,让我们的组间协调变得更加有趣

image.png

gitlab 为什么无法直接接入企业微信机器人?

企业微信机器人接口接收的数据格式和 gitlab触发事件时发送的数据格式不匹配,因此无法直接接入,需要我们搭建一个后台作为中转

image.png

接入流程

创建一个机器人

打开要接入的企业微信群

image.png

你会打开下面这个窗口,点击创建机器人

image.png

创建成功后就可以拿到机器人的 webhook url 了,后面我们就是利用它来发送群聊

image.png

接入gitlab

打开你的代码仓库点击设置里的 Webhooks选项

image.png

在这个页面里设置你的后台地址和触发通知的事件,我只设置了 Merge request events,根据你们团队需要也可以设置 Push events

image.png

搭建后台

怎么搭建一个后台我就不展开详说的,本人是用 eggjs 搭建的后台,你也可以用 java、go、python、c++ 等去搭建,怎么方便怎么来

image.png

上菜

// 处理路由 /webhooks 的逻辑
public async index() {
    // 获取 gitlab 发送的消息体
    const body = this.ctx.request.body; 
    console.log("body---", body);

    // 如果请求和评审人是同一个人不做提示
    const { username: assignName } = body.assignees[0];
    const userName = body.user.username;
    if (assignName === userName) return false;

    // 只有 merge request 才处理
    if (body.event_type === EVEVT_TYPE.merge) {
      // 发送提示消息(下面贴了详细代码)
      await this.service.merge.hook(body, config);
      // 提示对应的评审人(下面贴了详细代码)
      await this.service.tip.hook(config.members[assignName], config.robot);
    } else {
      return;
    }
  }
// this.service.merge.hook
public async hook(params: any, config: any) {
    const userName = params.user.name;
    const {
      target_branch: targetBranch,
      title,
      url,
    } = params.object_attributes;
    const { username: assignName } = params.assignees[0];

    // 组织消息要发送的信息,支持 markdown
    const data = {
      msgtype: "markdown",
      markdown: {
        content: `${config.nickname[assignName]},您有个待处理的 Merge Request\n>提交作者: ${userName}\n>目标分支: ${targetBranch}\n\n>请求标题: [**${title}**](${url})\n温馨提示: 点击标题可跳转至处理页面`,
      },
    };

    // 通知企业微信机器人
    await this.ctx.curl(config.robot /* 机器人的 webhook url */, {
      method: "POST",
      contentType: "json",
      data,
      dataType: "json",
    });
    return true;
}
// this.service.tip.hook
public async hook(phone: string, robot: string) {
    await this.ctx.curl(robot, {
      method: "POST",
      contentType: "json",
      data: {
        msgtype: "text",
        text: {
          // @评审人需要拿到他的企业微信 userid,如果拿不到 userid 可以通过配置他的手机号
          mentioned_mobile_list: [phone], 
        },
      },
      dataType: "json",
    });
// console.log(result);
}

总结

很简单的工具,一方面是可以提升大家整体的工作效率,另一方面也可以适当活跃一下团队的气氛,或许你也可以多安排几张骚图在这些消息体里哈哈,我是给我们的组员都安排了一个昵称。

image.png
image.png
image.png

那对于我自己而言就是熟悉了一下egg,还有自己公司的构建平台,借这个机会你也可以往里面加一些你想学习的东西。

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容