將 Jenkins Job 的歷史結果整理出視覺化的 Daily Report mail (一)
當初在處理這個問題的時候,大部分都是參考國外的網站,使用 Jenkins 內建功能送 email 的文章很多,但是像是要自訂 mail 內容,蒐集統整不同 Job 的狀態以及包含視覺化報表的部分倒是很少看到,所以就做個紀錄與分享,一方面也是拋轉引玉,歡迎交流。
這裡的做法受限於 "Free-Style" 形式的 Jenkins Job,所以過程會比較繁瑣;但是換句話說,如果只想用 "Free-Style" 形式來創建 Jenkins Job,可以從這篇文章得到一些靈感。
這個主題為了盡量寫得詳細點,會分成三個部分:
首先,本篇會說明以下主題:
這裡的做法受限於 "Free-Style" 形式的 Jenkins Job,所以過程會比較繁瑣;但是換句話說,如果只想用 "Free-Style" 形式來創建 Jenkins Job,可以從這篇文章得到一些靈感。
這個主題為了盡量寫得詳細點,會分成三個部分:
- Jenkins Daily Report Job 的相關設定。( 本篇 )
- 使用 Python/Pandas/matplotlib 做資料分析及處理。
- 說明使用 jelly script 來客製化郵件內容。
首先,本篇會說明以下主題:
- 設定 Jenkins 郵件相關 (gmail) SMTP 設定
- 需要安裝的 Jenkins Plugin
- 新增/設定一個 Jenkins "Daily Report" Job
這個系列沒有說明的部分如下: (我想這些在網路上應該都很容易可以找到相關資料)
因為後面我們要使用的是 Email Extension 這個功能及彈性較大的 plugin,因此也要做 SMTP 的設定,前面應該已經藉由"寄測試信"確定設定是正確的了,這邊就把相關設定填上就好。如下圖。
- 安裝 Jenkins
- 設定 slave node,並在 slave node 上執行 Jenkins Job
設定 Jenkins 郵件相關 SMTP 設定
讓 Jenkins 寄出郵件需要設定 SMTP server,這邊以使用 gmail SMTP為範例。
詳細設定如下圖,設定完成可以勾選"寄測試信",先試試看設定是否正確。
如果看到 "電子郵件成功寄出"就代表設定正確了。
如果看到 "電子郵件成功寄出"就代表設定正確了。
已知目前 google 認為 Jenkins Plugin登入SMTP的方式安全性較低,使用者必須要自行 "啟用安全性較低的應用程式存取權",可以到這個網址做更改。我想未來 plugin 更新之後應該就不會有這個問題,這裡就不多著墨了。
因為後面我們要使用的是 Email Extension 這個功能及彈性較大的 plugin,因此也要做 SMTP 的設定,前面應該已經藉由"寄測試信"確定設定是正確的了,這邊就把相關設定填上就好。如下圖。
需要安裝的 Jenkins Plugin
接下來,先說明一下需要用到的 Jenkins Plugin,
- 因為使用 "Free-Style" Job,為了方便讓其他 Job trigger "Daily Report" job,可以把 Job 需要的參數放在檔案裡,然後使用 EnvInject Plugin 來讀進相關參數。( 後文為了讓 jelly script 寫起來簡單一點,還會用來把格式化後的資料放到環境變數。)
- 若要指定在哪個 Slave Node 上執行 Job,可以安裝 NodeLabel Parameter Plugin,然後在"參數化建置" 裡面新增一個 Node參數用來指定執行 Job 的 Node。
- user build vars 非必要,但是可以用來取得 user name,依照不同情境應該會有需要。
新增一個 Jenkins "Daily Report" Job
現在 Jenkins server 已經有能力可以寄發郵件,接下來我們要新增一個 Jenkins "Free-style" Job (後文將此自訂的 Job 都稱之為 DailyReport Job) 來負責 :
接下來開始設定這個 Daily Report Job。
首先使用自訂工作區,這樣在 Jenkins Job 內設定的相對路徑都會在工作區裡面,要避免把資料放在 Jenkins 安裝目錄下。
然後我們幫這個 Job 新增一個字串參數 JOB_PROP,用來指定/傳遞Job 參數的檔案路徑。如果要指定執行 Job 的 Slave Node,就一併新增一個 Node 參數。
這樣 Jenkins Job 設定的部分就全部完成了,接下來,第二篇會說明 daily_report.py 的實作 (包含 pandas/matplotlib 的使用),第三篇會說明 jelly script 的實作。
- 在 Slave Node 執行一個 Python script 去讀取之前記錄在 csv 檔案內的 Job Status,並生成視覺化圖表
- 執行 jelly script 來產生郵件內容
- Jenkins server 送出郵件
接下來開始設定這個 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 會做以下工作:
最後,在 "建置後動作" 中選取 "可編式電子郵件通知",在專案收件人清單中加上 $DAILY_REPORT_MAIL_TO,讓我們可以自訂收件人,而不用更改 Job config。然後把 "預設內容" 改成執行 jelly script,如下圖。
在 daily_report.py 裡面,我們會把 REPORT_TAG 這個參數 ( 用來記錄及辨識此次 report 的標籤 ) 寫到 daily-report.prop 檔案裏面,所以執行完 python script 之後,要把 daily-report.prop inject 一次。
daily_report.py 會做以下工作:
- 統計上游 Job Result 的資料
- 產生視覺化圖表
- 產生 mail 需要的格式化資料 ( 儲存在 ${REPORT_TAG}.csv.prop 然後同樣 inject 成 environment variable 以便 jelly script 使用,如下圖 )
這樣 Jenkins Job 設定的部分就全部完成了,接下來,第二篇會說明 daily_report.py 的實作 (包含 pandas/matplotlib 的使用),第三篇會說明 jelly script 的實作。
留言
張貼留言