Post Deploy Jenkins Job
Post Deployment Action
Post deployment action can be configured by following the steps from Configure Post Deployment Action. Once configured create a jenkins job with the job name same as job configured in post deployment actions to trigger jenkins job.
Note : Configure post deployment action with no parameters
Now create one more job with job name as test.stagename.applicationblueprintname (eg. test.CI.SOABlueprint)
Trigger post deployment action for Jenkins
Trigger post deployment actions reads all the application blueprints deployed, executes application blueprint test jobs and produces job execution results with junit reports.
Configure this as a groovy script.
import hudson.model.*
import hudson.AbortException
import hudson.console.HyperlinkNote
import java.util.concurrent.CancellationException
import groovy.json.JsonSlurper
import hudson.EnvVars
EnvVars envVars = build.getEnvironment(listener);
// Retrieve parameters of the current build
def payload = build.buildVariableResolver.resolve("jsonpayload")
// println payload
def jsonPayloadStr=payload
def jsonSlurper = new JsonSlurper()
def jsonObject = jsonSlurper.parseText(jsonPayloadStr)
applicationBlueprintsDeployed=jsonObject.pipeline.data.stream.applications.findAll { it.deployed == true }
public class JobExecutionResult {
String jobName;
String jobUrl;
FreeStyleBuild build;
Result result() {
this.build.result;
}
double getDurationInSeconds() {
this.build.getDuration()/1000.0
}
}
public class ExecutionResult {
int tests;
int failures;
int errors;
int skips;
long durationInMillis;
def addDuration(long durationToAdd) {
this.durationInMillis += durationToAdd;
}
double getDurationInSeconds() {
this.durationInMillis/1000.0
}
}
def jobExecutionResults = [];
def executionResult = new ExecutionResult(tests: 0, failures: 0, errors: 0, skips: 0, durationInMillis: 0);
RESULT=""
overallFailure=false
(applicationBlueprintsDeployed.abpVersion).each {
stageName=jsonObject.pipeline.data.stage.name
testJobName="test."+stageName+"."+it.name
println "The following Application Blueprint test jobs will be executed:" + testJobName
def job = Hudson.instance.getJob(testJobName)
def anotherBuild
try {
def future = job.scheduleBuild2(0, new Cause.UpstreamCause(build))
println "Waiting for the completion of " + HyperlinkNote.encodeTo('/' + job.url, job.fullDisplayName)
anotherBuild = future.get()
println anotherBuild.getClass();
} catch (CancellationException x) {
executionResult.skips++;
return;
} catch (Exception x) {
executionResult.skips++;
return;
}
println HyperlinkNote.encodeTo('/' + anotherBuild.url, anotherBuild.fullDisplayName) + " completed. Result was " + anotherBuild.result
// Check that it succeeded
build.result = anotherBuild.result
// Update the result
def jobExecutionResult = new JobExecutionResult(jobName: testJobName, jobUrl: anotherBuild.fullDisplayName, build: anotherBuild);
executionResult.tests++;
if (anotherBuild.result != Result.SUCCESS && anotherBuild.result != Result.UNSTABLE) {
// We abort this build right here and now.
//throw new AbortException("${anotherBuild.fullDisplayName} failed.")
RESULT=RESULT+" / ${anotherBuild.fullDisplayName} Failed"
overallFailure=true
executionResult.errors++;
}
else {
RESULT=RESULT+" / ${anotherBuild.fullDisplayName} Successful"
}
executionResult.addDuration(anotherBuild.getDuration());
jobExecutionResults.add(jobExecutionResult);
}
println "=="
println "=="
println "=============> " + RESULT
println "=="
println "=="
// Output executionResult and jobExecutionResults as a junit report.
def executionResultsFilename = envVars.get('WORKSPACE') + "/MyST-JobInvoker-TEST.xml";
def executionResultsFile = new File(executionResultsFilename);
executionResultsFile.createNewFile();
println "Created execution results file:" + executionResultsFilename;
executionResultsFile.write '<testsuite tests="'+ executionResult.tests +'" failures="'+ executionResult.failures + '" skips="' + executionResult.skips + '" errors="0" time="' + executionResult.getDurationInSeconds() + '" name="POC-JobInvoker">\n'
for (JobExecutionResult jobExecutionResult : jobExecutionResults) {
if (jobExecutionResult.result() == Result.SUCCESS) {
executionResultsFile.append '<testcase classname="' + jobExecutionResult.jobUrl + '" name="' + jobExecutionResult.jobName + '" time="' + jobExecutionResult.getDurationInSeconds() + '" />\n';
} else {
executionResultsFile.append '<testcase classname="' + jobExecutionResult.jobUrl + '" name="' + jobExecutionResult.jobName + '" time="' + jobExecutionResult.getDurationInSeconds() + '" >\n';
executionResultsFile.append '<failure message="test failure">\n';
executionResultsFile.append '<![CDATA[' + jobExecutionResult.build.getLog(999) + ']]>';
executionResultsFile.append '</failure>\n';
executionResultsFile.append '</testcase>\n';
}
}
executionResultsFile.append '</testsuite>\n'
// Output the junit report so it appears in the console logs
println '\n'
println executionResultsFile.text
println '\n'
println '<linkToHTMLReport>'
println envVars.get('BUILD_URL') + 'testReport/junit/';
println '</linkToHTMLReport>'
println '\n'
// Do something with the output.
// On the contrary to Parameterized Trigger Plugin, you may now do something from that other build instance.
// Like the parsing the build log (see http://javadoc.jenkins-ci.org/hudson/model/FreeStyleBuild.html )
// You probably may also wish to update the current job's environment.
//build.addAction(new ParametersAction(new StringParameterValue('BAR', '3')))
if (overallFailure) {
throw new AbortException("Tests Failure")
}