Currently my pipeline fails (red), when a maven-job is unstable (yellow).
node { stage 'Unit/SQL-Tests' parallel ( phase1: { build 'Unit-Tests' }, // maven phase2: { build 'SQL-Tests' } // shell ) stage 'Integration-Tests' build 'Integration-Tests' // maven }
In this example the job Unit-Test's result is unstable, but is shown as failed in the pipeline.
How can I change the jobs/pipeline/jenkins to have the (1) the pipeline step unstable instead of failed and (2) the pipeline's status unstable instead of failed.
I tried adding the MAVEN_OPTS
parameter -Dmaven.test.failure.ignore=true
, but that did not solve the issue. I am unsure how to wrap the build 'Unit-Test'
into some logic that can catch and process the result.
Adding a sub-pipeline with this logic doesn't do the trick, as there is no option to checkout from subversion (that option is available in a regular maven job). I would not like to use commandline checkout if possible.
Alternatively you can call error(String message) step to stop the pipeline and set its status to FAILED . For example, if your stage 1 calls error(msg) step like: stage("Stage 1") { steps { script { error "This pipeline stops here!" } } }
A Build is unstable if it was built successfully and one or more publishers report it unstable. For example if the JUnit publisher is configured and a test fails then the Build will be marked unstable.
Lessons learned:
currentBuild.result
value which can be either SUCCESS
, UNSTABLE
or FAILURE
(source).build job: <JOBNAME>
can be stored in a variable. The build status is in variable.result
.build job: <JOBNAME>, propagate: false
will prevent the whole build from failing right away.currentBuild.result
can only get worse. If that value was previously FAILED
and receives a new status SUCCESS
through currentBuild.result = 'SUCCESS'
it will stay FAILED
This is what I finally used:
node { def result // define the variable once in the beginning stage 'Unit/SQL-Tests' parallel ( phase1: { result = build job: 'Unit', propagate: false }, // might be UNSTABLE phase2: { build 'SQL-Tests' } ) currentBuild.result = result.result // update the build status. jenkins will update the pipeline's current status accordingly stage 'Install SQL' build 'InstallSQL' stage 'Deploy/Integration-Tests' parallel ( phase1: { build 'Deploy' }, phase2: { result = build job: 'Integration-Tests', propagate: false } ) currentBuild.result = result.result // should the Unit-Test be FAILED and Integration-Test SUCCESS, then the currentBuild.result will stay FAILED (it can only get worse) stage 'Code Analysis' build 'Analysis' }
Whatever the step is UNSTABLE or FAILED, the final build result in your script will be FAILED.
You can add propagate to false by default to avoid fail the flow.
def result = build job: 'test', propagate: false
In the end of the flow, you can verdict the final result based on what you got from the "result" variable.
For example
currentBuild.result='UNSTABLE'
Here is a detail example How to set current build result in Pipeline
Br,
Tim
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With