让gitlab事件直接在企业微信中发起提醒,替代传统的邮件提醒,达到更好的消息送达率。
最开始做这个项目的目的是为了建立一套Merge Requrest
加 Code Review
消息通知机制,整个的Merge Request机制如下:
- 用户发起
Merge Request
,同时在Merge Request
中的description去@对应用户,被@的用户会做为Code Reviewer
来为你的代码进行Code Review
,会在企业微信群中对被@的用户发起通知,提醒前去进行Code Review
。通知的消息为在MR中title
项填写的内容。 - 当
Code Reviewer
进行Code Review
后认为没有代码质量问题,则在Merge Request
的评论中回复 1 或者 done,当所有Code Reviewer
都评论过后,则认为代码质量审核通过。 - 当
Code Review
通过后,随即发起Merge Request
提醒合并通知,通知人为该仓库的author
以及在发起Merge Request
时assignee
指定的用户 Merge Request
合并完成后,发起该Merge Request
已被合并的通知,并通知发起人。
目前支持以下gitlab事件的webhook
接口路径: /gitlab_hook, 即项目部署的地址加上此路径,即为gitlab webhook Url.
Secret Token: gitlab-webhook, 给项目中添加webhook时,需要填写的选项,增强接口安全性, 默认为gitlab-webhook
, 可在src/appConfig.ts
中修改
提供对gitlab webhook中merge_request事件支持,目前支持以下类型提醒:
-
新开
Merge Request
时,提醒仓库作者和assignee
指定的用户当发起MR时没有在description中指定Code Reivew人员时,通知如下
当指定了Code Review人员时, 通知如下
-
Merge Request
发生更新时(除Title和Label更新)提醒 -
Merge Request
被合并时通知仓库作者和assignee
指定的用户
提供对Merge Request
中发生评论时的事件提醒功能,目前支持以下类型提醒
支持pipeline事件的提醒。当pipeline运行成功后提醒。
制订了一个定时任务,用于非周末的每一天查询所有项目是否还有未处理的Merge Request
,将向对应项目的机器人发送一条待办事项的通知
本项目中使用到了gitlab的 REST API,请根据您实际使用的gitlab 服务确定api地址。
配置路径: src/appConfig.ts
本项目中使用到了gitlab api, 访问gitlab api需要使用access_token,
token 配置在 src/appConfig.ts
中,请在此替换您的token。
上述gitlab webhook提醒功能依赖于企业微信机器人,由机器人负责发送消息到企业微信群,每个机器人具有唯一的key
,请保管好群机器人key
值,防止泄漏
在代码中src/config/projectKeys
文件中,维护了一份群机器人key与gitlab项目信息的映射关系,参考以下配置进行修改
module.exports =module.exports = {
// gitlab projectName
"project name": {
id: "<project id>", // gitlab project id
key: "<your robot key>" // 企业微信机器人key
}
由于通过接口发送消息时,无法直接通过@用户名去@对应用户,想要@用户必须使用用户id。 用户ID根据每个公司的设置规则而有所不同,需要找到公司里管理企业微信后台的管理员索要用户ID设置规则。
在代码中会对gitlab事件相关的用户进行查询,以得到其中文名,然后根据用户ID规则进行一个转换以得到真实用户ID,这样才能正确的@用户。
相关代码在src/utils/index.ts
中的 usernameToUserid
方法,请根据不同的ID规则修改
这两个评论事件在 GitLab 中都是 Note 事件,通过区分事件中的属性从而判断是代码评论还是MR事件本身的评论
这是 MR 评论
这是代码评论
之所以选择使用MR评论作为 Code Review完成的标志,因为我的项目中使用的是gitlab 12版本,本来最开始是选用gitlab 的 approval 作为 Merge Request 的代码审批规则的,但是需要13.2版本以后才开始支持,所以只得放弃。由于采用评论作为Code Review通过与否的判断,所以需要团队间达成一个行为约定。
- 准备一台具有node环境的服务器
- 在本项目中使用
yarn build
或npm run build
命令打包得到 out 文件夹。 - 将 out 文件夹下的所有文件拷贝到服务器指定的目录,然后切换到目录下,使用
yarn
或npm i
安装依赖 - 在目录下执行命令
pm2 start pm2.json
即可成功启动服务(默认监听端口为16080,可在pm2.json中修改)
- 进入部署服务的服务器,切换到项目所在的目录
- 将本次打包的代码拷贝进来,覆盖老版本代码
- 执行命令
pm2 restart webhook-server
。(webhook-server是pm2启动的项目的名字,可在pm2.json中修改)