「Jenkins Pipeline」- 发送构建结果通知 @20210304

语言: CN / TW / HK

问题描述

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

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

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

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

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

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

mail(
    to: "[email protected],[email protected],[email protected]",
    subject: "// 邮件标题",
    body: "// 邮件内容"
)

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

方法二、通过接口通知(Web API)

很多 IM 应用(即时通讯软件),比如企业微信、钉钉、Slack,提供的 Web API 接口来发送消息。这也是我们更倾向的方法,灵活且无需担心插件更新问题。当然,这也需要我们进行简单的开发,通常仅需要使用 httpRequest 调用发送接口。

企业微信(WXWork)

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

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

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

钉钉(DingTalk)

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

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

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

在 Jenkins Pipeline 中,使用扩展来发送即时消息,更为简便。通过安装这些扩展,并使用其提供的 Pipeline Steps 进行消息发送操作,比调用 Web API 更加简单易用。

比如 Slack Notification Slack 集成。在构建结束后,我们的 Slack Channel 会立即收到构建结果。

目前(08/27/2019),支持以下两大类型的即时消息通知扩展:
1)基于 instant-messaging 扩展的 Skype、GCM Notification、IRC、Jabber 等等即时通讯工具。
2)以及 企业微信钉钉Slack Notification 等等,自行实现的扩展。

参考官方文档,以获取插件的详细介绍,比如 Jabber (XMPP) notifier and control 插件。

这里将介绍我们使用到的插件:
1)发送 IRC 通知:IRC Notification
2)发送 Slack 通知:Slack Notification

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

我们的博客是 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 脚本进行消息发送。

相关文章

「Jenkins Pipeline」- 常用 JSON 操作
「Jenkins Pipeline」- 放弃当前构建
「Jenkins Pipeline」- SSH
「Jenkins Pipeline」- 发送 Slack 通知
「Jenkins Pipeline」- 在构建过程中,提示用户输入
「Jenkins Pipeline」- 凭证的处理
「Jenkins Pipeline」- 集成 Selenium 测试

参考文献

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

分享到: