gitlab 创建 merge-request 时执行作业

背景

为了项目代码更加健壮,避免一些低级错误以及有一些业务不了解而导致的问题,我们每个需求上线之前都需要邀请其他同学进行代码评审,然而每次都要手动在群里面邀请其他同学未免有一些麻烦了,因此,想要使用CI工具,在创建merge-request请求时自动发送代码评审邀请。

遇到的问题

目前gitlab中的事件触发merge_requests不仅仅在创建merge-request时会触发,我们每次推送更改到已经提过merge-request的源分支时,都会触发改工作,导致我们每次推送都会发送一次邀请通知。这也太扰民了。我们期望的行为是:

  • merge-request创建时触发作业,获取合并请求相关信息,发送代码评审通知
  • 已经发送过代码评审通知的merge-request的源分支提交更改时不会重复触发作业发送通知。

解决方案

我们是否可以将已经发送过邀请通知的merge-request链接保存起来,如果下次再触发该工作时,发现该merge-request链接已经发送过通知了,我们就不再重复发送了。因此,这边想到了利用缓存的方式解决这个问题:

  1. 当首次创建merge-request时,我们的缓存中不存在当前merge-request的链接,则直接发送通知,然后将当前merge-request的url保存到缓存当中。

  2. 当我们推送更改到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;

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐