注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

持续集成之Jenkins插件使用(二)- 邮件通知模板化  

来自谢列平   2013-11-11 23:30:19|  分类: 测试工具 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
接着上次的继续,这次只介绍一个插件,Email-ext Plugin

相信大家一定对这个插件很是熟悉,大多的Jenkins都安装了这个插件,并且在job中大量使用这个插件来发送邮件通知。对于这个插件的配置就不多说了,重点来看看这个插件提供的邮件模板化功能。

安装完这个插件后,进入${JENKINS_HOME}\plugins\email-ext\WEB-INF\classes\hudson\plugins\emailext\templates目录,会发现有一些template文件,这些就是插件自带的邮件模板,支持Jelly和Groovy的扩展。

以Groovy为例,插件本身提供了两个模板文件groovy-html.template和groovy-text.template,分别可以通过在邮件内容中设置${SCRIPT, template="groovy-html.template"}或${SCRIPT, template="groovy-text.template"}来启用相应的邮件模板文件
持续集成之Jenkins插件使用(二)- 邮件通知模板化 - 网易杭州QA - 网易杭州 QA Team

现在来看看邮件模板的内容,还是以groovy-html.template为例。
打开文件一看,这是一个以HTML和Groovy脚本混合的文本文件,也就是通过Groovy脚本访问Jenkins的API,获取job和build的相关信息,动态地生成一份HTML文件。在模板中已经定义了几块邮件模板内容。
  • 本次构建的基本信息,包括构建结果/构建url/项目名/构建开始时间/构建持续时间
          持续集成之Jenkins插件使用(二)- 邮件通知模板化 - 网易杭州QA - 网易杭州 QA Team
  
  • 本次构建相关的SCM改动信息
          持续集成之Jenkins插件使用(二)- 邮件通知模板化 - 网易杭州QA - 网易杭州 QA Team
 
  • 本次构建的产出物
          持续集成之Jenkins插件使用(二)- 邮件通知模板化 - 网易杭州QA - 网易杭州 QA Team
 
  • 本次构建的console输出

          持续集成之Jenkins插件使用(二)- 邮件通知模板化 - 网易杭州QA - 网易杭州 QA Team
 
看了这个例子,相信大家已经对如何编写Groovy脚本有了初步认识了吧。通过这种方式,可以非常便捷地访问当次构建的信息,比如通过${build.result}获取构建的结果,${project.name}得到job的名字,${rooturl}获得Jenkins的url地址等等。

接下来,再来看几个经常可能需要用到的例子
  • 获取当前job中的参数信息。如果在SCM里配置了SVN或是GIT,大家都知道可以在job里使用${SVN_REVISION}和${GIT_REVISION}来获取版本库信息,那在Groovy脚本的邮件模板中呢?答案是可以通过以下的代码来实现

<% def svnRevision = build.getEnvironment()["SVN_REVISION"] %>
<% def svnUrl = build.getEnvironment()["SVN_URL"] %>

  • 获取当前job的下游job信息。要注意的是,得到的是一个map,也就是说是一个无序的结果

<% def downstreamBuildsMap = build.getDownstreamBuilds() %>

  • 通过获取触发条件得到上游job的信息。

<%
def printCausesRecursively(cause, upstreamBuilds) {
pattern = /project "(.*)" build number ([0-9]+)/
if (cause.class.toString().contains("UpstreamCause")) {
matcher = (cause.getShortDescription() =~ pattern)
if (matcher) {
job_name = matcher[0][1]
build_number = matcher[0][2]
upstream_job = hudson.model.Hudson.instance.getItem(job_name)
upstream_build = upstream_job.getBuildByNumber(build_number.toInteger())
upstreamBuilds.push(upstream_build)
upstreamBuildDuration = upstreamBuildDuration + upstream_build.duration.toInteger()
if (upstream_build.result.toString() == 'FAILURE') {
upstreamBuildStatus = 'FAILURE'
}
}
for (upCause in cause.upstreamCauses) {
printCausesRecursively(upCause, upstreamBuilds)
}
}
}

for (cause in build.causes) {
upstreamBuilds = []
printCausesRecursively(cause, upstreamBuilds)
upstreamBuilds = upstreamBuilds.reverse()
}

%>

关于详细的Jenkins API,可以参考 http://javadoc.jenkins-ci.org/jenkins/model/package-summary.html
  评论这张
 
阅读(5250)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016