1. 程式人生 > >jenkins 郵件配置之良心之作

jenkins 郵件配置之良心之作

感謝博主:https://blog.csdn.net/u013066244/article/details/78665075

環境

jenkins:2.5 
作業系統:win7 
伺服器:centos6 
工具:CRT

需求

這個月有那麼一次jenkins在自動升級(SCM)時失敗了,那時剛好晚上7點,直到第二天早上有人點選時,才意識到升級失敗,所以想想,我還是配置下構建失敗的郵件通知吧!

安裝外掛

(安裝外掛,我喜歡先去下載hpi檔案,然後再去手動安裝)

jenkins預設的郵件通知

我先講解下,預設的。 
jenkins預設就有一個郵件通知,只是太簡單的,不能個性化或者說定製化。

設定系統管理員郵件地址

這裡寫圖片描述

郵件通知

這裡寫圖片描述

SMTP伺服器:如果你使用的是公司郵箱,那麼就詢問你自己公司裡的運維人員吧;他們一般都知道,至少我就是問公司裡的運維人員;要是你打算使用QQ郵箱,那麼你需要設定下,網上有教程;網易郵箱預設開啟。 
說明:SMTP是一種協議 
②使用者預設郵件字尾:根據自己情況去設定 
③勾選使用SMTP認證,使用者名稱:根據自己情況設定,密碼也是。 
SMTP埠:預設25

配置好了後,可以勾選 測試,在Test e-mail recipient輸入自己的郵箱,看下能否成功。

成功後,我們可以到job中進行配置: 
這裡寫圖片描述

這裡寫圖片描述

配置好了後,接下來測試,我下面是故意寫錯echo,使其構建失敗,驗證郵件。

這裡寫圖片描述

傳送郵件的結果: 
這裡寫圖片描述

可以看出這個郵件內容純文字,連個超連結都沒有,內容也不夠豐富!

接下來我們使用增強版的郵件通知

系統配置

在安裝好外掛後,你的系統設定裡面會有這麼一個設定:

圖片1

接上面圖片: 
圖片2

上面點選高階按鈕後: 
這裡寫圖片描述

SMTP server:和之前同理 
Default user E-mail suffix:根據自己情況填寫 
③勾選Use SMTP Authentication,使用者名稱和密碼填寫自己的 
SMTP port:預設25 
Default Content Type:郵件文件型別 
Default Recipients:預設接收人列表,已逗號進行分割

其他我都使用預設或者說沒有填寫,點選儲存。

注意: 
上面配置中,凡是以Default開頭的名稱,都可以在job的配置中當做變數使用。比如:預設的收件人地址:在單獨的job中可以這樣使用$DEFAULT_RECIPIENTS

單個job的單獨配置

增加構建後操作步驟,新增增強版郵件通知(看紅色圈住的部分): 
這裡寫圖片描述

之後你會得到:

這裡寫圖片描述
這裡寫圖片描述

稍微講解下: 
Disable Extended Email Publisher:勾選後,郵件就不傳送,看自己的情況嘍,如果你想除錯某些東西,又不想發郵件出去就可以勾選這個。 
Project Recipient List:收件人地址;多個收件人郵件地址用逗號進行分割;想使用全域性預設配置的話,可以使用$DEFAULT_RECIPIENTS。 
Project Reply-To List:允許回覆人的地址;想使用系統設定中的預設值的話,可以使用$DEFAULT_REPLYTO; 
Content Type:郵件文件的型別,可以設定HTML等格式; 
Default Subject:預設主題,也就是郵件標題;同理可以使用$DEFAULT_SUBJECT 
Default Content:預設郵件內容;這裡是關鍵;我這裡使用的是模板${SCRIPT, template="groovy-html.template"};後面會講;當然不想使用模板的話,可以通過使用jenkins自身提供的變數來自己定義; 
Attach Build Log:傳送的郵件是否包含日誌; 
下面幾個預設就好,最後一個Triggers非常關鍵; 
假設最後一個不改的話,郵件是接收不到的,這個是官方留下的一個大坑,一定要自己再新增一個Recipient List

點選儲存,點選構建後,收到的郵件格式如下: 
這裡寫圖片描述

遇到的問題

問題一

An attempt to send an e-mail to empty list of recipients, ignored.
  • 1

這個問題,我一直卡著很久,差不多1天吧!始終不知道為什麼收不到郵件

問題二

Exception raised during template rendering: No signature of method: hudson.model.FreeStyleBuild.getExactRuns() is applicable for argument types: () values: [] Possible solutions: getActions(), getActions(java.lang.Class) groovy.lang.MissingMethodException: No signature of method: hudson.model.FreeStyleBuild.getExactRuns() is applicable for argument types: () values: [] Possible solutions: getActions(), getActions(java.lang.Class) at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58) at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:49) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117) at SimpleTemplateScript3.run(SimpleTemplateScript3.groovy:106) at groovy.text.SimpleTemplateEngine$SimpleTemplate$1.writeTo(SimpleTemplateEngine.java:168) at groovy.text.SimpleTemplateEngine$SimpleTemplate$1.toString(SimpleTemplateEngine.java:180) at hudson.plugins.emailext.plugins.content.ScriptContent.renderTemplate(ScriptContent.java:127) at hudson.plugins.emailext.plugins.content.ScriptContent.evaluate(ScriptContent.java:68) at hudson.plugins.emailext.plugins.content.AbstractEvalContent.evaluate(AbstractEvalContent.java:64) at org.jenkinsci.plugins.tokenmacro.DataBoundTokenMacro.evaluate(DataBoundTokenMacro.java:199) at 
  • 1

按照官方教程在jenkins home/home/jenkins/dataspace)目錄中建立了email-templates資料夾,並把那兩個模板上傳上去了,之後在job配置中的Default Content中寫入:

${SCRIPT, template="jenkins-matrix-email-html.template"}
  • 1

然後構建時,就報錯! 
這一塊也困擾我很久!直到Google到了這麼一段話(網上資料真心少);

內容如下:

Looks like you are trying to test a matrix template with a non matrix job.

意思是說:

看起來像你在一個非matrix job中測試一個matrix模板

之後又去查詢什麼是matrix job; 
這是一篇關於matrix的官方教程 
Building a matrix project

看到裡面內容卻是構建一個Multi-Configuration Projects;這時就有點迷糊了!接著檢視Matrix Project Plugin這個外掛;裡面的講解有這麼一句話:

Multi-configuration (matrix) project type.

基本可以肯定matrix job就是Multi-configuration project(構建一個多配置專案)。也就是說我要使用jenkins-matrix-email-html.template這個模板就必須建立與之對應的job

經過測試後,果然可以,配置都是類似的:郵件結果如下: 
這裡寫圖片描述

那麼matrix job這個用的場景多嗎? 
這是官方給出的經驗:

其講解到:

比如 你的專案想在jdk 1.4 、1.5、1.6中進行測試,你就可以通過建立這種型別的job

使用自定義模板

通過上面遇到的問題,我們有時會想自己來定義模板! 
使用自己的模板有兩種方法:

方法一 不使用模板

Default Content這一欄中,自己通過Token來寫: 
(這裡的token不要翻譯成令牌,因為不知道翻譯成啥,就保留原文token吧)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日誌</title>
</head>

<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
    offset="0">
    <table width="95%" cellpadding="0" cellspacing="0"
        style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
        <tr>
            <td>
                <h2>
                    <font>來自Mr.Jenkins的郵件通知</font>
                </h2>
            </td>
        </tr>
        <tr>
            <td>
                <br />
                <b><font color="#0B610B">構建資訊</font></b>
               <hr size="2" width="100%" align="center" />
             </td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>專案名稱&nbsp;:&nbsp;${PROJECT_NAME}</li>
                    <li>觸發原因&nbsp;:${CAUSE}</li>
                    <li>構建日誌&nbsp;:&nbsp;<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                    <li>單元測試報告&nbsp;:<a href="${BUILD_URL}testReport/">${BUILD_URL}testReport/</a></li>
                    <li>工作目錄&nbsp;:&nbsp;<a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>

                </ul>
            </td>
        </tr>
                <tr>
            <td><b><font color="#0B610B">構建日誌:</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td><textarea cols="80" rows="30" readonly="readonly"
                    style="font-family: Courier New">${BUILD_LOG}</textarea>
            </td>
        </tr>
    </table>
</body>
</html>

這段程式碼是從網上找來的,我好奇的是這個寫法:

${ENV, var="JOB_NAME"}
# 這個寫法其實和${JOB_NAME}、$JOB_NAME是等價的
  • 1
  • 2

可以理解成:

${ENV(var:JOB_NAME)}
因為引數就一個所以可以簡寫為:
${JOB_NAME}或者$JOB_NAME
  • 1
  • 2
  • 3

方法二 使用模板

之前使用模板出錯是因為使用了matrix專案的模板。 
如果使用groovy模板也是可以的

這是官方給的groovy的模板:

在資料夾email-templates,建立一個檔案,比如我:

//我的路徑: /home/jenkins/dataspace/email-templates
[[email protected] email-templates] vim testy.template
// 再把官方給的模板複製貼上進去,程式碼如下:
  • 1
  • 2
  • 3
<STYLE>
BODY, TABLE, TD, TH, P {
  font-family:Verdana,Helvetica,sans serif;
  font-size:11px;
  color:black;
}
h1 { color:black; }
h2 { color:black; }
h3 { color:black; }
TD.bg1 { color:white; background-color:#0000C0; font-size:120% }
TD.bg2 { color:white; background-color:#4040FF; font-size:110% }
TD.bg3 { color:white; background-color:#8080FF; }
TD.test_passed { color:blue; }
TD.test_failed { color:red; }
TD.console { font-family:Courier New; }
</STYLE>
<BODY>

<TABLE>
  <TR><TD align="right"><IMG SRC="${rooturl}static/e59dfe28/images/32x32/<%= (build.result == null || build.result.toString() == 'SUCCESS') ? "blue.gif" : build.result.toString() == 'FAILURE' ? 'red.gif' : 'yellow.gif' %>" />
  </TD><TD valign="center"><B style="font-size: 200%;">BUILD ${build.result ?: 'SUCCESSFUL'}</B></TD></TR>
  <TR><TD>URL</TD><TD><A href="${rooturl}${build.url}">${rooturl}${build.url}</A></TD></TR>
  <TR><TD>Project:</TD><TD>${project.name}</TD></TR>
  <TR><TD>Date:</TD><TD>${it.timestampString}</TD></TR>
  <TR><TD>Duration:</TD><TD>${build.durationString}</TD></TR>
  <TR><TD>Cause:</TD><TD><% build.causes.each() { cause -> %> ${cause.shortDescription} <%  } %></TD></TR>
</TABLE>
<BR/>

<!-- CHANGE SET -->
<% def changeSets = build.changeSets
if(changeSets != null) {
    def hadChanges = false %>
    <TABLE width="100%">
    <TR><TD class="bg1" colspan="2"><B>CHANGES</B></TD></TR>

<%  changeSets.each() { cs_list ->
      cs_list.each() { cs ->
          hadChanges = true %>
        <TR>
          <TD colspan="2" class="bg2">&nbsp;&nbsp;Revision <B><%= cs.metaClass.hasProperty('commitId') ? cs.commitId : cs.metaClass.hasProperty('revision') ? cs.revision :
          cs.metaClass.hasProperty('changeNumber') ? cs.changeNumber : "" %></B> by
            <B><%= cs.author %>: </B>
            <B>(${cs.msgAnnotated})</B>
           </TD>
        </TR>
<%      cs.affectedFiles.each() { p -> %>
        <TR>
          <TD width="10%">&nbsp;&nbsp;${p.editType.name}</TD>
          <TD>${p.path}</TD>
        </TR>
<%      }
      }
  }

    if(!hadChanges) { %>
        <TR><TD colspan="2">No Changes</TD></TR>
<%  } %>
  </TABLE>
<BR/>
<% } %>

<!-- ARTIFACTS -->
<% def artifacts = build.artifacts
if(artifacts != null && artifacts.size() > 0) { %>
  <TABLE width="100%">
    <TR><TD class="bg1"><B>BUILD ARTIFACTS</B></TD></TR>
    <TR>
      <TD>
<%      artifacts.each() { f -> %>
          <li>
            <a href="${rooturl}${build.url}artifact/${f}">${f}</a>
          </li>
<%      } %>
      </TD>
    </TR>
  </TABLE>
<BR/>
<% } %>

<!-- MAVEN ARTIFACTS -->
<%
try {
  def mbuilds = build.moduleBuilds
  if(mbuilds != null) { %>
  <TABLE width="100%">
      <TR><TD class="bg1"><B>BUILD ARTIFACTS</B></TD></TR>
<%
    try {
        mbuilds.each() { m -> %>
        <TR><TD class="bg2"><B>${m.key.displayName}</B></TD></TR>
<%      m.value.each() { mvnbld ->
            def artifactz = mvnbld.artifacts
            if(artifactz != null && artifactz.size() > 0) { %>
      <TR>
        <TD>
<%              artifactz.each() { f -> %>
            <li>
              <a href="${rooturl}${mvnbld.url}artifact/${f}">${f}</a>
            </li>
<%              } %>
        </TD>
      </TR>
<%          }
        }
       }
    } catch(e) {
    // we don't do anything
    }  %>
  </TABLE>
<BR/>
<% }

}catch(e) {
    // we don't do anything
}
%>

<!-- JUnit TEMPLATE -->

<% def junitResultList = it.JUnitTestResult
try {
 def cucumberTestResultAction = it.getAction("org.jenkinsci.plugins.cucumber.jsontestsupport.CucumberTestResultAction")
 junitResultList.add(cucumberTestResultAction.getResult())
} catch(e) {
        //cucumberTestResultAction not exist in this build
}
if (junitResultList.size() > 0) { %>
 <TABLE width="100%">
 <TR><TD class="bg1" colspan="2"><B>${junitResultList.first().displayName}</B></TD></TR>
 <% junitResultList.each{
  junitResult -> %>
     <% junitResult.getChildren().each { packageResult -> %>
        <TR><TD class="bg2" colspan="2"> Name: ${packageResult.getName()} Failed: ${packageResult.getFailCount()} test(s), Passed: ${packageResult.getPassCount()} test(s), Skipped: ${packageResult.getSkipCount()} test(s), Total: ${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()} test(s)</TD></TR>
        <% packageResult.getFailedTests().each{ failed_test -> %>
          <TR bgcolor="white"><TD class="test_failed" colspan="2"><B><li>Failed: ${failed_test.getFullName()} </li></B></TD></TR>
        <% }
      }
 } %>
 </TABLE>
 <BR/>
<%
} %>

<!-- CONSOLE OUTPUT -->
<% if(build.result==hudson.model.Result.FAILURE) { %>
<TABLE width="100%" cellpadding="0" cellspacing="0">
<TR><TD class="bg1"><B>CONSOLE OUTPUT</B></TD></TR>
<%  build.getLog(100).each() { line -> %>
    <TR><TD class="console">${org.apache.commons.lang.StringEscapeUtils.escapeHtml(line)}</TD></TR>
<%  } %>
</TABLE>
<BR/>
<% } %>

</BODY>

之後把Default Content這一欄改為:

${SCRIPT, template="testy.template"}

就可以了!

可以使用Email Template Testing 這個功能進行測試,把模板名稱輸入進去就可以啦!

這裡寫圖片描述

假設你輸入groovy-html.template,即使你的email-templates資料夾裡壓根沒有這個檔案,也是能成功的,這是因為該外掛預設內建的就是這個模板!

參考地址:

相關推薦

jenkins 郵件配置良心

感謝博主:https://blog.csdn.net/u013066244/article/details/78665075 環境 jenkins:2.5  作業系統:win7  伺服器:centos6  工具:CRT 需求 這個月有那麼一次jenkins在自動升

jenkins郵件配置

頁面 辦公室 觸發 功能 參數說明 rate 詳細 cin 過濾 主要對Windows環境 jenkins 的郵件通知進行介紹 jenkins內置的郵件功能 郵件通知功能主要包括兩個部分:全局配置和項目配置 jenkins內置的郵件配置 系統管理--系統設置--Jenkin

jenkins 郵件配置

jenkins預設的郵件通知 我先講解下,預設的。 jenkins預設就有一個郵件通知,只是太簡單的,不能個性化或者說定製化。 設定系統管理員郵件地址 郵件通知 ①SMTP伺服器:如果你使用的是公司郵箱,那麼就詢問你自己公司裡的運維人員吧;他們一般都知道,至少我就是問公司裡的運維人員

Jenkins 郵件配置 (使用 Jenkins Email Extension Plugin)

本文主要對 jenkins 的郵件通知進行介紹, jenkins 內建的郵件功能使用外掛擴充套件的郵件功能 1. 先介紹下 基本的Jenkins 郵件伺服器 配置    1)system config 頁面 (以公用的163郵件伺服器為例): 可以勾選 “通過

使用Jenkins郵件配置郵件中輸出測試執行詳細結果

Jenkins的郵件配置還是比較人性化的,提供了很多令牌供使用者獲取特定的內容並輸出。如:  •     ${BUILD_NUMBER} -顯示當前構建的編號。 •     ${BUILD_STATUS} -顯示當前構建的狀態(失敗、成功等等) •     ${BUILD_

寫的不錯一定要看 ———————— Jenkins學習四:Jenkins 郵件配置

本文主要對Windows環境 jenkins 的郵件通知進行介紹 jenkins 內建的郵件功能使用email-ext外掛擴充套件的郵件功能 郵件通知功能主要包含兩個部分:全域性配置和專案配置。 一. 先介紹下內建的Jenkins 郵件伺服器 配置 1、系統管理-系統設定,先設定發件人的郵件,切記:一定

第三章 持續集成jenkins工具使用郵件配置

imp 修改 布爾型 suffix table ces 直接 wpa where 1 Email Extension Plugin插件安裝 持續集成很重要的一環就是及時將構建結果通知到對應的責任人,如:構建失敗了,至少需要下發通知給造成本次構建失敗的開發人員,如果包含自

服務器幾種郵件報警設置WEB站服務器監控郵件報警配置[三]

image ssa tex warn erro 客戶體驗 roc vpd a10 WEB站服務器監控郵件報警配置 由於部分WEB站舊服務器仍舊使用2003系統,經常出現服務器內分頁大滿,服務器內存溢出等情況,導致整臺服務器WEB站無法打開的情況,服務器太多尋查難度較大,有時

Jenkins持續集成 Jenkins基本配置

shadow water 工具 插件安裝 tex 分享 ESS cto jenkin 一、在全局工具配置設置JAVA環境變量 二、在全局工具配置設置GIT環境變量 三、基本插件安裝GitLab與Publis 0ver SSH Jenkins持續集成 之 Jenkins基

網路服務配置與管理基於Linux的郵件服務配置

首先宣告網路服務配置與管理系列文章皆為報告記錄和截圖,如果需要詳細的實驗步驟操作請百度搜索。 1. 實驗目的 配置一臺基於sendmail+dovecot的電子郵件伺服器,並通過outlook或其他Em

Jenkins進階系列——12詳解Jenkins節點配置

2014-03-02:修正對於lable標籤的理解。(1.532.1版本已經給出了官方解釋) 2013-12-22:新增JNLP埠修改,修改了一些錯誤。 Jenkins有個很強大的功能:分散式構建(在Jenkins的配置中叫做節點),分散式構建能夠讓同一套程式碼在

Jenkins(四)jenkins 郵件正文報告亂碼解決

 jenkins使用tomcat部署後,使用服務開機自啟後傳送jmeter的郵件,報告中文亂碼 解決方法: 1.tomcat 取消服務開啟自動啟動改用 執行tomcat /bin 目錄下startup.bat 啟動 2.在tomcat bin目錄下新建setenv.bat 檔案 檔案內容為: set “J

圖像語義分割的前世今生(轉載)良心

解釋 運行 明顯 視覺 缺點 事情 img 裏的 deep    1998年以來,人工神經網絡識別技術已經引起了廣泛的關註,並且應用

Nginx(五)-- 配置文件Rewrite

log 技術分享 判斷 placement ble png per 大小寫 遠程 Rewrite支持URL重寫 1.常用指令以及語法   1) if指令    if語法: if 空格 (condition) {}    條件:    1. &ld

Web.xml配置詳解context-param

ltr 完成 數據庫 數據 鍵值對 art str htm 方法 轉自:http://blog.csdn.net/liaoxiaohua1981/article/details/6759206 格式定義: [html] view plaincopy

Solr 配置文件schema.xml

standard 不同的 文檔 Coding 指向 hand 微軟 等價 core schema.xml這個配置文件的根本目的是為了通過配置告訴Solr怎樣建立索引。 solr的數據結構例如以下: document:一個文檔、一條記錄

MyBatis學習(四)XML配置文件SQL映射的XML文件

元素 數據庫 resultmap ash 有一點 oracl 解決 轉換成 插入語 SQL映射文件常用的元素:    1.select   查詢語句是MyBatis最常用的語句之一。   執行簡單查詢的select元素是非常簡單的: <select id=”sele

ELK 學習筆記 Logstashfilter配置

表達式 under starting beginning name core dir date source Logstash之filter: json filter: input{ stdin{ } } filter{ jso

Linux系統裁減,制一個極度精簡的Linux

極簡linuxLinux系統裁減之,制作一個極度精簡的Linux1.1建立一個用於安裝精簡Linux的磁盤實驗環境:操作系統:CentOS 5.11 64位 此步驟用虛擬機做,在原有的虛擬機上添加一個磁盤,為新添加的磁盤分2個分區並格式化,分別掛在到/mnt目錄下的boot目錄和sys

Linux系統裁減,制一個極度精簡的Linux-用腳本實現自動拷貝命令和依賴庫文件

用腳本實現自動拷貝命令和依賴庫文件第2章 用腳本實現自動拷貝命令和依賴庫文件 這篇文章主要是對我上一篇博文http://blog.51cto.com/linuxprince/2045703加以完善的,前一篇文章中拷貝命令和依賴庫文件的過程是完全手工方式的,顯得特別LOW,這章把該過程完善一下,用