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

為了寄出統整 Jenkins 上游 Job 的 daily report mail,第一篇說明了 Jenkins Daily Report Job 的設定,第二篇說明了如何用 Python script 統計 Job result 以及產生視覺化的圖表。本篇說明如何用 jelly script 產生 html 格式的 mail,email 裡面除了顯示第二篇文章中產生的視覺畫圖表之外,也會包含前一天每個小時的 Job 結果,如下圖:

Email-exit Plugin 會預設 jelly script 的位置在 $JENKINS_HOME/email-templates 目錄底下,但是安裝完畢時並沒有這個目錄,也就是說要自己在 Jenkins 安裝目錄下新建一個 email-templates 的 folder,然後把 jelly scripts 放在這個 folder 之下,以我們的例子來說就是 load-monitor-dailyreport.jelly
詳細說明可以參考 Email-ext plugin 的網頁。

這裡可以找到一些 email-ext 提供的 jelly script 的範例,建議要快速上手,可以 copy 一個來改,ex: html.jelly。這個 html.jelly script 預設會包含 change set, maven, junit 等相關的內容,但是因為我們的上游 Job 都是自訂的,因此需要自己修改 script 內容,後文只說明與 daily report 有關的部分。

Jelly Script 的架構如下,後續說明主要都是 BODY 裡面的內容。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?jelly escape-by-default='true'?>
<!DOCTYPE html [
    <!ENTITY nbsp "&#38;#38;nbsp&#59;">
]>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define">

<STYLE>
...
</STYLE>
<BODY>

<!-- GENERAL INFO -->

</BODY>
</j:jelly>

一開始先讀取相關的環境變數
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<j:set var="buildenv" value="${build.getEnvironment(listener)}" />
<j:set var="testHost" value="${buildenv.get('COMPUTERNAME')}" />
<j:set var="jobName" value="${buildenv.get('MY_JOB_NAME')}" />
<j:set var="reportTag" value="${buildenv.get('REPORT_TAG')}" />

<TABLE>
  <TR><TD class="bg1" colspan="2"><B>Project Information</B></TD></TR>
  <TR><TD>Job:</TD><TD>${jobName}</TD></TR>
</TABLE>
<BR/>

顯示視覺化的 PNG 圖檔,這邊是假設圖檔放在區域網路內。
1
2
3
4
5
<TABLE>
  <TR><TD class="bg1" colspan="2"><B>Project Trend</B></TD></TR>
  <TR><TD><img alt="" src="file:///${testHost}/workshop/workspace/${jobName}/png/status_${reportTag}.png" /></TD></TR>
</TABLE>
<BR/>

最後顯示"前一天每個小時的 Job 結果",上一篇文章裡有提到我們將資料轉成 HOURLY_DATA_0, HOURLY_DATA_1 這類的環境變數,在 jelly script 裡面再將其讀取出來。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<j:set var="hourlyDataPre" value="HOURLY_DATA_" />
<j:set var="hourlyData" value="INIT_VALUE" />

<TABLE>
  <TR><TD class="bg1" colspan="2"><B>Hourly Status</B></TD></TR>
  <TR><TD>${reportTag}</TD></TR>
</TABLE>

<j:set var="hourlyDataSeq" value="0" />
<TABLE class="border1">
<j:while test="${hourlyData!=null}">
  <j:set var="hourlyData" value="${buildenv.get(hourlyDataPre + hourlyDataSeq)}" />
  <j:choose>
    <j:when test="${hourlyData!=null}">
      <TR>
      <j:forEach var="col" items="${hourlyData}">
        <j:if test="${col!='FAILURE' and col!='UNSTABLE'}">
          <TD class="border1">${col}</TD>
        </j:if>
        <j:if test="${col=='FAILURE'}">
          <TD class="border1"><span style="color:#ff0000">${col}</span></TD>
        </j:if>
        <j:if test="${col=='UNSTABLE'}">
          <TD class="border1"><span style="color:#FE9A2E">${col}</span></TD>
        </j:if>
      </j:forEach>
      </TR>
    </j:when>
  </j:choose>
  <j:set var="hourlyDataSeq" value="${hourlyDataSeq + 1}" />
</j:while>
</TABLE>
<BR/>

這樣我們就得到想要的 email 內容了。

要測試 jelly script 的內容是否正確,可以使用 Email-exit 提供的快速檢視的功能,輸入 jelly script 的檔名,選擇一次要檢視的 build number,就會立刻顯示郵件內容。以 DailyReport Job job 為例,Email Template Testing 的位置在 http://jenkinshost:8080/job/DailyReport/templateTest/



留言

這個網誌中的熱門文章

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

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

如何用 Jenkins API 取得 Job Build Result