「Jenkins Pipeline」- 通知构建结果 @20210127
问题描述
在 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 脚本进行消息发送。
参考文献
WikiNotes/通知构建结果
Let Jenkins Keep You Notified! (with the Instant Messaging Plugin)
Jenkins/Pages/Home/Plugins/Instant Messaging Plugin
IMAP IDLE - Wikipedia
Sending Notifications in Pipeline