Show a Jenkins pipeline stage as failed without failing the whole job Show a Jenkins pipeline stage as failed without failing the whole job jenkins jenkins

Show a Jenkins pipeline stage as failed without failing the whole job


This is now possible, even with declarative pipelines:

pipeline {    agent any    stages {        stage('1') {            steps {                sh 'exit 0'            }        }        stage('2') {            steps {                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {                    sh "exit 1"                }            }        }        stage('3') {            steps {                sh 'exit 0'            }        }    }}

In the example above, all stages will execute, the pipeline will be successful, but stage 2 will show as failed:

Pipeline Example

As you might have guessed, you can freely choose the buildResult and stageResult, in case you want it to be unstable or anything else. You can even fail the build and continue the execution of the pipeline.

Just make sure your Jenkins is up to date, since this is a fairly new feature.


Stage takes a block now, so wrap the stage in try-catch. Try-catch inside the stage makes it succeed.

The new feature mentioned earlier will be more powerful. In the meantime:

try {   stage('end-to-end-tests') {     node {             def e2e = build job:'end-to-end-tests', propagate: false       result = e2e.result       if (result.equals("SUCCESS")) {       } else {          sh "exit 1" // this fails the stage       }     }   }} catch (e) {   result = "FAIL" // make sure other exceptions are recorded as failure too}stage('deploy') {   if (result.equals("SUCCESS")) {      build 'deploy'   } else {      echo "Cannot deploy without successful build" // it is important to have a deploy stage even here for the current visualization   }}


Sounds like JENKINS-26522. Currently the best you can do is set an overall result:

if (result.equals("SUCCESS")) {    stage 'deploy'    build 'deploy'} else {    currentBuild.result = e2e.result    // but continue}