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

`when` only stores TagsAction for first occurrence of stage name (matrix limitation)

      see https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/220

      specifically https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/76afff0a26188ad6ced215e4663cd2115c003a74/pipeline-model-definition/src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/Utils.groovy#L240

      Stage name and ForkScanner is used rather than passing flownodes around.
      It just picks the first stage rather than the correct one.

      This can only happen in matrix pipelines.
      Regular declarative pipelines have this behaviour blocked:

      20:04:25  org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
      20:04:25  WorkflowScript: 4: Duplicate stage name: "Skipped" @ line 4, column 5.
      20:04:25         stages {
      

      but matrix can have duplicates:

      pipeline {
          agent none
          stages {
              stage('BuildAndTest') {
                  matrix {
                      agent any
                      axes {
                          axis {
                              name 'PLATFORM'
                              values 'linux', 'windows'
                          }
                          axis {
                              name 'BROWSER'
                              values 'firefox'
                          }
                      }
                      stages {
                          stage('Build') {
                              when {
                                  branch 'testing'
                              }
                              steps {
                                  echo "Do Build for ${PLATFORM} - ${BROWSER}"
                              }
                              
                          }
                      }
                  }
              }
          }
      }
      

      Looks like BlueOcean didn't fully switch to using TagsAction and falls back to not built if nothing is set.

          [JENKINS-72841] `when` only stores TagsAction for first occurrence of stage name (matrix limitation)

          Tim Jacomb created issue -
          Tim Jacomb made changes -
          Description Original: see https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/220 New: see https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/220

          Stage name and ForkScanner is used rather than passing flownodes around.
          It just picks the first stage rather than the correct one.

          This can happen in matrix pipelines.

          Looks like BlueOcean never switched to using TagsAction and just falls back to not built if nothing is set
          Tim Jacomb made changes -
          Description Original: see https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/220

          Stage name and ForkScanner is used rather than passing flownodes around.
          It just picks the first stage rather than the correct one.

          This can happen in matrix pipelines.

          Looks like BlueOcean never switched to using TagsAction and just falls back to not built if nothing is set
          New: see https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/220

          specifically https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/76afff0a26188ad6ced215e4663cd2115c003a74/pipeline-model-definition/src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/Utils.groovy#L240

          Stage name and ForkScanner is used rather than passing flownodes around.
          It just picks the first stage rather than the correct one.

          This can happen in matrix pipelines.

          Looks like BlueOcean never switched to using TagsAction and just falls back to not built if nothing is set
          Tim Jacomb made changes -
          Description Original: see https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/220

          specifically https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/76afff0a26188ad6ced215e4663cd2115c003a74/pipeline-model-definition/src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/Utils.groovy#L240

          Stage name and ForkScanner is used rather than passing flownodes around.
          It just picks the first stage rather than the correct one.

          This can happen in matrix pipelines.

          Looks like BlueOcean never switched to using TagsAction and just falls back to not built if nothing is set
          New: see https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/220

          specifically https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/76afff0a26188ad6ced215e4663cd2115c003a74/pipeline-model-definition/src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/Utils.groovy#L240

          Stage name and ForkScanner is used rather than passing flownodes around.
          It just picks the first stage rather than the correct one.

          This can only happen in matrix pipelines.
          Regular declarative pipelines have this behaviour blocked:
          {code}
          20:04:25 org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
          20:04:25 WorkflowScript: 4: Duplicate stage name: "Skipped" @ line 4, column 5.
          20:04:25 stages {
          {code}

          but declarative can have duplicates:
          {code}
          pipeline {
              agent none
              stages {
                  stage('BuildAndTest') {
                      matrix {
                          agent any
                          axes {
                              axis {
                                  name 'PLATFORM'
                                  values 'linux', 'windows'
                              }
                              axis {
                                  name 'BROWSER'
                                  values 'firefox'
                              }
                          }
                          stages {
                              stage('Build') {
                                  when {
                                      branch 'testing'
                                  }
                                  steps {
                                      echo "Do Build for ${PLATFORM} - ${BROWSER}"
                                  }
                                  
                              }
                          }
                      }
                  }
              }
          }
          {code}

          Looks like BlueOcean never switched to using TagsAction and just falls back to not built if nothing is set
          Tim Jacomb made changes -
          Description Original: see https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/220

          specifically https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/76afff0a26188ad6ced215e4663cd2115c003a74/pipeline-model-definition/src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/Utils.groovy#L240

          Stage name and ForkScanner is used rather than passing flownodes around.
          It just picks the first stage rather than the correct one.

          This can only happen in matrix pipelines.
          Regular declarative pipelines have this behaviour blocked:
          {code}
          20:04:25 org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
          20:04:25 WorkflowScript: 4: Duplicate stage name: "Skipped" @ line 4, column 5.
          20:04:25 stages {
          {code}

          but declarative can have duplicates:
          {code}
          pipeline {
              agent none
              stages {
                  stage('BuildAndTest') {
                      matrix {
                          agent any
                          axes {
                              axis {
                                  name 'PLATFORM'
                                  values 'linux', 'windows'
                              }
                              axis {
                                  name 'BROWSER'
                                  values 'firefox'
                              }
                          }
                          stages {
                              stage('Build') {
                                  when {
                                      branch 'testing'
                                  }
                                  steps {
                                      echo "Do Build for ${PLATFORM} - ${BROWSER}"
                                  }
                                  
                              }
                          }
                      }
                  }
              }
          }
          {code}

          Looks like BlueOcean never switched to using TagsAction and just falls back to not built if nothing is set
          New: see https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/220

          specifically https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/76afff0a26188ad6ced215e4663cd2115c003a74/pipeline-model-definition/src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/Utils.groovy#L240

          Stage name and ForkScanner is used rather than passing flownodes around.
          It just picks the first stage rather than the correct one.

          This can only happen in matrix pipelines.
          Regular declarative pipelines have this behaviour blocked:
          {code}
          20:04:25 org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
          20:04:25 WorkflowScript: 4: Duplicate stage name: "Skipped" @ line 4, column 5.
          20:04:25 stages {
          {code}

          but matrix can have duplicates:
          {code}
          pipeline {
              agent none
              stages {
                  stage('BuildAndTest') {
                      matrix {
                          agent any
                          axes {
                              axis {
                                  name 'PLATFORM'
                                  values 'linux', 'windows'
                              }
                              axis {
                                  name 'BROWSER'
                                  values 'firefox'
                              }
                          }
                          stages {
                              stage('Build') {
                                  when {
                                      branch 'testing'
                                  }
                                  steps {
                                      echo "Do Build for ${PLATFORM} - ${BROWSER}"
                                  }
                                  
                              }
                          }
                      }
                  }
              }
          }
          {code}

          Looks like BlueOcean never switched to using TagsAction and just falls back to not built if nothing is set
          Tim Jacomb made changes -
          Description Original: see https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/220

          specifically https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/76afff0a26188ad6ced215e4663cd2115c003a74/pipeline-model-definition/src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/Utils.groovy#L240

          Stage name and ForkScanner is used rather than passing flownodes around.
          It just picks the first stage rather than the correct one.

          This can only happen in matrix pipelines.
          Regular declarative pipelines have this behaviour blocked:
          {code}
          20:04:25 org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
          20:04:25 WorkflowScript: 4: Duplicate stage name: "Skipped" @ line 4, column 5.
          20:04:25 stages {
          {code}

          but matrix can have duplicates:
          {code}
          pipeline {
              agent none
              stages {
                  stage('BuildAndTest') {
                      matrix {
                          agent any
                          axes {
                              axis {
                                  name 'PLATFORM'
                                  values 'linux', 'windows'
                              }
                              axis {
                                  name 'BROWSER'
                                  values 'firefox'
                              }
                          }
                          stages {
                              stage('Build') {
                                  when {
                                      branch 'testing'
                                  }
                                  steps {
                                      echo "Do Build for ${PLATFORM} - ${BROWSER}"
                                  }
                                  
                              }
                          }
                      }
                  }
              }
          }
          {code}

          Looks like BlueOcean never switched to using TagsAction and just falls back to not built if nothing is set
          New: see https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/220

          specifically https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/76afff0a26188ad6ced215e4663cd2115c003a74/pipeline-model-definition/src/main/groovy/org/jenkinsci/plugins/pipeline/modeldefinition/Utils.groovy#L240

          Stage name and ForkScanner is used rather than passing flownodes around.
          It just picks the first stage rather than the correct one.

          This can only happen in matrix pipelines.
          Regular declarative pipelines have this behaviour blocked:
          {code}
          20:04:25 org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
          20:04:25 WorkflowScript: 4: Duplicate stage name: "Skipped" @ line 4, column 5.
          20:04:25 stages {
          {code}

          but matrix can have duplicates:
          {code}
          pipeline {
              agent none
              stages {
                  stage('BuildAndTest') {
                      matrix {
                          agent any
                          axes {
                              axis {
                                  name 'PLATFORM'
                                  values 'linux', 'windows'
                              }
                              axis {
                                  name 'BROWSER'
                                  values 'firefox'
                              }
                          }
                          stages {
                              stage('Build') {
                                  when {
                                      branch 'testing'
                                  }
                                  steps {
                                      echo "Do Build for ${PLATFORM} - ${BROWSER}"
                                  }
                                  
                              }
                          }
                      }
                  }
              }
          }
          {code}

          Looks like BlueOcean didn't fully switch to using TagsAction and falls back to not built if nothing is set.

          Tim Jacomb added a comment -

          I'm a bit stumped on a fix here, jglick or dnusbaum any idea?

          Best I can come up with is maybe some sort of ID can be added here:
          https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/c9d1c49f4e9db93535cab33ac0d2f45821b45eaa/pipeline-model-definition/src/main/resources/org/jenkinsci/plugins/pipeline/modeldefinition/ModelInterpreter.groovy#L302

          If this was a running pipeline with regular Jenkins code it would be straightforward, but declarative makes this a lot harder =/

          Tim Jacomb added a comment - I'm a bit stumped on a fix here, jglick or dnusbaum any idea? Best I can come up with is maybe some sort of ID can be added here: https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/c9d1c49f4e9db93535cab33ac0d2f45821b45eaa/pipeline-model-definition/src/main/resources/org/jenkinsci/plugins/pipeline/modeldefinition/ModelInterpreter.groovy#L302 If this was a running pipeline with regular Jenkins code it would be straightforward, but declarative makes this a lot harder =/
          Tim Jacomb made changes -
          Summary Original: `when` only stores TagsAction for first occurrence of stage name New: `when` only stores TagsAction for first occurrence of stage name (matrix limitation)

          Tim Jacomb added a comment -

          I experimented with https://github.com/jenkinsci/pipeline-model-definition-plugin/compare/master...timja:pipeline-model-definition-plugin:JENKINS-72841-pass-parent?expand=1

          Which passes the parent stage down and correctly finds its flownode, but when using ForkScanner it doesn't find the actual stage.

          any idea canuck1987 if you have a chance since you understand the flowgraph better than me

          Tim Jacomb added a comment - I experimented with https://github.com/jenkinsci/pipeline-model-definition-plugin/compare/master...timja:pipeline-model-definition-plugin:JENKINS-72841-pass-parent?expand=1 Which passes the parent stage down and correctly finds its flownode, but when using ForkScanner it doesn't find the actual stage. any idea canuck1987 if you have a chance since you understand the flowgraph better than me

          Tim Jacomb added a comment -

          Tim Jacomb added a comment - This explains the walking in that it does it in reverse order from the head passed to it: https://github.com/jenkinsci/workflow-api-plugin/blob/51fd2a625da7648f65f02e4e440a12a46bae0724/src/main/java/org/jenkinsci/plugins/workflow/graphanalysis/AbstractFlowScanner.java#L59

            timja Tim Jacomb
            timja Tim Jacomb
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: