Continue Jenkins pipeline past failed stage

前端 未结 8 1218
北荒
北荒 2020-12-13 12:23

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 {
              


        
相关标签:
8条回答
  • 2020-12-13 12:28

    Try this example:

    stage('StageName1')
    {
        steps
        {
            catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE')
            {
                SomeCodeThatCanBeErrored
            }
        }
    }
    stage('StageName2')
    {
        steps
        {
            ContinueOtherCode
        }
    }
    
    0 讨论(0)
  • 2020-12-13 12:32

    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:

    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)

    0 讨论(0)
  • 2020-12-13 12:39

    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"
        }
    }
    
    0 讨论(0)
  • 2020-12-13 12:41

    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"'''
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-13 12:42

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

               post {
                always {
                    ...
                }
               }
    
    0 讨论(0)
  • 2020-12-13 12:47

    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"
                        }
                    }
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题