Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-61209

Issue in catchError functionality, Post feature is not working as expected

    XMLWordPrintable

    Details

    • Similar Issues:

      Description

      i have three stages 

      pipeline {
          agent {
              node {
                  label "myNode"
              }
          }
          stages {
              stage("Stage 1") {
                  steps {
                      catchError(buildResult: 'UNSTABLE', catchInterruptions: false, message: 'stage failed', stageResult: 'FAILURE') {
                          bat 'exit 1'
                      }
                  }
                  post {
                      success {
                          println "stage 1 Message from post: ........success........."
                      }
                      unstable {
                          println "stage 1 Message from post: ........unstable........"
                      }
                      failure {
                          println "Stage 1 Message from post: ........failure........."
                      }
                  }
              }
              stage("Stage 2") {
                  steps {
                      catchError(buildResult: 'UNSTABLE', catchInterruptions: false, message: 'stage failed', stageResult: 'FAILURE') {
                          bat "exit 0"
                      }
                  }
                  post {
                      success {
                          println "stage 2 Message from post: ........success........."
                      }
                      unstable {
                          println "stage 2 Message from post: ........unstable........"
                      }
                      failure {
                          println "stage 2 Message from post: ........failure........."
                      }
                  }
              }
       stage("Stage 3") {
                  steps {
                      catchError(buildResult: 'FAILURE', catchInterruptions: false, message: 'stage failed', stageResult: 'UNSTABLE') {
                          bat "exit 1"
                      }
                  }
                  post {
                      success {
                          println "stage 3 Message from post: ........success........."
                      }
                      unstable {
                          println "stage 3 Message from post: ........unstable........"
                      }
                      failure {
                          println "stage 3 Message from post: ........failure........."
                      }
                  }
              }
          }
      }
      

      As per the documentation, my output should be

      Stage 1 Message from post: ........failure.........
      stage 2 Message from post: ........success.........
      stage 3 Message from post: ........unstable.........
      

      But actually the output is

      Stage 1 Message from post: ........failure.........
      stage 2 Message from post: ........unstable........
      stage 3 Message from post: ........failure........
      

      After the analysis i found out that the post feature in stage block are working according to the buildResult rather than stage result.
      Post feature is working fine only for the first stage which got failed in the pipeline not for the subsequent stage.

        Attachments

          Activity

          Hide
          hql1991 California Sober added a comment -

          Hi there, just to add a few pieces of information to the discussion:

           

          I've been using Jenkins and ran into a use case trying to set stage and build status differently and finally ended up in this ticket.

          From the info in several tickets including this one, without actually reading tons of Jenkins source code, my guess is that the post for stage is likely evaluating against the worse result of current build and stage. If that's correct the example pipeline's behavior could be explained.

          Likely related w/ the "BuildCondition.combineResults" mentioned in this comment.

           

          Intuitively I think post for stage should only evaluate against the stage result, and post for whole pipeline should evaluate against the build result. But I'm not familiar w/ Jenkins source code so I'm not sure if that will run into any compatibility issue/historical design conflict and can't estimate how much work it would be.

          Show
          hql1991 California Sober added a comment - Hi there, just to add a few pieces of information to the discussion:   I've been using Jenkins and ran into a use case trying to set stage and build status differently and finally ended up in this ticket. From the info in several tickets including this one, without actually reading tons of Jenkins source code, my guess is that the post for stage is likely evaluating against the worse result of current build and stage. If that's correct the example pipeline's behavior could be explained. Likely related w/ the "BuildCondition.combineResults" mentioned in this comment .   Intuitively I think post for stage should only evaluate against the stage result, and post for whole pipeline should evaluate against the build result. But I'm not familiar w/ Jenkins source code so I'm not sure if that will run into any compatibility issue/historical design conflict and can't estimate how much work it would be.
          Hide
          ashkraba Aleksandr added a comment -

          Good day community. I have the same issue, but it is related to using "catchError" if you remove it everything will work fine:

          def list = []
          pipeline {
            stages {
                  stage('paralel'){
                      parallel{
                          stage('one') {
                              steps {
                                  sh 'exit 1'
                              }
                                  post {
                                      failure{    
                                  script {
                              list.add("one") 
                          }
                                      }
                                  }
                          }
                          stage('two') {
                              steps {
                                  sh 'exit 0'
                              }
                                  post {
                                      failure{    
                                  script {
                              list.add("two") 
                          }
                                      }
                                  }
                                  }
                              stage('three'){
                              steps {
                                  sh 'exit 1'
                              }
                                  post {
                                      failure{    
                                  script {
                              list.add("three") 
                                  }
                                  }
                                  }
                              }
                      }
                  }
              }    
            post{ 
              failure {
                  script{
                      println(list)
                  }
              }
            }
          }
          

          The result is as expected:

          [one, three]
          Show
          ashkraba Aleksandr added a comment - Good day community. I have the same issue, but it is related to using "catchError" if you remove it everything will work fine: def list = [] pipeline { stages { stage( 'paralel' ){ parallel{ stage( 'one' ) { steps { sh 'exit 1' } post { failure{ script { list.add( "one" ) } } } } stage( 'two' ) { steps { sh 'exit 0' } post { failure{ script { list.add( "two" ) } } } } stage( 'three' ){ steps { sh 'exit 1' } post { failure{ script { list.add( "three" ) } } } } } } } post{ failure { script{ println(list) } } } } The result is as expected: [one, three]
          Hide
          otrenkin Oleg added a comment -

          Hi, are there any updates or plans to fix related to this bug?

          Show
          otrenkin Oleg added a comment - Hi, are there any updates or plans to fix related to this bug?
          Hide
          jchauvet Jérémy Chauvet added a comment -

          Hi shubham srivastava ! Any update to share we us ?

          Show
          jchauvet Jérémy Chauvet added a comment - Hi shubham srivastava ! Any update to share we us ?
          Hide
          shubhamsrivastava726 shubham srivastava added a comment -

          Hi Liam, it will take sometime for me to fix this issue and create a PR for this.
          Thanks for your response.

          Show
          shubhamsrivastava726 shubham srivastava added a comment - Hi Liam, it will take sometime for me to fix this issue and create a PR for this. Thanks for your response.
          Hide
          bitwiseman Liam Newman added a comment -

          Hey, this is a great bug report. Thank you for the analysis.
          Would you be interested in submitting a PR to fix this? It seems like you're already a ways along in understanding it.

          Show
          bitwiseman Liam Newman added a comment - Hey, this is a great bug report. Thank you for the analysis. Would you be interested in submitting a PR to fix this? It seems like you're already a ways along in understanding it.
          Show
          shubhamsrivastava726 shubham srivastava added a comment - Above issue is related to this bugfix https://issues.jenkins-ci.org/browse/JENKINS-57826 . There is also an insufficient test case https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/master/pipeline-model-definition/src/test/resources/postStage/localAll.groovy in the code.

            People

            Assignee:
            bitwiseman Liam Newman
            Reporter:
            shubhamsrivastava726 shubham srivastava
            Votes:
            5 Vote for this issue
            Watchers:
            10 Start watching this issue

              Dates

              Created:
              Updated: