用企信消息来缓解等待Gitlab Pipeline构建的焦虑

1,112 阅读3分钟

这几天接手了一个非常老的前端项目,由于代码仓库很大,所以Gitlab Pipeline跑的非常慢。

在这个项目里,里面有两个很关键的stage:

  • build-and-test

    • 这个stage主要是用来跑我们的项目的单元测试和构建打包
  • sonar-qulaity-gate

    • 这个阶段根据单元测试跑出来的覆盖报告,来生成本次merge request (MR)的新增代码测试覆盖率

由于这个项目非常庞大,build-and-test大概要20分钟才能跑完,sonar-quality-gate需要5分钟跑完。这么长的等待时间,如果没有提醒的话,日常工作又很繁杂,会很容易忘了去检查它的状态。

忘记检查状态会产生以下不好的结果:

  1. gitlab pipeline失败了,提交的代码里面有错误。修复错误的时间被延后了

  2. gitlab pipeline虽然成功了,但是因为我们没有及时把MR合并到主分支。而这个时候如果另一个同学先把他的MR合并进主分支,并且与我的代码产生了冲突,就增加了我额外的解决冲突的工作量。

  3. 如果遇到周期紧的排期,以上的额外工作会让自己产生巨大的心理压力。尤其对于像我这样已经有家庭的程序员,这不利于我们准点下班

说了这么多,问题的核心是pipeline跑的状态没有及时反馈。要解决这个问题,我想到了把企信机器人接入到pipeline中,及时返回状态,及时去解决潜在的问题。

要把企信机器人很好的接入到pipeline里面,主要有两个工作

  1. 写CLI命令行工具可以给企信发消息

  2. 在.gitlab-ci.yml文件中添加job

下面我和大家分享一下我针对这两点的详细工作

写CLI命令行工具可以给企信发消息

#wechat-bot notify -h
#notify the author through wechat bot when pipeline status changed

Options:
  --type <config>     message type
  --message <config>  message
  -h, --help          display help for command

首先我开发了一个名叫wechat-bot的命令行,通过传入对应的参数就可以向企信发送消息 以下是具体代码的一个片段

const mrUrl = `https://gitlab.com/${process.env.CI_PROJECT_PATH}/-/merge_requests/${process.env.CI_MERGE_REQUEST_IID}` 

axios({
    method: 'post',
    url: WECHAT_BOT_URL,
    data: {
        msgtype: "text",
        text: {
          content: `
              MR: ${mrUrl},
              message: ${message}
          `,
          mentioned_list: [EMAIL_WECHAT_ID_MAP[
            process.env.CI_MERGE_REQUEST_AUTHOR_EMAIL
          ]],
        },
      } 
})

譬如wechat-bot notify --type build-test-failure --message "build and test failed", 这个命令行就可以把错误消息发到企信,并且能@到对应的同学,并附上MR链接

在.gitlab-ci.yml文件中添加job

增加build-and-test-notify和sonar-quality-gate-notify两个stage。新的stages顺序如下

stages:
    - build-and-test
    - build-and-test-notify
    - sonar-quality-gate
    - sonar-quality-gate-notify

在这个两个新增的stage下面各准备两个job,根据上一阶段成功与否,来发出对应的通知消息。如下所示

build-test-notify-success:
  stage: build-and-test-notify
  only:
    - merge_requests
  script:
    - wechat-bot notify --type success --message "Build and test success"
  when: on_success

build-test-notify-failure:
  stage: build-and-test-notify
  only:
    - merge_requests
  script:
    - wechat-bot notify --type failure --message "Build and test failed"
  when: on_failure
  
  
  
sonar-notify-success:
  stage: sonar-quality-gate-notify
  only:
    - merge_requests
  script:
    - wechat-bot notify --type success --message "Sonar quality gate success"
  when: on_success

sonar-notify-failure:
  stage: sonar-quality-gate-notify
  only:
    - merge_requests 
  script:
    - wechat-bot notify --type failure --message "Sonar quality gate failed"
  when: on_failure

这里最主要的是用了when: on_failure 通常gitlab的一个stage里有job失败了,下一个阶段的job是不被触发的。但是有了when: on_failure这个条件的job, 仍然会被执行。

最后

有了企信的通知,我可以及时得到反馈,及时去解决问题。我工作的焦虑下降了,可以聚焦真正到工作中,不需要担心忘了检查pipeline的状态了。终于又能轻松干完一天的活,准点下班了