最近利用空闲的服务器搭建了一个buildbot集群,需要在上面实现自动构建和自动测试,两者均涉及消息的推送。
buildbot可以通过email、http、IRC等方式进行消息的推送,但由于部署环境特殊以及出于安全方面的考虑,比较适合的方式是通过钉钉机器人推送构建信息。
关于buildbot的安装和部署,参见持续集成框架buildbot初探。钉钉机器人消息推送的详细设置参见文档。
具体推送消息的方式就是给如下链接发送一个HTTP POST请求,替换掉具体的access_token
即可。
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX
本文所关注的是Markdown消息类型,因此HTTP Body如下:
{
"msgtype": "markdown",
"markdown": {
"title": "消息标题",
"text": "消息内容"
}
}
这里选取的具体reporter就是HttpStatusPush
,主要的配置如下:
DINGTALK_URL = "https://oapi.dingtalk.com/robot/send?access_token="
dingtalk_reporter = reporters.HttpStatusPush(
serverUrl=DINGTALK_URL + DING_PUSH_TOKEN,
format_fn=formatter,
builders=builderLst
)
其中builderLst
是一个filter,用于从指定的builder中接收build
对象,formatter
用于生成HTTP Body,它的输入是build
对象,可以参考如下实现:
def body_format(b):
if b['complete'] is False:
return None
lines = [
'### CI Result\n',
'+ Builder: ' + b['builder']['name'],
'+ Result: ' + b['state_string'],
'+ Project: ' + b['buildset']['sourcestamps'][0]['project'],
'+ Branch: ' + b['buildset']['sourcestamps'][0]['branch'],
'+ Repository: ' + b['buildset']['sourcestamps'][0]['repository'],
'+ [Detail Page](' + b['url'] + ')',
]
body = {
"msgtype": "markdown",
"markdown": {
"title": "CI Report",
"text": '\n'.join(lines)
},
}
return body
HttpStatusPush
会在两个阶段进行消息推送,分别是开始构建
和结束构建
两个阶段:
- 在
开始构建
阶段:build
的complete
字段的值为False,我们不需要关注这个阶段的信息,因此直接返回None即可,并不会进行消息推送 - 在
结束构建
阶段:我们关心的值是builder
名称、构建结果、Project名称、分支名称、仓库信息以及具体的页面链接
注意,同一个builder可能同时收到多个source change,因此sourcestamps
可能存在多个元素,而本文的构建环境中,会避免这种情况,因此输出第1个元素的信息即可。
report是作为service的形式注册到buildbot中的,完成如下配置后,直接reconfig master就可让reporter生效了。
c['services'].append(dingtalk_reported)
Try it yourself!