项目类型:多模块Maven项目
服务器:詹金斯
插件:带有果冻脚本的电子邮件分机插件,预计发送电子邮件模板如下:
果冻脚本文件:
<?jelly escape-by-default='true'?>
<!DOCTYPE html [
<!ENTITY nbsp "&#38;nbsp;">
]>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define">
<STYLE>
BODY, TABLE, TD, TH, P {
font-family:Verdana,Helvetica,sans serif;
font-size:11px;
color:black;
}
TH {
font-family:Verdana,Helvetica,sans serif;
font-size:11px;
color:darkRed;
padding-left:4px;
padding-right:4px;
font-weight:normal;
}
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. { color:white; background-color:#6699cc; font-size:120%; padding-bottom:1.5px; padding-top:1.5 px }
TD.test_passed { color:green; }
TD.test_failed { color:red; }
TD.console { font-family:Courier New; }
</STYLE>
<BODY>
<!-- GENERAL INFO -->
<TABLE>
<TR><TD align="right">
<j:choose>
<j:when test="${build.result=='SUCCESS'}">
<IMG SRC="${rooturl}static/e59dfe28/images/32x32/blue.gif" />
</j:when>
<j:when test="${build.result=='FAILURE'}">
<IMG SRC="${rooturl}static/e59dfe28/images/32x32/red.gif" />
</j:when>
<j:otherwise>
<IMG SRC="${rooturl}static/e59dfe28/images/32x32/yellow.gif" />
</j:otherwise>
</j:choose>
</TD><TD valign="center"><B style="font-size: 200%;">BUILD ${build.result}</B></TD></TR>
<TR><TD bgcolor="#cfcfb7"> Jenkins Build URL</TD><TD><A href="${rooturl}${build.url}">${rooturl}${build.url}</A></TD></TR>
<TR><TD bgcolor="#cfcfb7"> Project Name:</TD><TD>${project.name}</TD></TR>
<TR><TD bgcolor="#cfcfb7"> Date and Time of build:</TD><TD>${it.timestampString}</TD></TR>
<TR><TD bgcolor="#cfcfb7"> Build duration:</TD><TD>${build.durationString}</TD></TR>
<TR><TD bgcolor="#cfcfb7">Click here to View Detailed Test Results</TD><TD><A href="${rooturl}${build.url}/cucumber-html-reports/overview-features.html">Cucumber Test Results</A></TD></TR>
</TABLE>
<BR/>
<!-- HEALTH TEMPLATE -->
<div class="content">
<j:set var="healthReports" value="${project.buildHealthReports}" />
<j:if test="${healthReports!=null}">
<h2>Health Report</h2>
<table>
<tr bgcolor="#cfcfb7">
<th>Description</th>
<th>Score</th>
</tr>
<j:forEach var="healthReport" items="${healthReports}">
<tr>
<td bgcolor="#cfcfb7">${healthReport.description}</td>
<td bgcolor="#cfcfb7">${healthReport.score}</td>
</tr>
</j:forEach>
</table>
<br />
</j:if>
</div>
<!-- CHANGE SET -->
<j:set var="changeSet" value="${build.changeSet}" />
<j:if test="${changeSet!=null}">
<j:set var="hadChanges" value="false" />
<TABLE width="100%">
<TR><TD bgcolor="#cfcfb7" colspan="2"><B>CHANGES</B></TD></TR>
<j:forEach var="cs" items="${changeSet}" varStatus="loop">
<j:set var="hadChanges" value="true" />
<j:set var="aUser" value="${cs.hudsonUser}"/>
<TR>
<TD colspan="2" bgcolor="#cfcfb7"> Revision <B>${cs.commitId?:cs.revision?:cs.changeNumber}</B> by
<B>${aUser!=null?aUser.displayName:cs.author.displayName}: </B>
<B>(${cs.msgAnnotated})</B>
</TD>
</TR>
<j:forEach var="p" items="${cs.affectedFiles}">
<TR>
<TD width="10%"> ${p.editType.name}</TD>
<TD>${p.path}</TD>
</TR>
</j:forEach>
</j:forEach>
<j:if test="${!hadChanges}">
<TR><TD colspan="2">No Changes</TD></TR>
</j:if>
</TABLE>
<BR/>
</j:if>
<!-- JUnit TEMPLATE -->
<j:set var="junitResultList" value="${it.JUnitTestResult}" />
<j:if test="${junitResultList.isEmpty()!=true}">
<TABLE width="100%">
<TR><TD bgcolor="#cfcfb7" colspan="5"><B>JUnit Test Results</B></TD></TR>
<tr bgcolor="#cfcfb7"><th>Failed Tests</th><th>passed Tests</th><th>Skipped Tests</th><th>Total Tests</th></tr>
<j:forEach var="junitResult" items="${it.JUnitTestResult}">
<j:forEach var="packageResult" items="${junitResult.getChildren()}">
<tr><td><center><A href="${rooturl}${build.url}/cucumber-html-reports/overview-failures.html"></A>${packageResult.getFailCount()}</center></td><td><center><A href="${rooturl}${build.url}/cucumber-html-reports/overview-tags.html"></A>${packageResult.getPassCount()}</center></td><td><center>${packageResult.getSkipCount()}</center></td><td><center>${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()} </center></td></tr>
<tr bgcolor="#cfcfb7"><th> Failed Cucumber Tests Details </th></tr>
<j:forEach var="failed_test" items="${packageResult.getFailedTests()}">
<tr bgcolor="white"><td class="test_failed" colspan="2"><B><li> ${failed_test.getFullName()} </li></B></td></tr>
</j:forEach>
</j:forEach>
</j:forEach>
</TABLE>
<BR/>
</j:if>
<!-- COBERTURA TEMPLATE -->
<j:set var="coberturaAction" value="${it.coberturaAction}" />
<j:if test="${coberturaAction!=null}">
<j:set var="coberturaResult" value="${coberturaAction.result}" />
<j:if test="${coberturaResult!=null}">
<table width="100%"><TD class="bg1" colspan="2"><B>Cobertura Report</B></TD></table>
<table width="100%"><TD class="bg2" colspan="2"><B>Project Coverage Summary</B></TD></table>
<table border="1px" class="pane">
<tr>
<td>Name</td>
<j:forEach var="metric" items="${coberturaResult.metrics}">
<td>${metric.name}</td>
</j:forEach>
</tr>
<tr>
<td>${coberturaResult.name}</td>
<j:forEach var="metric" items="${coberturaResult.metrics}">
<td data="${coberturaResult.getCoverage(metric).percentageFloat}">${coberturaResult.getCoverage(metric).percentage}%
(${coberturaResult.getCoverage(metric)})
</td>
</j:forEach>
</tr>
</table>
<j:if test="${coberturaResult.sourceCodeLevel}">
<h2>Source</h2>
<j:choose>
<j:when test="${coberturaResult.sourceFileAvailable}">
<div style="overflow-x:scroll;">
<table class="source">
<thead>
<tr>
<th colspan="3">${coberturaResult.relativeSourcePath}</th>
</tr>
</thead>
${coberturaResult.sourceFileContent}
</table>
</div>
</j:when>
<j:otherwise>
<p>
<i>Source code is unavailable</i>
</p>
</j:otherwise>
</j:choose>
</j:if>
<j:forEach var="element" items="${coberturaResult.childElements}">
<j:set var="childMetrics" value="${coberturaResult.getChildMetrics(element)}"/>
<table width="100%"><TD class="bg2" colspan="2">Coverage Breakdown by ${element.displayName}</TD></table>
<table border="1px" class="pane sortable">
<tr>
<td>Name</td>
<j:forEach var="metric" items="${childMetrics}">
<td>${metric.name}</td>
</j:forEach>
</tr>
<j:forEach var="c" items="${coberturaResult.children}">
<j:set var="child" value="${coberturaResult.getChild(c)}"/>
<tr>
<td>
${child.xmlTransform(child.name)}
</td>
<j:forEach var="metric" items="${childMetrics}">
<j:set var="childResult" value="${child.getCoverage(metric)}"/>
<j:choose>
<j:when test="${childResult!=null}">
<td data="${childResult.percentageFloat}">${childResult.percentage}%
(${childResult})
</td>
</j:when>
<j:otherwise>
<td data="101">N/A</td>
</j:otherwise>
</j:choose>
</j:forEach>
</tr>
</j:forEach>
</table>
</j:forEach>
</j:if>
<BR/>
</j:if>
<!-- CONSOLE OUTPUT -->
<j:getStatic var="resultFailure" field="FAILURE" className="hudson.model.Result"/>
<j:if test="${build.result==resultFailure}">
<TABLE width="100%" cellpadding="0" cellspacing="0">
<TR><TD class="bg1"><B>CONSOLE OUTPUT</B></TD></TR>
<j:forEach var="line" items="${build.getLog(100)}"><TR><TD class="console">${line}</TD></TR></j:forEach>
</TABLE>
<BR/>
</j:if>
</BODY>
</j:jelly>
在我们的项目中,我们将使用 Email Ext 插件在成功构建或执行后发送电子邮件。与 Selenium 中的 Cucumber 报告集成。
问题:当我们通过“执行Windows批处理命令”在jenkins中使用BUILD部分的maven目标(干净编译测试)时,电子邮件被触发而没有任何Junit相关结果。附上截图以供参考。
预期的电子邮件模板在电子邮件中缺少以下部分:
- 六月结果。
- Cobertura 报告
- 资源
到目前为止,我的意图是获得 Junit 结果。如何解决这个问题?我在哪里做错了?
注意:如果我们直接在 jenkins 中提供 maven 目标,Junit 结果会正确出现。仅当通过 windows 批处理命令执行 maven 目标时才存在问题。
这里 ui-automation.bat(请点击上面的截图)包含来自批处理脚本文件的 maven 测试命令。