將 Jenkins Job 的歷史結果整理出視覺化的 Daily Report mail (一)

當初在處理這個問題的時候,大部分都是參考國外的網站,使用 Jenkins 內建功能送 email 的文章很多,但是像是要自訂 mail 內容,蒐集統整不同 Job 的狀態以及包含視覺化報表的部分倒是很少看到,所以就做個紀錄與分享,一方面也是拋轉引玉,歡迎交流。

這裡的做法受限於 "Free-Style" 形式的 Jenkins Job,所以過程會比較繁瑣;但是換句話說,如果只想用 "Free-Style" 形式來創建 Jenkins Job,可以從這篇文章得到一些靈感。

這個主題為了盡量寫得詳細點,會分成三個部分:
  1. Jenkins Daily Report Job 的相關設定。( 本篇 )
  2. 使用 Python/Pandas/matplotlib 做資料分析及處理
  3. 說明使用 jelly script 來客製化郵件內容
最後目標是每天自動送出視覺化統計 Jenkins Job 歷史狀態的 email,如下圖。
首先,本篇會說明以下主題:
  1. 設定 Jenkins 郵件相關 (gmail) SMTP 設定
  2. 需要安裝的 Jenkins Plugin
  3. 新增/設定一個 Jenkins "Daily Report" Job
這個系列沒有說明的部分如下: (我想這些在網路上應該都很容易可以找到相關資料)
  1. 安裝 Jenkins
  2. 設定 slave node,並在 slave node 上執行 Jenkins Job

設定 Jenkins 郵件相關 SMTP 設定

讓 Jenkins 寄出郵件需要設定 SMTP server,這邊以使用 gmail SMTP為範例。
Jenkins mail 設定在 "管理 Jenkins" => "設定系統"  http://localhost:8080/configure

詳細設定如下圖,設定完成可以勾選"寄測試信",先試試看設定是否正確。
如果看到 "電子郵件成功寄出"就代表設定正確了。
已知目前 google 認為 Jenkins Plugin登入SMTP的方式安全性較低,使用者必須要自行 "啟用安全性較低的應用程式存取權",可以到這個網址做更改。我想未來 plugin 更新之後應該就不會有這個問題,這裡就不多著墨了。


因為後面我們要使用的是 Email Extension 這個功能及彈性較大的 plugin,因此也要做 SMTP 的設定,前面應該已經藉由"寄測試信"確定設定是正確的了,這邊就把相關設定填上就好。如下圖。

需要安裝的 Jenkins Plugin

接下來,先說明一下需要用到的 Jenkins Plugin,

  1. 因為使用 "Free-Style" Job,為了方便讓其他 Job trigger "Daily Report" job,可以把 Job 需要的參數放在檔案裡,然後使用 EnvInject Plugin 來讀進相關參數。( 後文為了讓 jelly script 寫起來簡單一點,還會用來把格式化後的資料放到環境變數。)
  2. 若要指定在哪個 Slave Node 上執行 Job,可以安裝 NodeLabel Parameter Plugin,然後在"參數化建置" 裡面新增一個 Node參數用來指定執行 Job 的 Node。
  3. user build vars 非必要,但是可以用來取得 user name,依照不同情境應該會有需要。

新增一個 Jenkins "Daily Report" Job

現在 Jenkins server 已經有能力可以寄發郵件,接下來我們要新增一個 Jenkins "Free-style" Job (後文將此自訂的 Job 都稱之為 DailyReport Job) 來負責 :
  1. 在 Slave Node 執行一個 Python script 去讀取之前記錄在 csv 檔案內的 Job Status,並生成視覺化圖表
  2. 執行 jelly script 來產生郵件內容
  3. Jenkins server 送出郵件
這裡假設需要的上游 Job Result/History 已經存在 csv 檔案內,Job Result 可以透過 Jenkins API 取得 (可參考這篇),當然也可以存在資料庫,用 csv 只是因為資料量不大且方便說明。

接下來開始設定這個 Daily Report Job。

首先使用自訂工作區,這樣在 Jenkins Job 內設定的相對路徑都會在工作區裡面,要避免把資料放在 Jenkins 安裝目錄下。



然後我們幫這個 Job 新增一個字串參數 JOB_PROP,用來指定/傳遞Job 參數的檔案路徑。如果要指定執行 Job 的 Slave Node,就一併新增一個 Node 參數。

接下來把這個 JOB_PROP 指定的檔案內容用 EnvInject 的功能,Inject 成這個 Job 的環境變數。然後再呼叫 daily_report.bat,去執行 daily_report.py,就可以從 daily_report.py 裡面讀取到相關的環境變數 (Job 參數)。如下圖。

在 daily_report.py 裡面,我們會把 REPORT_TAG 這個參數 ( 用來記錄及辨識此次 report 的標籤 ) 寫到 daily-report.prop 檔案裏面,所以執行完 python script 之後,要把 daily-report.prop inject 一次。

daily_report.py 會做以下工作:
  1. 統計上游 Job Result 的資料
  2. 產生視覺化圖表
  3. 產生 mail 需要的格式化資料 ( 儲存在 ${REPORT_TAG}.csv.prop 然後同樣 inject 成 environment variable 以便 jelly script 使用,如下圖 )

最後,在 "建置後動作" 中選取 "可編式電子郵件通知",在專案收件人清單中加上 $DAILY_REPORT_MAIL_TO,讓我們可以自訂收件人,而不用更改 Job config。然後把 "預設內容" 改成執行 jelly script,如下圖。


這樣 Jenkins Job 設定的部分就全部完成了,接下來,第二篇會說明 daily_report.py 的實作 (包含 pandas/matplotlib 的使用),第三篇會說明 jelly script 的實作。

留言

這個網誌中的熱門文章

以樂透為例,用Python統計馬可夫矩陣

如何用 Jenkins API 取得 Job Build Result