1

项目类型:多模块Maven项目

服务器:詹金斯

插件:带有果冻脚本的电子邮件分机插件,预计发送电子邮件模板如下:

果冻脚本文件:

<?jelly escape-by-default='true'?>
<!DOCTYPE html [
    <!ENTITY nbsp "&#38;#38;nbsp&#59;">
]>
<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">&nbsp;&nbsp;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%">&nbsp;&nbsp;${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()}&nbsp;&nbsp;</center></td></tr>
	  <tr bgcolor="#cfcfb7"><th>&nbsp;&nbsp;Failed Cucumber Tests Details&nbsp;&nbsp;</th></tr>
	        <j:forEach var="failed_test" items="${packageResult.getFailedTests()}">			
			  <tr bgcolor="white"><td class="test_failed" colspan="2"><B><li>&#10;${failed_test.getFullName()}&#10;</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相关结果。附上截图以供参考。

电子邮件截图

预期的电子邮件模板在电子邮件中缺少以下部分:

  1. 六月结果。
  2. Cobertura 报告
  3. 资源

到目前为止,我的意图是获得 Junit 结果。如何解决这个问题?我在哪里做错了?

在 Jenkins 中构建部分

注意:如果我们直接在 jenkins 中提供 maven 目标,Junit 结果会正确出现。仅当通过 windows 批处理命令执行 maven 目标时才存在问题。

这里 ui-automation.bat(请点击上面的截图)包含来自批处理脚本文件的 maven 测试命令。

4

1 回答 1

0

我通过添加“发布 Junit 测试结果报告”插件来发布构建操作来解决它。

我在“测试报告 XMLs”字段中提供了 xml 文件路径,即“YourProjectLocation\target\surefire-reports.xml”。

于 2017-09-26T09:11:41.753 回答