让gitlab事件直接在企业微信中发起提醒,替代传统的邮件提醒,达到更好的消息送达率。如果你司目前还没有类似的通知机制,不妨尝试一下,说不定因此而得到上司赏识,开始幸福而甜蜜的生活。
废话不多说,直接上项目。
项目地址:github
技术栈:typescript + express
流程:
最开始做这个项目的目的是为了建立一套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已被合并的通知,并通知发起人。
后面还增强了机器人功能,增加了 定时任务 和 pipeline 事件通知。
这套机制已在本司项目中取得了不错的效果。
目前支持以下gitlab事件的webhook:
gitlab webhook
配置gitlab webhook
需要具有项目的maintainer权限,才可以设置Webhooks
接口路径 URL: /gitlab_hook, 即项目部署的地址加上此路径,即为gitlab webhook Url.
Secret Token: gitlab-webhook, 给项目中添加webhook时,需要填写的选项,增强接口安全性, 默认为gitlab-webhook, 可在src/appConfig.ts中修改
Trigger: 即想要接收的事件通知,勾选即可
merge_request
提供对gitlab webhook中merge_request事件支持,目前支持以下类型提醒:
-
新开
Merge Request时,提醒仓库作者和assignee指定的用户当发起MR时没有在description中指定Code Reivew人员时,通知如下
当指定了Code Review人员时, 通知如下
-
Merge Request发生更新时(除Title和Label更新)提醒 -
Merge Request被合并时通知仓库作者和assignee指定的用户
note
提供对Merge Request中发生评论时的事件提醒功能,目前支持以下类型提醒
-
当
Merge Request中发生评论时 -
当
Merge Request中对代码进行评论时当在Merge Request中评论1或者done且评论人为Code Review人员时,则认为代码审查通过
定时任务
制订了一个定时任务,用于非周末的每一天查询所有项目是否还有未处理的Merge Request,将向对应项目的机器人发送一条待办事项的通知
gitlab api
api url
本项目中使用到了gitlab的 REST API,请根据您实际使用的gitlab 服务确定api地址。
配置路径: src/appConfig.ts
access_token
本项目中使用到了gitlab api, 访问gitlab api需要使用access_token,
token 配置在 src/appConfig.ts中,请在此替换您的token。
企业微信机器人
上述gitlab webhook提醒功能依赖于企业微信机器人,由机器人负责发送消息到企业微信群,每个机器人具有唯一的key,请保管好群机器人key值,防止泄漏
机器人key的配置
在代码中src/config/projectKeys文件中,维护了一份群机器人key与gitlab项目信息的映射关系,参考以下配置进行修改
module.exports = {
// 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规则修改
关于代码评论与MR评论
这两个评论事件在 GitLab 中都是 Note 事件,通过区分事件中的属性从而判断是代码评论还是MR事件本身的评论
这是 MR 评论
这是代码评论
之所以选择使用MR评论作为 Code Review完成的标志,因为我的项目中使用的是gitlab 12版本,本来最开始是选用gitlab 的 approval 作为 Merge Request 的代码审批规则的,但是需要13.2版本以后才开始支持,所以只得放弃。由于采用评论作为Code Review通过与否的判断,所以需要团队间达成一个行为约定。
如何打包和部署
首次部署
- 准备一台具有node环境的服务器
- 全局安装pm2
- 在本项目中使用
yarn build或npm run build命令打包得到 out 文件夹。 - 将 out 文件夹下的所有文件拷贝到服务器指定的目录,然后切换到目录下,使用
yarn或npm i安装依赖 - 在目录下执行命令
pm2 start pm2.json即可成功启动服务(默认监听端口为16080,可在pm2.json中修改) - 可使用
pm2 save加pm2 startup实现开机启动
版本更新
- 进入部署服务的服务器,切换到项目所在的目录
- 将本次打包的代码拷贝进来,覆盖老版本代码
- 执行命令
pm2 restart webhook-server。(webhook-server是pm2启动的项目的名字,可在pm2.json中修改)
效果测试
在web中可进行测试,点击Test选择对应事件后会发送事件通知。
点击 Edit 按钮可以查看到历史的webhook通知记录,可以查看发送的消息内容以及webhook的响应内容