Continue Jenkins pipeline past failed stage

JenkinsJenkins Pipeline

Jenkins Problem Overview


I have a series of stages that perform quick checks. I want to perform them all, even if there are failures. For example:

stage('one') {
    node {
        sh 'exit 0'
    }
}
stage('two') {
    node {
        sh 'exit 1'   // failure
    }
}
stage('three') {
    node {
        sh 'exit 0'
    }
}

Stage two fails, so by default stage three is not executed.

Ordinarily this would be a job for parallel, but I want to display them in the stage view. In the mock up below:

  • Build #4 shows what normally happens. Job two fails so three does not run.
  • I Photoshopped Build #6 to show what I would like to see. Job two fails and is displayed as such, but three still runs. The real Jenkins would probably display the entire Build #6 tinged slightly red, which is of course fine.

Mock up of desired Stage View result

Jenkins Solutions


Solution 1 - Jenkins

This is now possible. Below is an example of a declarative pipeline, but catchError works for scripted pipelines as well.

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.

EDIT: You need "Pipeline: Basic Steps" 2.16 (May 14, 2019)

Solution 2 - Jenkins

I had the same concern. I was able to resolve it doing this.

Second stage will show in red and be marked as failed while the rest of the stages will keep running. You can set a flag and at the end of the stages check the flag and inform the status of the whole build.

node {

    def build_ok = true

    stage('one') {
        sh 'exit 0'
    }

    try{
        stage('two') {
            sh 'exit 1'   // failure
        }
    } catch(e) {
        build_ok = false
        echo e.toString()  
    }

    stage('three') {
        sh 'exit 0'
    }

    ....

    if(build_ok) {
        currentBuild.result = "SUCCESS"
    } else {
        currentBuild.result = "FAILURE"
    }
}

Solution 3 - Jenkins

It depends whether you are using declarative pipeline syntax or scripted pipeline syntax.

declarative pipeline syntax:

pipeline {
	agent any
	stages {
		stage('one') {
			steps {
				sh 'exit 0'
			}
		}
		stage('two') {
			steps {
				sh 'exit 1'   // failure
			}
		}
	}
	post {
		always {
			sh 'exit 0'
		}
	}
}

Post-condition blocks contain steps the same as the steps section.

scripted pipeline syntax:

node {

    def build_ok = true

    stage('one') {
        sh 'exit 0'
    }

    try{
        stage('two') {
            sh 'exit 1'   // failure
        }
    } catch(e) {
        build_ok = false
        echo e.toString()  
    }

    stage('three') {
        sh 'exit 0'
    }

    if(build_ok) {
        currentBuild.result = "SUCCESS"
    } else {
        currentBuild.result = "FAILURE"
    }
}

Solution 4 - Jenkins

Solution: In order to always continue failed steps in your jenkins pipeline:

Option 1. wrap you function in try/catch or in bash script <someOpertation> || true

try/catch:

script {
  try {
      sh 'do your stuff'
  } catch (Exception e) {
      sh 'Handle the exception!'
  }
}

bash always true:

script {
  sh 'cp ~/someFile.txt ~/dev || true'
}

Option 2. run your jenkins pipeline in parallel and set failFast false configuration property in your step.

    pipeline {
    agent any
    stages {
        stage('Parallel Stage') {
            when {
                branch 'master'
            }
            failFast false
            parallel {
                stage('Branch A') {
                    agent {
                        label "for-branch-a"
                    }
                    steps {
                        echo "On Branch A"
                    }
                }
                stage('Branch B') {
                    agent {
                        label "for-branch-b"
                    }
                    steps {
                        echo "On Branch B"
                    }
                }
            }
        }
    }
}

Solution 5 - Jenkins

This should work. However all boxes are red if even only one fails, but you can see boxes with error marked, so you will easily distinguish failed jobs.

def indexes = ['one', 'two', 'three']

node() {
	for (index in indexes) {
		catchError {
			stage(index) {
				println index
				sh '''echo "123"'''
			}
		}
	}
}

Solution 6 - Jenkins

I resolved that, using post actions: https://jenkins.io/doc/pipeline/tour/post/

           post {
           	always {
              	...
            }
           }

Solution 7 - Jenkins

My simple suggestion, make use of shell scripts beauty like, $ cmd1 || cmd2: This will run cmd1, and in case of failure it will run cmd2. In your case cmd2 is simple "echo "cmd1 failed, proceeding next step" Thats all. It works like a charm :-)

Solution 8 - Jenkins

Try this example:

stage('StageName1')
{
	steps
	{
		catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE')
		{
			SomeCodeThatCanBeErrored
		}
	}
}
stage('StageName2')
{
	steps
	{
		ContinueOtherCode
	}
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohn McGeheeView Question on Stackoverflow
Solution 1 - JenkinsErik BView Answer on Stackoverflow
Solution 2 - JenkinsPablo DCView Answer on Stackoverflow
Solution 3 - JenkinsD-rkView Answer on Stackoverflow
Solution 4 - JenkinsavivamgView Answer on Stackoverflow
Solution 5 - JenkinsPavol TravnikView Answer on Stackoverflow
Solution 6 - JenkinsFrank EscobarView Answer on Stackoverflow
Solution 7 - JenkinsKrishnaView Answer on Stackoverflow
Solution 8 - Jenkins3Dark UnicornView Answer on Stackoverflow