<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> | |
<style type="text/css"> | |
/*base css*/ | |
body | |
{ | |
margin: 0px; | |
padding: 15px; | |
} | |
body, td, th | |
{ | |
font-family: "Lucida Grande", "Lucida Sans Unicode", Helvetica, Arial, Tahoma, sans-serif; | |
font-size: 10pt; | |
} | |
th | |
{ | |
text-align: left; | |
} | |
h1 | |
{ | |
margin-top: 0px; | |
} | |
a | |
{ | |
color:#4a72af | |
} | |
/*div styles*/ | |
.status{background-color:<%= | |
build.result.toString() == "SUCCESS" ? 'green' : 'red' %>;font-size:28px;font-weight:bold;color:white;width:720px;height:52px;margin-bottom:18px;text-align:center;vertical-align:middle;border-collapse:collapse;background-repeat:no-repeat} | |
.status .info{color:white!important;text-shadow:0 -1px 0 rgba(0,0,0,0.3);font-size:32px;line-height:36px;padding:8px 0} | |
</style> | |
<body> | |
<div class="content round_border"> | |
<div class="status"> | |
<p class="info">The build <%= build.result.toString().toLowerCase() %></p> | |
</div> | |
<!-- status --> | |
<table> | |
<tbody> | |
<tr> | |
<th>Project:</th> | |
<td>${project.name}</td> | |
</tr> | |
<tr> | |
<th>Build ${build.displayName}:</th> | |
<td><a | |
href="${rooturl}${build.url}">${rooturl}${build.url}</a></td> | |
</tr> | |
<tr> | |
<th>Date of build:</th> | |
<td>${it.timestampString}</td> | |
</tr> | |
<tr> | |
<th>Build duration:</th> | |
<td>${build.durationString}</td> | |
</tr> | |
<tr> | |
<td colspan="2"> </td> | |
</tr> | |
</tbody> | |
</table> | |
<!-- main --> | |
<% def artifacts = build.artifacts | |
if(artifacts != null && artifacts.size() > 0) { %> | |
<b>Build Artifacts:</b> | |
<ul> | |
<% artifacts.each() { f -> %> | |
<li><a href="${rooturl}${build.url}artifact/${f}">${f}</a></li> | |
<% } %> | |
</ul> | |
<% } %> | |
<!-- artifacts --> | |
<% | |
lastAllureReportBuildAction = build.getAction(ru.yandex.qatools.allure.jenkins.AllureReportBuildAction.class) | |
lastAllureBuildAction = build.getAction(ru.yandex.qatools.allure.jenkins.AllureBuildAction.class) | |
if (lastAllureReportBuildAction) { | |
allureResultsUrl = "${rooturl}${build.url}allure" | |
allureLastBuildSuccessRate = String.format("%.2f", lastAllureReportBuildAction.getPassedCount() * 100f / lastAllureReportBuildAction.getTotalCount()) | |
} | |
%> | |
<% if (lastAllureReportBuildAction) { %> | |
<h2>Allure Results</h2> | |
<table> | |
<tbody> | |
<tr> | |
<th>Total Allure tests run:</th> | |
<td><a href="${allureResultsUrl}">${lastAllureReportBuildAction.getTotalCount()}</a></td> | |
</tr> | |
<tr> | |
<th>Failed:</th> | |
<td>${lastAllureReportBuildAction.getFailedCount()} </td> | |
</tr> | |
<tr> | |
<th>Passed:</th> | |
<td>${lastAllureReportBuildAction.getPassedCount()} </td> | |
</tr> | |
<tr> | |
<th>Skipped:</th> | |
<td>${lastAllureReportBuildAction.getSkipCount()} </td> | |
</tr> | |
<tr> | |
<th>Broken:</th> | |
<td>${lastAllureReportBuildAction.getBrokenCount()} </td> | |
</tr> | |
<tr> | |
<th>Success rate: </th> | |
<td>${allureLastBuildSuccessRate}% </td> | |
</tr> | |
</tbody> | |
</table> | |
<img lazymap="${allureResultsUrl}/graphMap" src="${allureResultsUrl}/graph" alt="Allure results trend"/> | |
<% } %> | |
<!-- content --> | |
<!-- bottom message --> | |
</body> |
node { | |
stage('Test') { | |
//... test execution steps | |
} | |
stage('Build report'){ | |
allure includeProperties: false, jdk: '', results: [[path: 'target/allure-results']] | |
} | |
stage('Send Summary'){ | |
emailext body: '''${SCRIPT, template="allure-report.groovy"}''', | |
subject: "[Jenkins] Test Execution Summary", | |
to: "all@example.com" | |
} | |
} |
@letsrokk now i have something like this
after attaching that as a default content :/
As I mentioned before, there's an issue with images when you are linking them from Jenkins instance that is located in internal / private network that is not accessible from public. Some e-mail services are trying to cache / proxy images before displaying them (e.g. Google Mail). I do not have a workaround for that at the moment, unfortunately
I meant his reply and pictures that he added are not available.
Hi ZhangGuoqiang666,
as i understand these images are generated by Allure Jenkins, and aren't stored in raw results or generated report
@letsrokk , @LearningNeverEnds OK, i have spent few hours on this but i have a solution that will let you email results even if your jenkins is behind proxy:
Add:
content=new URL("${allureResultsUrl}/graph").getBytes( useCaches: true, allowUserInteraction: false, requestProperties: ["User-Agent": "Groovy Sample Script"])
NOTE: If you receive 403 error you might have to add
String auth = "user" + ":" + "password"; byte[] encodedAuth = auth.bytes.encodeBase64().toString(); String authHeaderValue = "Basic " + new String(encodedAuth);
and then insert ,"Authorization": authHeaderValue
to requestProperties
And then instead of
<img lazymap="${allureResultsUrl}/graphMap" src="${allureResultsUrl}/graph" alt="Allure results trend"/>
add
<img src="data:image/png;base64, ${content.encodeBase64().toString()}"/>
Solution will save and then embed image into an email.
@heksan great, thank you!
@letsrokk , @LearningNeverEnds OK, i have spent few hours on this but i have a solution that will let you email results even if your jenkins is behind proxy:
Add:
content=new URL("${allureResultsUrl}/graph").getBytes( useCaches: true, allowUserInteraction: false, requestProperties: ["User-Agent": "Groovy Sample Script"])
NOTE: If you receive 403 error you might have to add
String auth = "user" + ":" + "password"; byte[] encodedAuth = auth.bytes.encodeBase64().toString(); String authHeaderValue = "Basic " + new String(encodedAuth);
and then insert,"Authorization": authHeaderValue
torequestProperties
And then instead of
<img lazymap="${allureResultsUrl}/graphMap" src="${allureResultsUrl}/graph" alt="Allure results trend"/>
add
<img src="data:image/png;base64, ${content.encodeBase64().toString()}"/>
Solution will save and then embed image into an email.
Can you please tell me where should I add this code to see the image in email?
Hi, is it possbible to list the failed case names? not only the count?
Failed: ${lastAllureReportBuildAction.getFailedCount()}@hiwanglong as far as I know, the Allure plugin does not store this info in build results.
@VicharSharma
allure-report.groovy
template should be place into JENKINS_HOME/email-templates
folder
@VicharSharma
allure-report.groovy
template should be place intoJENKINS_HOME/email-templates
folder
@letsrokk
Thanks for the reply, but i was asking about the image solution which @heksan has provided.
In the email i am not able to see the graph.
Hi @LearningNeverEnds, were you able to get the graph image in the mail ?, if yes , can you please share ?
Is there a way I can manually trigger to resend the jenkins job email ?
Mysteriously, my Jenkins job stop sending emails, while all the setting looks OK to me, and "Test configuration by sending test e-mail" on "config system" page is also working fine. And the job console output also shows "email is being triggered".
I don't know what might be wrong ???
@chunji08 as far as I know, Jenkins does not allow user to restart job from certain step.
As for what could have gone wrong, I can't tell without looking for logs for errors or warnings
Hi @LearningNeverEnds, were you able to get the graph image in the mail ?, if yes , can you please share ?
I had the same issue as yours. and to work around, I have added this chunk in the allure-report.groovy file,
<tr> <th>Execution History:</th> <td><a href="${rooturl}${build.url}allure/graph">${rooturl}${build.url}allure/graph</a></td> <tr>
Thanks @letsrokki that was quite helpful!
@letsrokki @chunji08 I am still facing some issues. Let me try to explain it..
I have "Email Extension" Plugin installed on my Jenkins Server. I didn't see "email-templates" folder under $JENKINS_HOME. Hence I just created the "email-templates" manually and put "allure-report.groovy" file under $JENKINS_HOME/email-templates/allure-report.groovy..
I have the stage in my Jenkins pipeline as mentioned :
stage('Send Summary'){ emailext body: '''${SCRIPT, template="allure-report.groovy"}''', subject: "[Jenkins] Test Execution Summary", to: "all@example.com" }
I am sending this email to outlook. in the email body I see the content whatever I have put in allure-report.groovy. but not like how you mentioned in the above message
tell me how to send the report, sequentially, where to insert it ,what to change, for me it's just two pieces of code, and what to do step by step, I have not found.please explain
hi @letsrokk, can you help me take a look why it returns null when I call AllureReportBuildAction, I added allure plugin to my jenkins, but it still doesn't work. Do I need to add one more things to jenkins?
Is there a way by which we can print the test case title in the email?
hi, @letsrokk can you help me I need to add the test pass percentage and started by the user in an email report.
If I run allure-report.groovy script I can see Project Name, Build number, Date of build, and Build duration in the email I would like to see Test pass percentage and started by user or build username in the email.
@madhusudhan411994
Even though its old post, I am sharing the code which has worked for me to help others.
1.For Success rate: you can use as mentioned in the original code
<tr>
<th>Success rate: </th>
<td>${allureLastBuildSuccessRate}% </td>
</tr>
- User name or build user: Formatted table:
<table>
<tbody>
<tr>
<th>Automation Suite:</th>
<td>${project.name}</td>
</tr>
<tr>
<th>Automation Cycle ID: </th>
<td>
${build.displayName}: (<a href="${rooturl}${build.url}">${rooturl}${build.url})</a>
</td>
</tr>
<tr>
<th>Automation Report: </th>
<td>
<a href="${allureResultsUrl}"> ${allureResultsUrl}</a>
</td>
</tr>
<tr>
<th>Automation Date:</th>
<td>${it.timestampString}</td>
</tr>
<tr>
<th>Automation duration:</th>
<td>${build.durationString}</td>
</tr>
<tr>
<th>Automation Started By:</th>
<%
cause = build.getCause(hudson.model.Cause.UserIdCause.class)
user_name = cause.getUserName()
%>
<td>${user_name} </td>
</tr>
</tbody>
</table>
Exception raised during template rendering: Failed to parse template script (your template may contain an error or be trying to use expressions not currently supported): Failed to create Script instance for class: class SimpleTemplateScript26. Reason: java.lang.SecurityException: Rejecting unsandboxed super constructor call: hudson.plugins.emailext.plugins.content.EmailExtScript() groovy.lang.GroovyRuntimeException: Failed to parse template script (your template may contain an error or be trying to use expressions not currently supported): Failed to create Script instance for class: class SimpleTemplateScript26. Reason: java.lang.SecurityException: Rejecting unsandboxed super constructor call: hudson.plugins.emailext.plugins.content.EmailExtScript() at groovy.text.SimpleTemplateEngine.createTemplate(SimpleTemplateEngine.java:128) at groovy.text.TemplateEngine.createTemplate(TemplateEngine.java:41) at hudson.plugins.emailext.plugins.content.ScriptContent.renderTemplate(ScriptContent.java:144) at hudson.plugins.emailext.plugins.content.ScriptContent.evaluate(ScriptContent.java:81) at org.jenkinsci.plugins.tokenmacro.DataBoundTokenMacro.evaluate(DataBoundTokenMacro.java:208) at org.jenkinsci.plugins.tokenmacro.Parser.processToken(Parser.java:325) at org.jenkinsci.plugins.tokenmacro.Action$KiHW1UeqOdqAwZul.run(Unknown Source) at org.parboiled.matchers.ActionMatcher.match(ActionMatcher.java:96) at org.parboiled.parserunners.BasicParseRunner.match(BasicParseRunner.java:77) at org.parboiled.MatcherContext.runMatcher(MatcherContext.java:351) at org.parboiled.matchers.SequenceMatcher.match(SequenceMatcher.java:46) at org.parboiled.parserunners.BasicParseRunner.match(BasicParseRunner.java:77) at org.parboiled.MatcherContext.runMatcher(MatcherContext.java:351) at org.parboiled.matchers.FirstOfMatcher.match(FirstOfMatcher.java:41) at org.parboiled.parserunners.BasicParseRunner.match(BasicParseRunner.java:77) at org.parboiled.MatcherContext.runMatcher(MatcherContext.java:351) at org.parboiled.matchers.FirstOfMatcher.match(FirstOfMatcher.java:41) at org.parboiled.parserunners.BasicParseRunner.match(BasicParseRunner.java:77) at org.parboiled.MatcherContext.runMatcher(MatcherContext.java:351) at org.parboiled.matchers.ZeroOrMoreMatcher.match(ZeroOrMoreMatcher.java:39) at org.parboiled.parserunners.BasicParseRunner.match(BasicParseRunner.java:77) at org.parboiled.MatcherContext.runMatcher(MatcherContext.java:351) at org.parboiled.matchers.SequenceMatcher.match(SequenceMatcher.java:46) at org.parboiled.parserunners.BasicParseRunner.match(BasicParseRunner.java:77) at org.parboiled.MatcherContext.runMatcher(MatcherContext.java:351) at org.parboiled.parserunners.BasicParseRunner.run(BasicParseRunner.java:72) at org.parboiled.parserunners.ReportingParseRunner.runBasicMatch(ReportingParseRunner.java:86) at org.parboiled.parserunners.ReportingParseRunner.run(ReportingParseRunner.java:66) at org.parboiled.parserunners.AbstractParseRunner.run(AbstractParseRunner.java:81) at org.parboiled.parserunners.AbstractParseRunner.run(AbstractParseRunner.java:76) at org.jenkinsci.plugins.tokenmacro.Parser.process(Parser.java:85) at org.jenkinsci.plugins.tokenmacro.Parser.process(Parser.java:74) at org.jenkinsci.plugins.tokenmacro.TokenMacro.expand(TokenMacro.java:199) at org.jenkinsci.plugins.tokenmacro.TokenMacro.expandAll(TokenMacro.java:237) at hudson.plugins.emailext.plugins.ContentBuilder.transformText(ContentBuilder.java:80) at hudson.plugins.emailext.ExtendedEmailPublisher.addContent(ExtendedEmailPublisher.java:874) at hudson.plugins.emailext.ExtendedEmailPublisher.createMail(ExtendedEmailPublisher.java:747) at hudson.plugins.emailext.ExtendedEmailPublisher.sendMail(ExtendedEmailPublisher.java:451) at hudson.plugins.emailext.EmailExtStep$EmailExtStepExecution.run(EmailExtStep.java:236) at hudson.plugins.emailext.EmailExtStep$EmailExtStepExecution.run(EmailExtStep.java:174) at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47) at hudson.security.ACL.impersonate(ACL.java:367) at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:44) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
Hi @dmitry Mayer, I am send email to outlook arise issue , how ? Looking forward to your reply ,thank you
Has anyone got a solution for showing images in the email from the trends? The below code doesn't work
<div>
<img lazymap="${allureResultsUrl}/graphMap" src="${allureResultsUrl}/graph" alt="Allure results trend"/>
</br>
</div>
It will not work. The email-template code does not have permissions to access that allure trend graph. So you need to use basic authentication.
Have the username password for your jenkins machine like this username:password Encode this to base64.
<%
String authHeaderValue = "Basic " + "<base64 encoded credentials>";
content=new URL("${allureResultsUrl}/graph").getBytes( useCaches: true, allowUserInteraction: false, requestProperties: ["User-Agent": "Groovy Sample Script", "Authorization": authHeaderValue, "Content-Type": "image/png"])
%>
Then convert the whole image to base64 and use it like the following.
<img src="data:image/png;base64, ${content.encodeBase64().toString()}"/>
This works for me.
pipeline {
agent any
stages {
stage("scm checkout") {
steps {
git branch: 'feature/wdio', credentialsId: '*******************', url: 'https://git.jamesavery.com/ecom/ecom_qa_automation.git'
}
}
stage('install dependencies') {
steps {
sh 'npm install --save'
}
}
stage('Run Automattion') {
steps {
echo 'run automation'
browserstack('26fd35b3-01ee-4253-912d-a1c7102c0f51') {
// some block
sh 'ENV=bld npm run local-desktopBstack'
}
}
}
}
post {
always {
allure includeProperties: false, jdk: '', results: [[path: 'src/allure-results']]
emailext attachLog: true, body: 'Automation test done on Build # $BUILD_NUMBER - $BUILD_STATUS, Allura report url:https://jenkins.jamesavery.com/job/jac-test2/$BUILD_NUMBER/allure!', compressLog: true, subject: 'JAC Automation Test Result', to: 'imtiyaz081@gmail.com '
}
}
}
Hi Friends plz help,
m able to generate allure result but not able to publish it in email plz help
Hi Friends plz help, m able to generate allure result but not able to publish it in email plz help
- Install a plugin called Config File Provider Plugin.
- When installed go to Dashboard -> Manage Jenkins -> Manage Files -> Add New Config File
- Click on the Extended Email Publisher Groovy Template radio then Next.
- Add a name and copy it also for later
- Add the HTML in Point 7 to the Content section and click on Submit.
- Add the other below content into your jenkins file
always {
allure jdk: '', results: [[path: 'allure-results']]
archiveArtifacts(artifacts: '**/TestCaptures/*.png', allowEmptyArchive: true, caseSensitive: false)
}
success {
echo "SUCCESS"
emailext to:'youremailhere',
subject: env.JOB_NAME,
body: '''${SCRIPT, template="managed:groovy-email-template"}'''
}
unstable {
echo "UNSTABLE"
emailext to:'youremailhere',
subject: env.JOB_NAME,
body: '''${SCRIPT, template="managed:groovy-email-template"}'''
}
failure {
echo "FAILURE"
emailext to:'youremailhere',
subject: env.JOB_NAME,
body: '''${SCRIPT, template="managed:groovy-email-template"}'''
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<style type="text/css">
body {
margin: 0px;
padding: 15px;
}
body, td, th {
font-family: "Lucida Grande", "Lucida Sans Unicode", Helvetica, Arial, Tahoma, sans-serif;
font-size: 10pt;
}
th {
text-align: left;
padding-left: 5px;
}
.section {
width: 50%;
border: thin black solid;
}
.status {
background-color:<%= build.result.toString() == "SUCCESS" ? 'green' : 'red' %>;
font-size:24px;
font-weight:bold;
color:white!important;
width:720px;
height:52px;
text-align:center;
vertical-align:middle;
border-collapse:collapse;
background-repeat:no-repeat;
}
</style>
<body>
<!-- BUILD RESULT -->
<table class="section">
<div>
<td class="status" colspan="2">${build.result}</td>
</div>
<tr>
<th>URL:</th>
<td><a href="${rooturl}${build.url}">${rooturl}${build.url}</a></td>
</tr>
<tr>
<th>Date:</th>
<td>${it.timestampString}</td>
</tr>
<tr>
<th>Duration:</th>
<td>${build.durationString}</td>
</tr>
<tr>
<th>Cause:</th>
<td><% build.causes.each() { cause -> %> ${cause.shortDescription} <% } %></td>
</tr>
</table>
<br/>
<!-- ALLURE REPORT -->
<%
lastAllureReportBuildAction = build.getAction(ru.yandex.qatools.allure.jenkins.AllureReportBuildAction.class)
lastAllureBuildAction = build.getAction(ru.yandex.qatools.allure.jenkins.AllureBuildAction.class)
if (lastAllureReportBuildAction) {
allureResultsUrl = "${rooturl}${build.url}allure"
allureLastBuildSuccessRate = String.format("%.2f", lastAllureReportBuildAction.getPassedCount() * 100f / lastAllureReportBuildAction.getTotalCount())
}
if (lastAllureReportBuildAction) {
%>
<table class="section">
<div>
<td class="status" colspan="2">ALLURE TEST RESULTS</td>
</div>
<tr>
<th>Total Tests:</th>
<td><a href="${allureResultsUrl}">${lastAllureReportBuildAction.getTotalCount()}</a></td>
</tr>
<tr>
<th>Failed:</th>
<td>${lastAllureReportBuildAction.getFailedCount()}</td>
</tr>
<tr>
<th>Passed:</th>
<td>${lastAllureReportBuildAction.getPassedCount()}</td>
</tr>
<tr>
<th>Skipped:</th>
<td>${lastAllureReportBuildAction.getSkipCount()}</td>
</tr>
<tr>
<th>Broken:</th>
<td>${lastAllureReportBuildAction.getBrokenCount()}</td>
</tr>
<tr>
<th>Success Rate: </th>
<td>${allureLastBuildSuccessRate}% </td>
</tr>
</table>
</br>
<% } %>
<!-- ALLURE IMAGE -->
<div>
<img lazymap="${allureResultsUrl}/graphMap" src="${allureResultsUrl}/graph" alt="Allure results trend"/>
</br>
</div>
<!-- ARTIFACTS -->
</br>
<div>
<% def artifacts = build.artifacts
if(artifacts != null && artifacts.size() > 0) { %>
<b>Build Artifacts:</b>
<ul>
<% artifacts.each() { f -> %>
<li><a href="${rooturl}${build.url}artifact/${f}">${f}</a></li>
<% } %>
</ul>
<% } %>
</div>
</body>
8.Check if email is working now. If not, you might need to install Email Extension plugin. If you need to install Email Extention make sure to change the Default Content Type to HTML. You can also do this by adding a flag to the jenkinsfile for your post conditions - mimeType: 'text/html'
As I mentioned before, there's an issue with images when you are linking them from Jenkins instance that is located in internal / private network that is not accessible from public. Some e-mail services are trying to cache / proxy images before displaying them (e.g. Google Mail). I do not have a workaround for that at the moment, unfortunately