这几天接手了一个非常老的前端项目,由于代码仓库很大,所以Gitlab Pipeline跑的非常慢。
在这个项目里,里面有两个很关键的stage:
-
build-and-test
- 这个stage主要是用来跑我们的项目的单元测试和构建打包
-
sonar-qulaity-gate
- 这个阶段根据单元测试跑出来的覆盖报告,来生成本次merge request (MR)的新增代码测试覆盖率
由于这个项目非常庞大,build-and-test
大概要20分钟才能跑完,sonar-quality-gate
需要5分钟跑完。这么长的等待时间,如果没有提醒的话,日常工作又很繁杂,会很容易忘了去检查它的状态。
忘记检查状态会产生以下不好的结果:
-
gitlab pipeline失败了,提交的代码里面有错误。修复错误的时间被延后了
-
gitlab pipeline虽然成功了,但是因为我们没有及时把MR合并到主分支。而这个时候如果另一个同学先把他的MR合并进主分支,并且与我的代码产生了冲突,就增加了我额外的解决冲突的工作量。
-
如果遇到周期紧的排期,以上的额外工作会让自己产生巨大的心理压力。尤其对于像我这样已经有家庭的程序员,这不利于我们准点下班
说了这么多,问题的核心是pipeline跑的状态没有及时反馈。要解决这个问题,我想到了把企信机器人接入到pipeline中,及时返回状态,及时去解决潜在的问题。
要把企信机器人很好的接入到pipeline里面,主要有两个工作
-
写CLI命令行工具可以给企信发消息
-
在.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的状态了。终于又能轻松干完一天的活,准点下班了