「Jenkins Pipeline」- 通知构建结果

更新日期:2019年08月27日

问题描述

在 Jenkins (Pipeline) 中,我们可以通过设置邮件,来通知构建结果。

但是邮件通知较慢,这是因为:邮件客户端以定时查收(轮询)的方式收取邮件;即使服务端支持 IDLE 命令,由于客户端的实现不同,也不能保证立刻收到消息;

我们希望在构建结束时,“立刻”收到通知,这可以使用即时通讯工具。

该笔记将记录:在 Jenkins Pipeline 中,如何发送即时消息(IM)通知。

方法一、使用邮件通知(Email)

虽然邮件通知较慢,但是我们依旧保留邮件通知方法,作为归档。如下为使用方法:
1)在 Manage Jenkins / Configure System / Extended E-mail Notification 中,设置邮箱帐号信息;
2)如下为在 Jenkins Pipeline 中,使用邮件通知的方法:

mail(
    to: "tony@example.com,mary@example.com,tom@example.com", 
    subject: "// 邮件标题", 
    body: "// 邮件内容"
)

参考 Pipeline: Basic Steps / mail: Mail 文档获取详细使用方法。

方法二、通过 Web API 发送即时消息

使用即时通讯软件,比如企业微信、钉钉,提供的 Web API接口发送消息。这也是我们更倾向的方法,灵活且无需担心插件更新问题。

企业微信(WXWork)

方法一、通过创建应用。该方法分为以下几个步骤:
1)添加小程序
2)获取ACCESS_TOKEN凭证。参考官方「获取access_token」文档。
3)发送消息。参考官方「文本消息」文档。调用接口发送消息即可。

方法二、创建群机器人。该方法分为以下几个步骤:
1)创建群组;
2)添加群机器人;
3)调用接口发送消息;

我们使用方法二,因为更加简单,且能满足需求(但是无法推送给特定的用户)。

钉钉(DingTalk)

有着与「企业微信」相同的两种方式。

但是「添加应用」更加复杂,比如需要 IP 白名单,否则无法发送消息。也就是说,如果没有公网服务器,想要推送提醒的话,只能使用群机器人进行通知。

方法三、通过 Plugins 发送即时消息

在 Jenkins 中,还可以使用扩展来发送即时消息。通过安装扩展,并使用其提供的 Pipeline Steps 进行消息发送操作。目前(08/27/2019)支持 Skype、GCM Notification、IRC、Jabber 这四种即时通讯工具,当然「企业微信」与「钉钉」也有相应的插件(版本可能较旧)。使用这些即时通讯扩展,会自动安装 instant-messaging 依赖,然后再安装对应的插件,比如「Jabber (XMPP) notifier and control」插件。

这里仅介绍我们使用到的插件,参考官方文档获取插件的详细介绍。

发送 IRC 通知

插件地址:IRC | Jenkins plugin
仓库地址:jenkinsci/ircbot-plugin: Jenkins ircbot plugin

第一步、安装插件:在 Manage Jenkins / Manage Plugins / Available 中,安装 IRC 扩展。

第二步、修改配置:在 Manage Jenkins / Configure System / IRC Notification 中,添加 Channel 信息。
关于在 IRC 中 创建 Channel 、密码设置,参考 Channel with Password 笔记。

第三步、发送通知:在 Jenkins Pipeline 中,使用 Step 发送通知。如下程序示例:

pipeline {
    agent any
    stages {
        stage('# 构建开始') {
            steps {
        		ircNotify targets: "JenkinsBot #k4nz.team.d3rm.org", customMessage: "Hello from IRCBot\nAAAAAAAAAAAAAAAAAAAAA"
            }
        }
    }
}

我们的选择(场景不同,方案不同)

我们的博客是 Jenkins Pipeline 构建发布的,在构建结束之后,是没有通知的。现在要加上通知。有以下选择:

方案 是否采用 为选择用原因
Skype   太旧
GCM Notification   国内网络环境不允许
Jabber   不支持在Pipeline中使用,还处于开发阶段(08/27/2019)。
IRC 可以考虑 倒是可以,但是密码明文,在国内也不通用,还要搭建自己的服务。(还有其他更好的方案)
     
企业微信的Jenkins Pipeline插件   插件版本旧,不够灵活,而且有更好的方案,Web API,可以解决这个问题。
企业微信Web API接口 - 群机器人 可以考虑 这是一个不错的方案,灵活,可定义,可实现各种功能。没有采用的原因是公司采用了企业微信,我的企业微信又是另外一个组织,手机切换组织后,电脑端也切换了。
企业微信Web API接口 - 自建应用 可以考虑 与「群机器人」的方法类似,但是可能稍微复杂一点,但是更加灵活。没有采用的原因与上一个原因一致。
     
钉钉的Jenkins Pipeline插件   插件版本旧,不够灵活,而且有更好的方案,Web API,可以解决这个问题。
钉钉的Web API接口 - 自建应用 可以考虑 与企业微信的自建应用是类似的,但是这个需要IP白名单,否则无法调用接口。而Jenkins不再公网服务器上,所以不能采用这个方案。
钉钉的Web API接口 - 群机器人 最终方案 只需要一个Web Hook地址,没有IP白名单,可以解决问题。一分钟只能推送20次,足够了。

注意:标为“可以考虑”的方案,在日后的工作中可以考虑使用。

补充:在普通作业中,发送通知

使用插件发送

安装插件,然后在 Job 页面中进行配置即可。

使用脚本调用接口

在构建的过程中,可以执行 Shell 脚本进行消息发送。

参考文献

Let Jenkins Keep You Notified! (with the Instant Messaging Plugin)
Jenkins/Pages/Home/Plugins/Instant Messaging Plugin
IMAP IDLE - Wikipedia
Sending Notifications in Pipeline


ToC

问题描述

方法一、使用邮件通知(Email)

方法二、通过 Web API 发送即时消息

企业微信(WXWork)

钉钉(DingTalk)

方法三、通过 Plugins 发送即时消息

发送 IRC 通知

我们的选择(场景不同,方案不同)

补充:在普通作业中,发送通知

使用插件发送

使用脚本调用接口

参考文献