
gitlab 创建 merge-request 时执行作业
为了项目代码更加健壮,避免一些低级错误以及有一些业务不了解而导致的问题,我们每个需求上线之前都需要邀请其他同学进行代码评审,然而每次都要手动在群里面邀请其他同学未免有一些麻烦了,因此,想要使用`CI`工具,在创建`merge-request`请求时自动发送代码评审邀请。但目前`gitlab`中的事件触发`merge_requests`不仅仅在创建`merge-request`时会触发,我们每次推送
gitlab 创建 merge-request 时执行作业
背景
为了项目代码更加健壮,避免一些低级错误以及有一些业务不了解而导致的问题,我们每个需求上线之前都需要邀请其他同学进行代码评审,然而每次都要手动在群里面邀请其他同学未免有一些麻烦了,因此,想要使用CI
工具,在创建merge-request
请求时自动发送代码评审邀请。
遇到的问题
目前gitlab
中的事件触发merge_requests
不仅仅在创建merge-request
时会触发,我们每次推送更改到已经提过merge-request
的源分支时,都会触发改工作,导致我们每次推送都会发送一次邀请通知。这也太扰民了。我们期望的行为是:
- 当
merge-request
创建时触发作业,获取合并请求相关信息,发送代码评审通知 - 已经发送过代码评审通知的
merge-request
的源分支提交更改时不会重复触发作业发送通知。
解决方案
我们是否可以将已经发送过邀请通知的merge-request
链接保存起来,如果下次再触发该工作时,发现该merge-request
链接已经发送过通知了,我们就不再重复发送了。因此,这边想到了利用缓存的方式解决这个问题:
-
当首次创建
merge-request
时,我们的缓存中不存在当前merge-request
的链接,则直接发送通知,然后将当前merge-request
的url保存到缓存当中。 -
当我们推送更改到
merge-request
的源分支时,先检查一下缓存中是否存在改当前merge-request
链接,如果存在,则直接跳过。否则重复步骤1的操作。
.gitlab-ci.yml
stages:
# 忽略无关代码
- mr
# 发送代码评审邀请通知
mr:
retry: 2
only:
# 当且仅当是合并请求并且目标分支是release1~release9时触发作业
- /^release[1-9]?$/
- merge_requests
tags:
- k8s
stage: mr
variables:
# 用于记录已经发送过通知的缓存文件名称
mridsFile: 'mrids.txt'
# 利用缓存功能完成筛选已经发送过通知的合并请求的任务
cache:
untracked: true
paths:
- '$mridsFile'
script:
# 空字符串默认值
- empty=""
# 当前合并请求的URL
- mergeUrl="$CI_MERGE_REQUEST_PROJECT_URL/-/merge_requests/$CI_MERGE_REQUEST_IID/diffs"
- echo "review链接:$mergeUrl"
# 判断缓存的mr记录文件是否存在,如果存在从中搜索当前 mr url,否则url为空
- if [[ ! -f "$mridsFile" ]]; then touch $mridsFile; fi;
# 注意,如果没有查询到结果,需要指定一个空字符串作为默认值,否则后面判断有异常
- url=`cat $mridsFile | grep $mergeUrl` || $empty
# 查看缓存中是否已经存在mr记录
- echo "已经发送过通知的链接:${url}"
# 如果能够搜索到当前 mr url,则发送代码评审邀请通知并将当前mr的url加入缓存中,以免重复提交时重复发送通知,否则不发送
- if [ "${url}" == "" ]; then echo "当前mr请求未发送过通知,此处可以发送通知"; echo "$mergeUrl" >> $mridsFile; else echo "存在相同的 MR url,无需重复发送邀请:$url"; fi;
更多推荐
所有评论(0)