天天看點

Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器

Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器
Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器
Jenkins允許使用者完成所有這些操作的一個關鍵方法就是使用流水線共享庫(pipeline share library)。共享流水線庫是由存儲在代碼倉庫中的代碼組成的,該代碼倉庫由Jenkins自動下載下傳并可供流水線使用。

1、需求引入

随着 DevOps 理念在公司越來越多的實踐,Jenkins 等工具的應用場景越來越多,當我們在執行完成某個流水線任務後,常常需要關注的是這個任務為什麼執行,執行成功與否等等。

于是就需要在執行完流水線後進行一定程度的消息推送,在現今的工作流中消息推送無外乎分為兩大類:郵件和企業溝通協作軟體,相比之下,我們可能更多的會去關注和使用溝通軟體來發送消息而不是通過郵件的方式。而常用的企業溝通協作軟體有以下幾類:騰訊系的企業微信、阿裡系的釘釘、位元組跳動的飛書等等,當然有能力的企業也會自己研發這類軟體。 本文示例以釘釘為例,通過流水線共享庫實作自定義消息通知器。

2、釘釘機器人

釘釘的群機器人是釘釘群的進階擴充功能。群機器人可以将第三方服務的資訊聚合到群聊中,實作自動化的資訊同步。例如:通過聚合

GitHub

GitLab

等源碼管理服務,實作源碼更新同步;通過聚合

Trello

JIRA

等項目協調服務,實作項目資訊同步。不僅如此,群機器人支援

Webhook

協定的自定義接入,支援更多可能性。 自定義釘釘機器人支援以下類型消息類型資料格式的推送,更多定義方法可參考官方的接口文檔:

  • text類型
  • markdown類型
  • 整體跳轉ActionCard類型
  • 獨立跳轉ActionCard類型
  • FeedCard類型

釘釘機器人在2019年的下半年進行過更新,在新增機器人時,需要選擇一種安全條件(自定義關鍵詞、加簽、ip位址或ip位址段)來保障自定義機器人的安全。可以了解為即使機器人的token洩漏,如果不知道設定的安全條件是什麼,還是無法盜用的。

3、Jenkins 消息推送插件

這裡要提到的是在 Jenkins 插件清單中有一個釘釘插件。 簡單對此插件做了下分析:截止目前此插件在2020年1月份有相應代碼送出,并且釋出了2.0版本,從jenkins的插件官網中可以看到此版本的插件在在消息中支援了更多内容,效果如下,但是此插件目前還暫不支援流水線中使用

Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器

在此之前的上一版本送出記錄已經是2018年了,此插件使用方法類似,推送的消息效果如下

Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器

此版本支援在流水線中使用,相應内容如下 如上所示,在流水線腳本中配置釘釘機器人token、圖檔路徑、jenkins位址、消息内容、要提醒的人手機号碼即可,可以發現,此消息還是有局限性,不夠友好。 是以在沒有編寫插件能力的情況下,我們可以通過更為靈活的自定義流水線共享庫的形式,并且按照釘釘機器人的官方接口文檔,自定義一個消息推送通知器。

4、自定義通知器的實作

4.1、内容定義

無論 Jenkins 任務的建構觸發原因是使用者手動建構或通過代碼推送的自動觸發,往往關注此消息的人群是開發者們。是以通過一段時間的需求調研以及綜合各方的建議,最終将消息推送的内容中包含了以下資訊:

  • 應用名稱
  • 建構結果
  • 目前版本
  • 建構發起
  • 持續時間
  • 建構日志
  • 更新記錄(包含使用者送出的短日志,使用者名稱,送出時間)

每次建構結果通知中包含了以上就基本完備。

4.2、共享庫建立

本文不過多介紹共享庫具體的建立與在pipeline流水線中的引用方法,整體來說,共享庫的代碼目錄結構如下

官方描述:

  • src

    目錄應該看起來像标準的Java源目錄結構。當執行流水線時,該目錄被添加到類路徑下。
  • vars

    目錄定義可從流水線通路的全局變量的腳本。每個 .groovy檔案的基名應該是一個Groovy (~ Java)辨別符, 通常是camelCased。比對.txt,如果存在, 可以包含文檔, 通過系統的配置标記格式化從處理 (是以可能是HTML, Markdown等,雖然txt擴充是必需的)。

這些目錄中的Groovy源檔案 在腳本化流水線中的CPS transformation一樣。

resources目錄允許從外部庫中使用 libraryResource 步驟來加載有關的非 Groovy 檔案。目前,内部庫不支援該特性。

根目錄下的其他目錄被保留下來以便于将來的增強。

4.3、方法的具體實作

定義共享庫中src/org/devops目錄為共享庫方法的主目錄,在這個目錄下建立一個名為dingmes.groovy的檔案作為釘釘消息推送方法的代碼檔案。

建構一個消息通知器的主要思路:

  • 消息名額内容從哪來
  • 消息模闆如何定義
  • 消息怎麼發送,發到哪裡

4.3.1、消息來源

首先,消息内容從哪來,上面提到的需要在消息中展現的每個名額的可取的擷取方式

Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器
  • 分析:

    本文中的共享庫用于 Jenkins+k8s 自動化ci測試環境,是以某些名額的定義方法為:

    應用名稱自定義,用變量給出,在pipeline前文定義全局變量,在這裡傳入變量即可

    目前版本自定義,以代碼分支+commitid作為docker鏡像的tag,在pipeline前文中實作或亦通過共享庫實作,在這裡傳入變量即可

    更新記錄根據全局變量擷取,在這裡通過代碼實作

較為複雜的是如何解讀 currentBuild.changeSet 這個全局變量,通過 Jenkins 上的全局變量清單文檔檢視如下

Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器

點選其中的連結檢視官方文檔

Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器

通過進一步檢視官方文檔得知,currentBuild.changeSet傳回的是一個集合,這個集合中包含了送出日志,commitid,作者id,作者全稱,時間戳等資訊,具體對象相關屬性如下

currentBuild.changeSets{
    items[{
        msg //送出注釋
        commitId //送出hash值
        author{ //送出使用者相關資訊
            id
            fullName
        }
        timestamp
        affectedFiles[{ //受影響的檔案清單
            editType{
                name
            }
            path: "path"
        }]
        affectedPaths[// 受影響的目錄,是個Collection
            "path-a","path-b"
        ]
    }]
}
           

是以,可以通過循環周遊得出我們需要的相關屬性值,通過

groovy

腳本定義方法并傳回相應字元串,其中為了更優化,需要對送出日志做一下長度限制,對時間戳進行格式化,這兩個功能需要不斷調試。其中

changeString

變量的指派格式定義為markdown的無序清單,最終方法如下

4.3.2、消息模闆定義

消息中的相關字段都擷取到了,下一步需要做的就是定義一個消息模闆,如果使用郵件發送通知,同樣的也需要定義一個模闆。

這裡使用更為友好的markdown格式來發送通知,釘釘機器人接口接收的消息是json格式,具體内容可以通過檢視官方文檔,為了避免換行出錯,手動指定換行符,最終的json格式資料和markdown格式模闆如下

4.3.3、消息發送方法

在流水線中按照消息模闆渲染好的消息發送給釘釘的接口位址,可以實作的方法包括但不限于以下幾種:

  • 通過執行shell指令發送,例如curl指令指定參數即可,最為簡單,但不夠友好
  • 通過pipeline文法和插件實作,例如使用HTTP Request插件,在Jenkins pipeline中發送HTTP請求給釘釘接口。
  • 通過調用其他腳本發送,例如python腳本,較複雜,不推薦。

綜上比較,選擇一種友好且不複雜的方案,即通過pipeline文法和插件實作

首先在插件安裝中安裝好HTTP Request插件,打開文法片段生成器檢視對應文法

Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器

雖然參數有些多,但是隻有url是必需的,其他參數都是可選的。這裡我們傳入請求内容以及url,并省去其他不必要的參數,如下

4.3.4、最終方法

綜上所述,在調用此共享庫方法時傳入應用名稱變量AppName、應用版本(鏡像tag)變量ImageTag、建構狀态變量Status、以及在pipeline前文中實作的異常資訊捕捉變量CatchInfo,并結合前面實作的方法内容,最終方法dingmes.groovy内容如下

4.4、方法調用

此消息通知的方法通常在pipeline的post部分調用,如下所示

4.5、最終效果

測試代碼送出,執行流水線,最終的消息通知效果如下圖

Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器

5、總結

至此,本文記錄通過自定義 Jenkins Pipeline 流水線共享庫方法,實作了較為靈活的自定義釘釘機器人消息通知。如果是使用企信等其他軟體,與此實作思路相近。

參考:https://jenkins.io/doc/book/pipeline/shared-libraries/

原文連結:https://www.ssgeek.com/post/jenkinssharelibrary-shi-jian-zhi-zi-ding-yi-tong-zhi-qi/

送您福利

GNSEC 2020 線上峰會!

  2020.6.19  

不可錯過的行業峰會!

Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器

近期好文:

告别打雜!如何實作測試開發能力的快速提升?| 茹炳晟專訪

DevOps 實施中的10個“深坑”,你一定要警惕

非法擷取“抖音” 177 萬資料某95後被判6年;潘石屹首次 Python 考試成績99分 | 一周 IT 資訊

“DevOps 時代”公衆号誠邀廣大技術人員投稿, 投稿郵箱:[email protected],或添加聯系人微信:greatops1118. 點選

Jenkins 流水線 擷取git 分支清單_基于 Jenkins 共享庫實踐之自定義通知器

點個“在看”,少個“bug”

繼續閱讀