感谢博主:https://blog.csdn.net/u013066244/article/details/78665075
jenkins:2.5
操作系统:win7
服务器:centos6
工具:CRT
这个月有那么一次jenkins
在自动升级(SCM)时失败了,那时刚好晚上7
点,直到第二天早上有人点击时,才意识到升级失败,所以想想,我还是配置下构建失败的邮件通知吧!
Email Extension Plugin
(安装插件,我喜欢先去下载hpi
文件,然后再去手动安装)
我先讲解下,默认的。
jenkins默认就有一个邮件通知,只是太简单的,不能个性化或者说定制化。
①SMTP
服务器:如果你使用的是公司邮箱,那么就询问你自己公司里的运维人员吧;他们一般都知道,至少我就是问公司里的运维人员;要是你打算使用QQ邮箱
,那么你需要设置下,网上有教程;网易邮箱默认开启。
说明:SMTP
是一种协议
②用户默认邮件后缀:根据自己情况去设置
③勾选使用SMTP认证
,用户名:根据自己情况设置,密码也是。
④SMTP
端口:默认25
配置好了后,可以勾选 测试,在Test e-mail recipient
输入自己的邮箱,看下能否成功。
配置好了后,接下来测试,我下面是故意写错echo
,使其构建失败,验证邮件。
可以看出这个邮件内容纯文本,连个超链接都没有,内容也不够丰富!
在安装好插件后,你的系统设置
里面会有这么一个设置:
①SMTP server
:和之前同理
②Default user E-mail suffix
:根据自己情况填写
③勾选Use SMTP Authentication
,用户名和密码填写自己的
④SMTP port
:默认25
⑤Default Content Type
:邮件文档类型
⑥Default Recipients
:默认接收人列表,已逗号进行分割
其他我都使用默认或者说没有填写,点击保存。
注意:
上面配置中,凡是以Default
开头的名称,都可以在job
的配置中当做变量使用。比如:默认的收件人地址:在单独的job
中可以这样使用$DEFAULT_RECIPIENTS
。
在增加构建后操作步骤
,添加增强版邮件通知(看红色圈住的部分):
之后你会得到:
稍微讲解下:
①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天吧!始终不知道为什么收不到邮件
直到Google
到这个地方:
https://stackoverflow.com/a/37167955/6952713
https://issues.jenkins-ci.org/browse/JENKINS-34731?focusedCommentId=257221&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-257221
才知道,官方给了一个大坑。
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
这个错误是我在使用邮件模板时,报的错!
我的步骤如下:
我在参考官方 :https://wiki.jenkins.io/display/JENKINS/Email-ext+plugin
中的Script content这一章节内容时,下载了两个Template Examples
jenkins-matrix-email-html.template
jenkins-generic-matrix-email-html.template
按照官方教程在jenkins home
(/home/jenkins/dataspace
)目录中创建了email-templates
文件夹,并把那两个模板上传上去了,之后在job
配置中的Default Content
中写入:
${SCRIPT, template="jenkins-matrix-email-html.template"}
然后构建时,就报错!
这一块也困扰我很久!直到Google
到了这么一段话(网上资料真心少);
http://jenkins-ci.361315.n4.nabble.com/Email-Template-Testing-Exception-td4807117.html
内容如下:
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
这个用的场景多吗?
这是官方给出的经验:
Experience with Hudson - Building matrix project
其讲解到:
比如 你的项目想在jdk 1.4 、1.5、1.6中进行测试,你就可以通过创建这种类型的
job
;
通过上面遇到的问题,我们有时会想自己来定义模板!
使用自己的模板有两种方法:
在Default Content
这一栏中,自己通过Token
来写:
(这里的token
不要翻译成令牌,因为不知道翻译成啥,就保留原文token
吧)
${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志
来自Mr.Jenkins的邮件通知
构建信息
- 项目名称 : ${PROJECT_NAME}
- 触发原因 :${CAUSE}
- 构建日志 : ${BUILD_URL}console
- 单元测试报告 :${BUILD_URL}testReport/
- 工作目录 : ${PROJECT_URL}ws
构建日志:
这段代码是从网上找来的,我好奇的是这个写法:
${ENV, var="JOB_NAME"}
# 这个写法其实和${JOB_NAME}、$JOB_NAME是等价的
可以理解成:
${ENV(var:JOB_NAME)}
因为参数就一个所以可以简写为:
${JOB_NAME}或者$JOB_NAME
之前使用模板出错是因为使用了matrix
项目的模板。
如果使用groovy
模板也是可以的
这是官方给的groovy
的模板:
https://github.com/jenkinsci/email-ext-plugin/blob/master/src/main/resources/hudson/plugins/emailext/templates/groovy-html.template
在文件夹email-templates
,创建一个文件,比如我:
//我的路径: /home/jenkins/dataspace/email-templates
[root@master01 email-templates] vim testy.template
// 再把官方给的模板复制粘贴进去,代码如下:
" />
BUILD ${build.result ?: 'SUCCESSFUL'}
URL ${rooturl}${build.url}
Project: ${project.name}
Date: ${it.timestampString}
Duration: ${build.durationString}
Cause: <% build.causes.each() { cause -> %> ${cause.shortDescription} <% } %>
<% def changeSets = build.changeSets
if(changeSets != null) {
def hadChanges = false %>
CHANGES
<% changeSets.each() { cs_list ->
cs_list.each() { cs ->
hadChanges = true %>
Revision <%= cs.metaClass.hasProperty('commitId') ? cs.commitId : cs.metaClass.hasProperty('revision') ? cs.revision :
cs.metaClass.hasProperty('changeNumber') ? cs.changeNumber : "" %> by
<%= cs.author %>:
(${cs.msgAnnotated})
<% cs.affectedFiles.each() { p -> %>
${p.editType.name}
${p.path}
<% }
}
}
if(!hadChanges) { %>
No Changes
<% } %>
<% } %>
<% def artifacts = build.artifacts
if(artifacts != null && artifacts.size() > 0) { %>
BUILD ARTIFACTS
<% artifacts.each() { f -> %>
${f}
<% } %>
<% } %>
<%
try {
def mbuilds = build.moduleBuilds
if(mbuilds != null) { %>
BUILD ARTIFACTS
<%
try {
mbuilds.each() { m -> %>
${m.key.displayName}
<% m.value.each() { mvnbld ->
def artifactz = mvnbld.artifacts
if(artifactz != null && artifactz.size() > 0) { %>
<% artifactz.each() { f -> %>
${f}
<% } %>
<% }
}
}
} catch(e) {
// we don't do anything
} %>
<% }
}catch(e) {
// we don't do anything
}
%>
<% 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) { %>
${junitResultList.first().displayName}
<% junitResultList.each{
junitResult -> %>
<% junitResult.getChildren().each { packageResult -> %>
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)
<% packageResult.getFailedTests().each{ failed_test -> %>
Failed: ${failed_test.getFullName()}
<% }
}
} %>
<%
} %>
<% if(build.result==hudson.model.Result.FAILURE) { %>
CONSOLE OUTPUT
<% build.getLog(100).each() { line -> %>
${org.apache.commons.lang.StringEscapeUtils.escapeHtml(line)}
<% } %>
<% } %>
之后把Default Content
这一栏改为:
${SCRIPT, template="testy.template"}
就可以了!
可以使用Email Template Testing
这个功能进行测试,把模板名称输入进去就可以啦!
假设你输入groovy-html.template
,即使你的email-templates
文件夹里压根没有这个文件,也是能成功的,这是因为该插件默认内置的就是这个模板!
参考地址:
Email-ext plugin
https://github.com/jenkinsci/email-ext-plugin/blob/master/src/main/resources/hudson/plugins/emailext/templates/groovy-html.template
https://stackoverflow.com/questions/424295/experience-with-hudson-building-matrix-project
https://stackoverflow.com/questions/37144078/jenkins-email-ext-plugin-thinks-i-have-no-recipients-configured