buildbot reporter对接钉钉机器人

最近利用空闲的服务器搭建了一个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会在两个阶段进行消息推送,分别是开始构建结束构建两个阶段:

  • 开始构建阶段:buildcomplete字段的值为False,我们不需要关注这个阶段的信息,因此直接返回None即可,并不会进行消息推送
  • 结束构建阶段:我们关心的值是builder名称、构建结果、Project名称、分支名称、仓库信息以及具体的页面链接

注意,同一个builder可能同时收到多个source change,因此sourcestamps可能存在多个元素,而本文的构建环境中,会避免这种情况,因此输出第1个元素的信息即可。

report是作为service的形式注册到buildbot中的,完成如下配置后,直接reconfig master就可让reporter生效了。

c['services'].append(dingtalk_reported)

Try it yourself!

说两句: