web-dev-qa-db-de.com

Wie schreibe ich eine E-Mail-Ext-Vorlage von Jenkins, um Testergebnisse wie den Standardtestbericht anzuzeigen

Ich habe die Standard-Gelee-Vorlage angepasst, um die aktuellen Testergebnisse in einer Tabelle anzuzeigen. Ich möchte jedoch in der Lage sein, Unterschiede anzuzeigen, wie auf der Jenkins-Testergebnisseite zu sehen ist.

Zum Beispiel:

JUnit Tests: 0 failures (±0) , 1 skipped (+1)

Package               Duration   Fail  (diff)  Skip  (diff)  Total  (diff)
foo.bar.baz              89 ms      0      0     1       +1     5       +2
12
Jon Freedman

Schreiben Sie eine Groovy-Vorlage für das Email Ext-Plugin anstelle der Jelly-Vorlage. In der Groovy-Vorlage haben Sie Zugriff auf Build object für Ihren Build. Sie können dann getTestResultAction aufrufen, um die AbstractTestResultAction für den Build zu erhalten, den Sie dann nach allem fragen können, was Sie benötigen.

Hier ist ein Link zu Jenkins Main Module API . Eine Groovy-Beispielvorlage für das Ext Email-Plugin finden Sie in $JENKINS_HOME/plugins/email-ext/WEB-INF/classes/hudson/plugins/emailext/templates/groovy-html.template. Weitere Informationen zur Verwendung von Groovy-Vorlagen Scripts finden Sie in/- Email Ext-Plugin-Dokumentation .

9
malenkiy_scot

Wenn Sie Schwierigkeiten haben, über die interne API darauf zuzugreifen (schwer zu kennen und es gibt immer Einschränkungen), gibt es eine andere, flexiblere Möglichkeit, dies zu tun.

Verwenden von FILE-Token anstelle einer groovigen Vorlage

  1. verwenden Sie ein Skript, um über Jenkins API auf Ihre Testdaten zuzugreifen. Für Ihren Fall ist es wie http: //jenkins.server/job/yourjob/lastCompletedBuild/testReport/api/xml und erstellen Sie Ihre eigene HTML Datei wie email.html unter dem Arbeitsbereich
  2. Verwenden Sie das Formular Default Content in der email-ext-Konfiguration, um die E-Mail direkt mit dem FILE-Token zu senden. ${FILE, path="email.html"}

In Schritt 1 können Sie auch eine flexiblere Methode für Ihre eigene Vorlage verwenden. Ich verwende ein Python-Skript und eine einfache Zeichenfolge-Vorlage.

Es funktioniert perfekt für mich.

4
Larry Cai

So erweitern Sie diese Antwort: Schreiben Sie eine Groovy-Vorlage für das Email Ext-Plugin anstelle der Jelly-Vorlage. In bearbeitbaren E-Mail-Benachrichtigungsinhalten 

  • setzen Sie den Inhaltstyp auf "HTML" oder "Sowohl HTML als auch Nur Text".
  • und füge das groovige Skript so hinzu:

    $ {SCRIPT, template = "test.groovy"}

  • fügen Sie das groovige Skript in E-Mail-Vorlagen ein, z. /var/lib/jenkins/email-templates. siehe unten test.groovy.

In dem folgenden Beispiel wird jeder Test iteriert, indem jedes dieser Objekte abgerufen wird: '' 'junitResult.getChildren ()' ''. Wenn nur fehlgeschlagene Tests wiederholt werden sollen, kann junitResult.getFailedTests () verwendet werden. Siehe hudson.tasks.junit.TestResult-API: http://hudson-ci.org/javadoc/hudson/tasks/junit/PackageResult.html siehe auch http://hudson-ci.org/ Javadoc/Hudson/Modell/Build.html

Collection<ClassResult> getChildren()
List<CaseResult>    getFailedTests()

Beispiel/Vorlage von email-ext-plugin finden Sie hier: https://github.com/jenkinsci/email-ext-plugin/blob/master/src/main/resources/hudson/plugins /emailext/templates/groovy-html.template

Dieses Beispiel zeigt zusammenfassende Testergebnisse und eine Tabelle für Ergebnisse für jede Testsuite und jeden einzelnen Test. test.groovy:

<html>
<body>
<%

    import hudson.model.*

    def build = Thread.currentThread().executable
    def buildNumber = build.number
    def buildNumHash = build.getDisplayName()

    def testCount = "0"
    def testPassed = "0"
    def testFailed = "0"
    def testSkipped = "0"
    def buildDuration = "0"
    if(build.testResultAction) {
        def testResult = build.testResultAction
        testCount = String.format("%d",(testResult.totalCount))
        testPassed = String.format("%d",(testResult.result.passCount))
        testFailed = String.format("%d",(testResult.result.failCount))
        testSkipped = String.format("%d",(testResult.result.skipCount))
        testDuration = String.format("%.2f",(testResult.result.duration ))
    }

    def workspace = build.getEnvVars()["WORKSPACE"]
    def buildName = build.getEnvVars()["JOB_NAME"]
    def BUILD_STATUS = build.getEnvVars()["BUILD_STATUS"]
    def BUILD_URL = build.getEnvVars()["BUILD_URL"]

    def testResult = hudson.tasks.junit.TestResult

    def testResult2 = build.getAction(hudson.tasks.junit.TestResultAction.class)

%>

start test.groovy <br><br>
<b>TEST RESULT:</b> $testCount total, <b>$testPassed pass</b>, <b>$testFailed fail</b>, $testSkipped skip.<br>
Workspace : $workspace<br>
Project Name : $buildName $buildNumHash<br><br>

<!-- 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>Build URL</TD><TD><A href="${rooturl}${build.url}">${rooturl}${build.url}</A></TD></TR>
  <TR><TD>Project:</TD><TD>${project.name}</TD></TR>
  <TR><TD>Date of build:</TD><TD>${it.timestampString}</TD></TR>
  <TR><TD>Build duration:</TD><TD>${build.durationString}</TD></TR>
  <TR><TD>Test duration:</TD><TD>${testDuration}</TD></TR>
</TABLE>
<BR/>

<!-- JUnit TEMPLATE  hudson.tasks.junit.TestResult   -->

<% 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
}
// API: http://hudson-ci.org/javadoc/hudson/tasks/junit/PackageResult.html
%>

<!-- JUnit TEMPLATE: all tests PASS FAIL SKIP >
<% 
if (junitResultList.size() > 0) { %>
 <TABLE width="100%">
 <TR><TD class="bg1" colspan="2"><B>${junitResultList.first().displayName}</B></TD></TR>
 <% junitResultList.each{
  junitResult -> %>
     <% junitResult.getChildren().each { packageResult -> %>
        <TR><TD class="bg2" colspan="2"> <B>TEST SUITE: ${packageResult.getName()} Failed: ${packageResult.getFailCount()} test(s), Passed: ${packageResult.getPassCount()} test(s)</B>, Skipped: ${packageResult.getSkipCount()} test(s), Total: ${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()} test(s)</TD></TR>
        <% packageResult.getChildren().each{ suite -> 
               suite.getChildren().each{ test ->
           def colour = "lightgreen"
           def highlight1=""
           def highlight2=""
           RESULT = test.getStatus() // FAILED or PASSED or SKIPPED
           if (RESULT == hudson.tasks.junit.CaseResult.Status.FAILED || RESULT == hudson.tasks.junit.CaseResult.Status.REGRESSION) {
               colour = "#ffcccc" 
               highlight1="<B>"
               highlight2="</B>"
           }
           if (RESULT == hudson.tasks.junit.CaseResult.Status.SKIPPED) { colour = "#ffffb3" }
         %>
          <TR bgcolor="${colour}"><TD class="test" colspan="2">${highlight1}<li>${RESULT}: ${test.getFullName()} </li>${highlight2}</TD></TR>
        <% } }
      }
 } %>
 </TABLE>
 <BR/>
<%
} %>

end of test.groovy

</body>
</html>

z.B. Ausgabe (nur Text ohne Farben/Formatierung)

start test.groovy 

TEST RESULT: 18 total, 18 pass, 0 fail, 0 skip. 
Workspace : /var/lib/jenkins/jobs/jobname-1/workspace 
Project Name : jobname-1 #20

BUILD SUCCESS 

Build URL   http://jenkinsurl:port/job/jobname-1/20/
Project:    jobname-1 
Date of build:  Mon, 23 Jan 2017 09:29:00 +0000 
Build duration: 10 min 
Test duration:  267.12

Test Results 
TEST SUITE: suitename1 Failed: 0 test(s), Passed: 3 test(s), Skipped: 0 test(s), Total: 3 test(s) 
 * PASSED: suitename1.testclass.testname1
 * PASSED: suitename1.testclass.testname2
 * PASSED: suitename1.testclass.testname3
TEST SUITE: suitename2 Failed: 2 test(s), Passed: 1 test(s), Skipped: 0 test(s), Total: 3 test(s) 
 * PASSED: suitename2.testclass.testname1
 * FAILED: suitename2.testclass.testname2
 * REGRESSION: suitename2.testclass.testname3

end of test.groovy
3
gaoithe

Meine Lösung in Jelly basiert auf dem Standard-Script static-analysis.jelly

  <!-- JUnit TEMPLATE -->
  <j:set var="junitResultList" value="${it.JUnitTestResult}" />
  <j:if test="${junitResultList.isEmpty()!=true}">
    <div class="content">
      <a href="${rooturl}${build.url}/testReport">
        <h1>JUnit Tests</h1>
      </a>
      <table class="border">
        <tr>
          <th class="border">Package</th>
          <th class="border">Failed</th>
          <th class="border">Failed (diff)</th>
          <th class="border">Passed</th>
          <th class="border">Passed (diff)</th>
          <th class="border">Skipped</th>
          <th class="border">Skipped (diff)</th>
          <th class="border">Total</th>
          <th class="border">Total (diff)</th>
        </tr>
        <j:forEach var="junitResult" items="${it.JUnitTestResult}">
          <j:forEach var="packageResult" items="${junitResult.getChildren()}">
            <tr>
              <td class="border">
                <tt>${packageResult.getName()}</tt>
              </td>
              <td class="border test_failed">${packageResult.getFailCount()}</td>
              <td class="border test_failed">${packageResult.getFailCount()-packageResult.previousResult.getFailCount()}</td>
              <td class="border test_passed">${packageResult.getPassCount()}</td>
              <td class="border test_passed">${packageResult.getPassCount()-packageResult.previousResult.getPassCount()}</td>
              <td class="border test_skipped">${packageResult.getSkipCount()}</td>
              <td class="border test_skipped">${packageResult.getSkipCount()-packageResult.previousResult.getSkipCount()}</td>
              <td class="border">
                <b>${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()}
                </b>
              </td>
              <td class="border">
                <b>${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()-packageResult.previousResult.getPassCount()-packageResult.previousResult.getFailCount()-packageResult.previousResult.getSkipCount()}
                </b>
              </td>
            </tr>
            <j:forEach var="failed_test"
              items="${packageResult.getFailedTests()}">
              <tr>
                <td class="test_failed" colspan="5">
                  <tt>${failed_test.getFullName()}</tt>
                </td>
              </tr>
            </j:forEach>
          </j:forEach>
        </j:forEach>
      </table>
      <br />
    </div>
  </j:if>
1
TouDick