Project type: Multi Module Maven Project
Server: Jenkins
Plugin: Email Ext Plugin with jelly script and it is expected to send email template as below:
Jelly Script file:
<?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>
In our project we are going to use Email Ext plugin to send emails after successful build or execution.Integrated with Cucumber reports in selenium.
Issue: When we are using maven goals(clean compile test) of BUILD section in jenkins through "Execute Windows batch command", Email is getting triggered without any Junit related results.Attached the screenshot for reference.
Expected email template is missing the below sections in the email:
- Junit results.
- Cobertura Report
- Source
As of now my intention is to get Junit results. How to solve this issue?where am i doing wrong?
Note: If we are providing maven goals in jenkins directly, Junit results are coming properly. Issue exist only when maven goals are executed through windows batch command.
Here ui-automation.bat (please click on above screenshot)contains the maven test command which comes from batch script file.