在建置自動化測試時,當任務結束,通常會希望能夠發郵件通知開發者或是相關的夥伴們

Jenkins 內建提供了 Mail 套件讓使用者能直接在 Job Configuration 中做設置

後來發現套件提供的變化不夠我使用,所以就研究了下該如何自訂義更細節的內容


基本設置

先從基本的設置開始,先假設你或是你的 Jenkins 管理員已經 include Mail 套件

在要設置的 Jenkins Job 的 Configuration 中,在最下面的 “Add post-build action” 的 toggle menu 中找到 “Email Notification”

加入後就能夠開始設置簡單的 mail 通知

Recipients 是放入要接收 mail 的收件人信箱

Apply 後,每當任務完成就會送出 mail 到指定的信箱

但郵件內容很單純,就是成功或失敗,可以執行任務測試看看

如果要有更進階的資訊就需要另一個 mail 相關的區塊設置

Editable mail notification

一樣在 “Add post-build action” 找到設定加入

會看到以下預設設置

主要會用到的大概是

  • Project Recipient List: 收件人區塊
  • Content Type: 決定你的郵件內容格式是什麼,Plain text/HTML
  • Default Subject: 郵件標題
  • Default Content: 郵件內容
  • Attach Build Log

$ 符號變數代表的是 Jenkins 內部支援的環境變數
在 Build 區塊的 Execute bash command 上也有 Link 能參閱

所以我們可以利用環境變數來讓郵件內容有更多變化

比如郵件標題可以設為

1
[$JOB_BASE_NAME] - $BUILD_STATUS

郵件內容可以放

1
2
Build url: $BUILD_URL
Build log: $BUILD_LOG

如果更美化內容可以搭配將 Content Type 改成 HTML 的形式

1
2
3
<div>
<p>Build url: <a href="$BUILD_URL">$BUILD_URL</a></p>
</div>

但這樣還是限制於得用支援的環境變數,或是你事先設置好的環境變數,有時候我們會想要在程式進行的過程中就把一些重要資訊儲存下來,這時候要怎麼放到 Jenkins 上呢

Load File as content

在 Default Content 內可以放入以下指令將指定的 html 檔案讀入變成郵件內容

1
${FILE, path="<your-file-path>/<your-file>.html"}

file path

在 Configuration 中檔案 Root 位置就是 Jenkins Job 的 %WORKSAPCE%

假設你的 html 檔案放在 workspace 內的資料夾叫做 mail,那麼 path 就是 mail/<your-file>.html

由此可知,需要在 script 完成的時候輸出一個 html 檔案,讓 Jenkins 能讀入

透過這種方式就能自訂很多細部資訊,像是成功的話是何種狀態,或是失敗的話又是何種狀態的失敗,通常如果郵件是設給開發者群接收,都會比較想知道更多細節

Python template

直接在 Python 內直接建構 html 字串,然後打開檔案寫入字串,雖然可行,但會使程式碼變得很凌亂,會有太多 html codes 夾雜在內

可以考慮用 template 的方式,在 run time 傳入數值,動態改變指定檔案的數值
在想要動態改變的數值加上 {} 命名,然後讀檔近來,使用 format 做賦值

Example

phoneList.txt

1
2
3
<div>
<p>Name: {name}, Phone: {phone} </p>
</div>

Code snippets

1
2
3
4
5
6
7
with open('/phoneList.txt', 'r+') as f:
file_content = f.read()
update_file_content = file_content.format(name='wen', phone='123456789')

html_file = open("/mail-content-result.html", "w")
html_file.write(update_file_content)
html_file.close()

由於打雜的關係最近微微的接觸了些自動化的工作,一開始滿不上手的,因為沒弄過,而處理 Jenkins server 的同事還分處印度美國

嚴格來說算是被一個在 infra team 中的印度人雷了,最後我自己要到 Job & Machine 的權限搞通了 Jenkins,往好處想也算是學到了一點新技能,壞處就是因此滑了幾天的時間,中間都在等待他

這一點算是學到教訓了,假如你感覺到對方其實不太幫你,而你也盡力 push 甚至一起討論怎麼做,但過了兩三天還是無果,就該 assign 給那個 team 的其他人,而不是自己先扛幫他做了他該做的工作,畢竟這是職場,不需要害怕或同情別人,就事論事才對