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

Parallel sequential stages in Blue Ocean showing wrong status

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Critical Critical
    • blueocean-plugin
    • Jenkins version: 2.121.3
      Blue Ocean version: 1.8.2
      OS: RHEL7.2
      Browser: Google Chrome

      After updating the Blue ocean to the latest version 1.8.2 released 16 August, Blue Ocean is having issues displaying the status of parallel stages properly.

      I have 2 stages in parallel which contains several sequential stage each.
      While they are both processing, one of the parallel stages is showing as green (DONE) and the other shown as Processing but not displaying the triggered builds.

      You can find my pipeline code below.

       pipeline {
        agent any
        stages { stage('Pushing 2 Tests') {
          //failFast true
          parallel {     
           stage('TE1') {
            stages {
             stage('PUSH TE1') {
              steps {
               script {    
                //Trigger a job
                sleep time: 5, unit: 'MINUTES'        
                echo "Test1"        
               }
              }
             }
             stage('Archive Logs') {
              steps {
               script {
                echo "Archive Test1 Logs"       
               }
              }
             }
             stage('Insert Metrics') {
              steps {
               script {
                echo "Insert Test1 Metrics in DB"
               }
              }
             }
             stage('Compare Metrics') {
              steps {
               script {
                echo "Compare Metrics Test1 vs REF"
               }
              }
             }
            }
           }     
           stage('TE2') {
            stages {
             stage('PUSH TE2') {
              steps {
               script {
                //Trigger a job
                sleep time: 5, unit: 'MINUTES'
                echo "Test2"
               }
              }
             }
             stage('Archive Logs') {
              steps {
               script {
                echo "Archive Test2 Logs"
               }
              }
             }
             stage('Insert Metrics') {
              steps {
               script {
                echo "Insert Test2 Metrics in DB"
               }
              }
             }
             stage('Compare Metrics') {
              steps {
               script {
                echo "Compare Metrics Test2 vs REF"
               }
              }
             }
            }
           }    
          }
         }  
      }
      }
      

          [JENKINS-53129] Parallel sequential stages in Blue Ocean showing wrong status

          Elie Kassis added a comment -

          Thank you olamy.

          When it is expected to have the plugin patch ready in Jenkins ?

          Elie Kassis added a comment - Thank you olamy . When it is expected to have the plugin patch ready in Jenkins ?

          Olivier Lamy added a comment -

          ekassis Not sure. People are a bit busy this week with JW.

           

          Olivier Lamy added a comment - ekassis Not sure. People are a bit busy this week with JW.  

          Elie Kassis added a comment - - edited

          olamy the status issue was resolved with your last fix (Blue Ocean 1.8.3)(Jenkins 2.138.1), but the Triggered Builds Section is not appearing when having processing stage.
          The Triggered Build section is only appearing when the stage is done.

          In addition when having several parallel stages processing at the same time, only 1 of the stages is having the blue circle with the blue dot blinking inside.

          Can you please check?

          Elie Kassis added a comment - - edited olamy the status issue was resolved with your last fix (Blue Ocean 1.8.3)(Jenkins 2.138.1), but the Triggered Builds Section is not appearing when having processing stage. The Triggered Build section is only appearing when the stage is done. In addition when having several parallel stages processing at the same time, only 1 of the stages is having the blue circle with the blue dot blinking inside. Can you please check?

          Olivier Lamy added a comment - - edited

          Triggered Builds but how do you trigger the jobs?

          Olivier Lamy added a comment - - edited Triggered Builds but  how do you trigger the jobs?

          Elie Kassis added a comment - - edited

          I trigger jobs from inside the stage as shown below code sample.
          Noting that the Triggered Builds section was working properly previously before you started allowing in Blue Ocean to display sequential stages inside a parallel one.

          It is very important and crucial to see the Triggered Builds within a stage while PROCESSING and not just when the stage is DONE.

           

          stage('Pushing 2 Tests and 2 Debug jobs') {
              //failFast true
              when {
               expression {
                Push2TEs == 'true'
               }
              }
              parallel {     stage('TE1') {
                stages {
                 stage('PUSH TE1') {
                  options {
                   retry(2)
                   timeout(time: 3, unit: 'HOURS')
                  }
                  steps {
                   script {
                    timestamps {
                     println("${STAGE_BEGIN} PUSH TE1")
                     def TE1build = build job: "TESTING/${TEST_LABEL1}/PAC_PTE/0010.TESTING-Headline",
                      parameters: [
                       [$class: 'StringParameterValue', name: 'MX_VERSION', value: MX_VERSION],
                       [$class: 'StringParameterValue', name: 'MX_CHANGELIST', value: MX_CHANGELIST],
                       [$class: 'BooleanParameterValue', name: 'Execute_benchmark', value: true],
                       [$class: 'BooleanParameterValue', name: 'Generate_traceability_reports', value: true],
                       [$class: 'StringParameterValue', name: 'SETUPS', value: 'Custom'],
                       [$class: 'StringParameterValue', name: 'Custom_Script_Before', value: '/nfs_qa_pac/pac-pte/jenkins/getEnvProperties.sh'],
                       [$class: 'StringParameterValue', name: 'Custom_Script_After', value: '/nfs_qa_pac/pac-pte/jenkins/restoreEnv.sh']
                      ],
                      propagate: false
                     LogJobStatus("${TEST_LABEL1}", TE1build.result)
                     currentBuild.result = TE1build.result
                    }
                   }
                  }
                 }
                 stage('Archive Logs') {
                  steps {
                   script {
                    timestamps {
                     println("${STAGE_BEGIN} Archive ${TEST_LABEL1} Logs")
                     //sleep time: 1, unit: 'MINUTES'
                     def archiveLogsTE1 = build job: 'Archiving',
                      parameters: [
                       [$class: 'StringParameterValue', name: 'BENCH_MARK_NAME', value: TE1_BENCH_MARK_NAME],
                       [$class: 'StringParameterValue', name: 'VERSION', value: MX_VERSION],
                       [$class: 'StringParameterValue', name: 'CHANGELIST', value: MX_CHANGELIST],
                       [$class: 'StringParameterValue', name: 'APP_DIR', value: TE1_APP_DIR],
                       [$class: 'StringParameterValue', name: 'RESULTS_DIR', value: TE1_LOG_DIR],
                       [$class: 'StringParameterValue', name: 'KPI_DIR', value: TE1_WORKSPACE],
                       [$class: 'StringParameterValue', name: 'TPK', value: TPK],
                       [$class: 'StringParameterValue', name: 'JOB_ID', value: JOB_ID],
                       [$class: 'StringParameterValue', name: 'TEST_ID', value: TEST_LABEL1],
                       [$class: 'StringParameterValue', name: 'NODE', value: TE1_NODE]
                      ],
                      propagate: false
                     currentBuild.result = archiveLogsTE1.result
                     LogJobStatus("Archive ${TEST_LABEL1} Logs", archiveLogsTE1.result)           println("${STAGE_END} Archive ${TEST_LABEL1} Logs")
                    }
                   }
                  }
                 }
                }
               }     stage('TE2') {
                stages {
                 stage('PUSH TE2') {
                  options {
                   retry(2)
                   timeout(time: 3, unit: 'HOURS')
                  }
                  steps {
                   script {
                    timestamps {
                     println("${STAGE_BEGIN} PUSH TE2")
                     def TE2build = build job: "TESTING/${TEST_LABEL2}/PAC_PTE/0010.TESTING-Headline",
                      parameters: [
                       [$class: 'StringParameterValue', name: 'MX_VERSION', value: MX_VERSION],
                       [$class: 'StringParameterValue', name: 'MX_CHANGELIST', value: MX_CHANGELIST],
                       [$class: 'BooleanParameterValue', name: 'Execute_benchmark', value: true],
                       [$class: 'BooleanParameterValue', name: 'Generate_traceability_reports', value: true],
                       [$class: 'StringParameterValue', name: 'SETUPS', value: 'Custom'],
                       [$class: 'StringParameterValue', name: 'Custom_Script_Before', value: '/nfs_qa_pac/pac-pte/jenkins/getEnvProperties.sh'],
                       [$class: 'StringParameterValue', name: 'Custom_Script_After', value: '/nfs_qa_pac/pac-pte/jenkins/restoreEnv.sh']
                      ],
                      propagate: false
                     LogJobStatus("PUSH TE2", TE2build.result)
                     currentBuild.result = TE2build.result       
                    }
                   }
                  }
                 }
                 stage('Archive Logs') {
                  steps {
                   script {
                    timestamps {
                     println("${STAGE_BEGIN} Archive ${TEST_LABEL2} Logs")
                     //sleep time: 1, unit: 'MINUTES'
                     def archiveLogsTE2 = build job: 'Archiving',
                      parameters: [
                       [$class: 'StringParameterValue', name: 'BENCH_MARK_NAME', value: TE2_BENCH_MARK_NAME],
                       [$class: 'StringParameterValue', name: 'VERSION', value: MX_VERSION],
                       [$class: 'StringParameterValue', name: 'CHANGELIST', value: MX_CHANGELIST],
                       [$class: 'StringParameterValue', name: 'APP_DIR', value: TE2_APP_DIR],
                       [$class: 'StringParameterValue', name: 'RESULTS_DIR', value: TE2_LOG_DIR],
                       [$class: 'StringParameterValue', name: 'TPK', value: TPK],
                       [$class: 'StringParameterValue', name: 'JOB_ID', value: JOB_ID],
                       [$class: 'StringParameterValue', name: 'TEST_ID', value: TEST_LABEL2],
                       [$class: 'StringParameterValue', name: 'NODE', value: TE2_NODE]
                      ],
                      propagate: false
                     currentBuild.result = archiveLogsTE2.result
                     LogJobStatus("Archive ${TEST_LABEL2} Logs", archiveLogsTE2.result)           println("${STAGE_END} Archive ${TEST_LABEL2} Logs")
                    }
                   }
                  }
                 }
                }
               }     stage('HEAD DEBUG') {
                stages {
                 stage('PUSH HEAD DEBUG') {
                  options {
                   retry(2)
                   timeout(time: 2, unit: 'HOURS')
                  }
                  steps {
                   script {
                    timestamps {
                     println("${STAGE_BEGIN} PUSH HEAD DEBUG")
                     try {
                      //STREAM_ID='DEBUG230820181643'
                      def pushHeadDebugJob = build job: "TESTING/${STREAM_ID}/PAC_PTE/0010.TESTING-Headline",
                       parameters: [
                        [$class: 'StringParameterValue', name: 'MX_VERSION', value: MX_VERSION],
                        [$class: 'StringParameterValue', name: 'MX_CHANGELIST', value: MX_CHANGELIST],
                        [$class: 'BooleanParameterValue', name: 'Execute_benchmark', value: false],
                        [$class: 'BooleanParameterValue', name: 'Generate_traceability_reports', value: false],
                        [$class: 'StringParameterValue', name: 'SETUPS', value: 'Custom'],
                        [$class: 'StringParameterValue', name: 'Custom_Script_Before', value: '/nfs_qa_pac/pac-pte/jenkins/getEnvProperties.sh'],
                        [$class: 'StringParameterValue', name: 'Custom_Script_After', value: '/nfs_qa_pac/pac-pte/jenkins/restoreEnv.sh']
                       ],
                       propagate: false
                      currentBuild.result = pushHeadDebugJob.result           } catch (all) {
                      echo 'Pushing Head Debug job Failed'
                      return 0
                     }
                     println("${STAGE_END} PUSH HEAD DEBUG")
                    }
                   }
                  }
                 }
                 stage('DEPLOY CLIENT HEAD') {
                  steps {
                   script {
                    timestamps {
                     println("${STAGE_BEGIN} Deploying Client HEAD")
                     try {
                      def DeployClient = build job: 'DeployClient',
                       parameters: [
                        [$class: 'StringParameterValue', name: 'NODE', value: 'pacpte_pte02nt'],
                        [$class: 'StringParameterValue', name: 'PROPERTIES', value: '/nfs_qa_pac/pac-pte/jenkins/env_properties/0010.TESTING-' + STREAM_ID + '-Headline.properties'],
                        [$class: 'StringParameterValue', name: 'CHANGELIST', value: MX_CHANGELIST],
                        [$class: 'StringParameterValue', name: 'OPERATING_SYSTEM', value: OPERATING_SYSTEM],
                        [$class: 'StringParameterValue', name: 'DEBUG_NODE', value: HEAD_DEBUG_NODE],
                        [$class: 'StringParameterValue', name: 'DEBUG_APP_DIR', value: HEAD_DEBUG_APP_DIR]
                       ],
                       propagate: false
                      currentBuild.result = DeployClient.result
                     } catch (all) {
                      echo 'Deploy Head Debug Client Failed'
                      return 0
                     }
                     println("${STAGE_END} Deploying Client HEAD")
                    }
                   }
                  }
                 }
                }
               }    }
             }
          

          Elie Kassis added a comment - - edited I trigger jobs from inside the stage as shown below code sample. Noting that the Triggered Builds section was working properly previously before you started allowing in Blue Ocean to display sequential stages inside a parallel one. It is very important and crucial to see the Triggered Builds within a stage while PROCESSING and not just when the stage is DONE.   stage( 'Pushing 2 Tests and 2 Debug jobs' ) { //failFast true when { expression { Push2TEs == ' true ' } } parallel { stage( 'TE1' ) { stages { stage( 'PUSH TE1' ) { options { retry(2) timeout(time: 3, unit: 'HOURS' ) } steps { script { timestamps { println( "${STAGE_BEGIN} PUSH TE1" ) def TE1build = build job: "TESTING/${TEST_LABEL1}/PAC_PTE/0010.TESTING-Headline" , parameters: [ [$class: 'StringParameterValue' , name: 'MX_VERSION' , value: MX_VERSION], [$class: 'StringParameterValue' , name: 'MX_CHANGELIST' , value: MX_CHANGELIST], [$class: 'BooleanParameterValue' , name: 'Execute_benchmark' , value: true ], [$class: 'BooleanParameterValue' , name: 'Generate_traceability_reports' , value: true ], [$class: 'StringParameterValue' , name: 'SETUPS' , value: 'Custom' ], [$class: 'StringParameterValue' , name: 'Custom_Script_Before' , value: '/nfs_qa_pac/pac-pte/jenkins/getEnvProperties.sh' ], [$class: 'StringParameterValue' , name: 'Custom_Script_After' , value: '/nfs_qa_pac/pac-pte/jenkins/restoreEnv.sh' ] ], propagate: false LogJobStatus( "${TEST_LABEL1}" , TE1build.result) currentBuild.result = TE1build.result } } } } stage( 'Archive Logs' ) { steps { script { timestamps { println( "${STAGE_BEGIN} Archive ${TEST_LABEL1} Logs" ) //sleep time: 1, unit: 'MINUTES' def archiveLogsTE1 = build job: 'Archiving' , parameters: [ [$class: 'StringParameterValue' , name: 'BENCH_MARK_NAME' , value: TE1_BENCH_MARK_NAME], [$class: 'StringParameterValue' , name: 'VERSION' , value: MX_VERSION], [$class: 'StringParameterValue' , name: 'CHANGELIST' , value: MX_CHANGELIST], [$class: 'StringParameterValue' , name: 'APP_DIR' , value: TE1_APP_DIR], [$class: 'StringParameterValue' , name: 'RESULTS_DIR' , value: TE1_LOG_DIR], [$class: 'StringParameterValue' , name: 'KPI_DIR' , value: TE1_WORKSPACE], [$class: 'StringParameterValue' , name: 'TPK' , value: TPK], [$class: 'StringParameterValue' , name: 'JOB_ID' , value: JOB_ID], [$class: 'StringParameterValue' , name: 'TEST_ID' , value: TEST_LABEL1], [$class: 'StringParameterValue' , name: 'NODE' , value: TE1_NODE] ], propagate: false currentBuild.result = archiveLogsTE1.result LogJobStatus( "Archive ${TEST_LABEL1} Logs" , archiveLogsTE1.result) println( "${STAGE_END} Archive ${TEST_LABEL1} Logs" ) } } } } } } stage( 'TE2' ) { stages { stage( 'PUSH TE2' ) { options { retry(2) timeout(time: 3, unit: 'HOURS' ) } steps { script { timestamps { println( "${STAGE_BEGIN} PUSH TE2" ) def TE2build = build job: "TESTING/${TEST_LABEL2}/PAC_PTE/0010.TESTING-Headline" , parameters: [ [$class: 'StringParameterValue' , name: 'MX_VERSION' , value: MX_VERSION], [$class: 'StringParameterValue' , name: 'MX_CHANGELIST' , value: MX_CHANGELIST], [$class: 'BooleanParameterValue' , name: 'Execute_benchmark' , value: true ], [$class: 'BooleanParameterValue' , name: 'Generate_traceability_reports' , value: true ], [$class: 'StringParameterValue' , name: 'SETUPS' , value: 'Custom' ], [$class: 'StringParameterValue' , name: 'Custom_Script_Before' , value: '/nfs_qa_pac/pac-pte/jenkins/getEnvProperties.sh' ], [$class: 'StringParameterValue' , name: 'Custom_Script_After' , value: '/nfs_qa_pac/pac-pte/jenkins/restoreEnv.sh' ] ], propagate: false LogJobStatus( "PUSH TE2" , TE2build.result) currentBuild.result = TE2build.result } } } } stage( 'Archive Logs' ) { steps { script { timestamps { println( "${STAGE_BEGIN} Archive ${TEST_LABEL2} Logs" ) //sleep time: 1, unit: 'MINUTES' def archiveLogsTE2 = build job: 'Archiving' , parameters: [ [$class: 'StringParameterValue' , name: 'BENCH_MARK_NAME' , value: TE2_BENCH_MARK_NAME], [$class: 'StringParameterValue' , name: 'VERSION' , value: MX_VERSION], [$class: 'StringParameterValue' , name: 'CHANGELIST' , value: MX_CHANGELIST], [$class: 'StringParameterValue' , name: 'APP_DIR' , value: TE2_APP_DIR], [$class: 'StringParameterValue' , name: 'RESULTS_DIR' , value: TE2_LOG_DIR], [$class: 'StringParameterValue' , name: 'TPK' , value: TPK], [$class: 'StringParameterValue' , name: 'JOB_ID' , value: JOB_ID], [$class: 'StringParameterValue' , name: 'TEST_ID' , value: TEST_LABEL2], [$class: 'StringParameterValue' , name: 'NODE' , value: TE2_NODE] ], propagate: false currentBuild.result = archiveLogsTE2.result LogJobStatus( "Archive ${TEST_LABEL2} Logs" , archiveLogsTE2.result) println( "${STAGE_END} Archive ${TEST_LABEL2} Logs" ) } } } } } } stage( 'HEAD DEBUG' ) { stages { stage( 'PUSH HEAD DEBUG' ) { options { retry(2) timeout(time: 2, unit: 'HOURS' ) } steps { script { timestamps { println( "${STAGE_BEGIN} PUSH HEAD DEBUG" ) try { //STREAM_ID= 'DEBUG230820181643' def pushHeadDebugJob = build job: "TESTING/${STREAM_ID}/PAC_PTE/0010.TESTING-Headline" , parameters: [ [$class: 'StringParameterValue' , name: 'MX_VERSION' , value: MX_VERSION], [$class: 'StringParameterValue' , name: 'MX_CHANGELIST' , value: MX_CHANGELIST], [$class: 'BooleanParameterValue' , name: 'Execute_benchmark' , value: false ], [$class: 'BooleanParameterValue' , name: 'Generate_traceability_reports' , value: false ], [$class: 'StringParameterValue' , name: 'SETUPS' , value: 'Custom' ], [$class: 'StringParameterValue' , name: 'Custom_Script_Before' , value: '/nfs_qa_pac/pac-pte/jenkins/getEnvProperties.sh' ], [$class: 'StringParameterValue' , name: 'Custom_Script_After' , value: '/nfs_qa_pac/pac-pte/jenkins/restoreEnv.sh' ] ], propagate: false currentBuild.result = pushHeadDebugJob.result } catch (all) { echo 'Pushing Head Debug job Failed' return 0 } println( "${STAGE_END} PUSH HEAD DEBUG" ) } } } } stage( 'DEPLOY CLIENT HEAD' ) { steps { script { timestamps { println( "${STAGE_BEGIN} Deploying Client HEAD" ) try { def DeployClient = build job: 'DeployClient' , parameters: [ [$class: 'StringParameterValue' , name: 'NODE' , value: 'pacpte_pte02nt' ], [$class: 'StringParameterValue' , name: 'PROPERTIES' , value: '/nfs_qa_pac/pac-pte/jenkins/env_properties/0010.TESTING-' + STREAM_ID + '-Headline.properties' ], [$class: 'StringParameterValue' , name: 'CHANGELIST' , value: MX_CHANGELIST], [$class: 'StringParameterValue' , name: 'OPERATING_SYSTEM' , value: OPERATING_SYSTEM], [$class: 'StringParameterValue' , name: 'DEBUG_NODE' , value: HEAD_DEBUG_NODE], [$class: 'StringParameterValue' , name: 'DEBUG_APP_DIR' , value: HEAD_DEBUG_APP_DIR] ], propagate: false currentBuild.result = DeployClient.result } catch (all) { echo 'Deploy Head Debug Client Failed' return 0 } println( "${STAGE_END} Deploying Client HEAD" ) } } } } } } } }

          Elie Kassis added a comment -

          olamy, you can find below for sequential Processing stages, Blue Ocean is showing the Triggered Builds section.

           

          Elie Kassis added a comment - olamy , you can find below for sequential Processing stages, Blue Ocean is showing the Triggered Builds section.  

          Elie Kassis added a comment -

          olamy, a new bug detected, when the first stage in a sequential parallel pipeline is done, the Processing stages got wrong status and show only 1 stage processing even thought there are 4 stages processing.

          Elie Kassis added a comment - olamy , a new bug detected, when the first stage in a sequential parallel pipeline is done, the Processing stages got wrong status and show only 1 stage processing even thought there are 4 stages processing.

          Olivier Lamy added a comment -

          ekassis please stop hijacking this issue. You reopen it and changing the description. This is totally wrong! it's a thread in a mailing list. So please open a new issue with correct description.

          Olivier Lamy added a comment - ekassis please stop hijacking this issue. You reopen it and changing the description. This is totally wrong! it's a thread in a mailing list. So please open a new issue with correct description.

          Olivier Lamy added a comment -

          please open an other issue regarding the "Triggered Builds"

          Olivier Lamy added a comment - please open an other issue regarding the "Triggered Builds"

          Elie Kassis added a comment -

          Sorry olamy, a new Jira issue opened:     JENKINS-53735

          Elie Kassis added a comment - Sorry olamy , a new Jira issue opened:      JENKINS-53735

            olamy Olivier Lamy
            ekassis Elie Kassis
            Votes:
            1 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: