問題描述
在 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