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

Allow sequential stages inside parallel in Scripted syntax

    XMLWordPrintable

    Details

    • Similar Issues:

      Description

      Similar to JENKINS-46809, I would like the Blue Ocean GUI to properly visualize multiple stages in sequence that are all parallel of each other. Below is an example image of what this looks like using declarative syntax (working):

       

      Here is the declarative example code I wrote to generate the example image:

      pipeline {
        agent { label 'master' }
        stages {
          stage('Build and Test') {
            parallel {
              stage("Build and Test Linux") {
                stages {
                  stage("Build (Linux)") {
                    agent any
                    steps {
                      echo "Inside for loop 1"
                    }
                  }
                  stage("Test (Linux)") {
                    agent any
                    steps {
                      echo "Inside for loop 2"
                    }
                  }
                }
              }
              stage("Build and Test Windows") {
                stages {
                  stage("Build (Windows)") {
                    agent any
                    steps {
                      echo "Inside for loop 3"
                    }
                  }
                  stage("Test (Windows)") {
                    agent any
                    steps {
                      echo "Inside for loop 4"
                    }
                  }
                }
              }
            }
          }
        }
      }

       

      Here is example scripted Jenkins code that I would like to use. Linux and windows build/test flows happen in parallel. Inside each flow in a "build" stage and then a "test" stage. The Windows sequential build/test flow should be displayed in parallel with the Linux build/test flow, but right now the separate Build/Test sequential stages are combined into one circle/stage when using the scripted syntax.

       

      pipeline {
        agent any
        stages {
          stage("Build and Test") {
            steps {
              script {
                parallel linux: {
                  node("linux_build") {
                    echo "Inside for loop 1"
                  }
                  node("linux_test") {
                    echo "Inside for loop 2"
                  }
                },
                windows: {
                  node("windows_build") {
                    echo "Inside for loop 3"
                  }
                  node("windows_test") {
                    echo "Inside for loop 4"
                  }
                }
              }
            }
          }
        }
      }
      

       

      This is what the scripted example code currently generates:

       

        Attachments

          Issue Links

            Activity

            Hide
            peacemoon An Tran added a comment -
            Show
            peacemoon An Tran added a comment - I found some tickets that maybe related: https://issues.jenkins-ci.org/browse/JENKINS-53751 https://issues.jenkins-ci.org/browse/JENKINS-53162  
            Hide
            acarr468 Adam Carroll added a comment -

            Thanks Jesse Glick and An Tran for digging into this more! I personally am not concerned whether or not this is a bug or improvement, as long as it is fixed . It does sound a lot like a bug to me, but I do understand the argument for it being an improvement. Whatever the best path to resolution is will be fine with me.

            Based on the tickets An Tran linked above, it looks like others desire this functionality as well.

            Show
            acarr468 Adam Carroll added a comment - Thanks Jesse Glick and An Tran for digging into this more! I personally am not concerned whether or not this is a bug or improvement, as long as it is fixed . It does sound a lot like a bug to me, but I do understand the argument for it being an improvement. Whatever the best path to resolution is will be fine with me. Based on the tickets An Tran linked above, it looks like others desire this functionality as well.
            Hide
            mahima Mahima Mishra added a comment - - edited

            I am also stuck in the same situation, where I need to use scripted parallel block within declarative and the blueocean view is doesn't display the stages for scripted block correctly.

            Show
            mahima Mahima Mishra added a comment - - edited I am also stuck in the same situation, where I need to use scripted parallel block within declarative and the blueocean view is doesn't display the stages for scripted block correctly.
            Hide
            betoz Alberto Arango added a comment -

            Here I share three code examples (bottom of this comment)

            1. declarative parallel within declarative pipeline
            2. scripted parallel within scripted pipeline
            3. scripted parallel within declarative pipeline

            The first two get visualized as expected.

            The third one gets a messed up visualization starting at the parallel part, i.e. also affects the next non-parallel stage.

            The code

            • declarative parallel within declarative pipeline
              pipeline {
                  agent("none")
                  stages {
                      stage("prepare") {steps {echo "prepare"}}
                      stage("build") {steps {echo "build"}}
                      stage("test") {
                          parallel {
                              stage("linux") {
                                  stages {
                                      stage("install") {steps {echo "installing in linux"}}
                                      stage("test") {steps {echo "testing in linux"}}
                                  }
                              }
                              stage("windows") {
                                  stages {
                                      stage("install") {steps {echo "installing in windows"}}
                                      stage("test") {steps {echo "testing in windows"}}
                                  }
                              }
                              stage("mac") {
                                  stages {
                                      stage("install") {steps {echo "installing in mac"}}
                                      stage("test") {steps {echo "testing in mac"}}
                                  }
                              }
                          }
                      }
                      stage("cleanup") {steps {echo "cleanup"}}
                  }
              }
              
            • scripted parallel within scripted pipeline
              stage("prepare") {echo "prepare"}
              stage("build") {echo "build"}
              stage("test") {
                  parallel ([
                      "linux": {
                          stage("install") {echo "installing in linux"}
                          stage("test") {echo "testing in linux"}
                      },
                      "windows": {
                          stage("install") {echo "installing in windows"}
                          stage("test") {echo "testing in windows"}
                      },
                      "mac": {
                          stage("install") {echo "installing in mac"}
                          stage("test") {echo "testing in mac"}
                      }
                  ])
              }
              stage("cleanup") {echo "cleanup"}
              
            • scripted parallel within declarative pipeline
              pipeline {
                  agent("none")
                  stages {
                      stage("prepare") {steps {echo "prepare"}}
                      stage("build") {steps {echo "build"}}
                      stage("test") {
                          steps {
                              script {
                                  parallel ([
                                      "linux": {
                                          stage("install") {echo "installing in linux"}
                                          stage("test") {echo "testing in linux"}
                                      },
                                      "windows": {
                                          stage("install") {echo "installing in windows"}
                                          stage("test") {echo "testing in windows"}
                                      },
                                      "mac": {
                                          stage("install") {echo "installing in mac"}
                                          stage("test") {echo "testing in mac"}
                                      }
                                  ])
                              }
                          }
                      }
                      stage("cleanup") {steps {echo "cleanup"}}
                  }
              }

               

            Show
            betoz Alberto Arango added a comment - Here I share three code examples (bottom of this comment) declarative parallel within declarative pipeline scripted parallel within scripted pipeline scripted parallel within declarative pipeline The first two get visualized as expected. The third one gets a messed up visualization starting at the parallel part, i.e. also affects the next non-parallel stage. The code declarative parallel within declarative pipeline pipeline { agent( "none" ) stages { stage( "prepare" ) {steps {echo "prepare" }} stage( "build" ) {steps {echo "build" }} stage( "test" ) { parallel { stage( "linux" ) { stages { stage( "install" ) {steps {echo "installing in linux" }} stage( "test" ) {steps {echo "testing in linux" }} } } stage( "windows" ) { stages { stage( "install" ) {steps {echo "installing in windows" }} stage( "test" ) {steps {echo "testing in windows" }} } } stage( "mac" ) { stages { stage( "install" ) {steps {echo "installing in mac" }} stage( "test" ) {steps {echo "testing in mac" }} } } } } stage( "cleanup" ) {steps {echo "cleanup" }} } } scripted parallel within scripted pipeline stage( "prepare" ) {echo "prepare" } stage( "build" ) {echo "build" } stage( "test" ) { parallel ([ "linux" : { stage( "install" ) {echo "installing in linux" } stage( "test" ) {echo "testing in linux" } }, "windows" : { stage( "install" ) {echo "installing in windows" } stage( "test" ) {echo "testing in windows" } }, "mac" : { stage( "install" ) {echo "installing in mac" } stage( "test" ) {echo "testing in mac" } } ]) } stage( "cleanup" ) {echo "cleanup" } scripted parallel within declarative pipeline pipeline { agent( "none" ) stages { stage( "prepare" ) {steps {echo "prepare" }} stage( "build" ) {steps {echo "build" }} stage( "test" ) { steps { script { parallel ([ "linux" : { stage( "install" ) {echo "installing in linux" } stage( "test" ) {echo "testing in linux" } }, "windows" : { stage( "install" ) {echo "installing in windows" } stage( "test" ) {echo "testing in windows" } }, "mac" : { stage( "install" ) {echo "installing in mac" } stage( "test" ) {echo "testing in mac" } } ]) } } } stage( "cleanup" ) {steps {echo "cleanup" }} } }  
            Hide
            alcastel Alberto added a comment -

            I have the same problem mentioned by Alberto Arango. With a scripted pipeline inside a declarative one, BlueOcean gets confused.
            \

            I am using a scripted pipeline inside a declarative one because I need to spawn multiple parallel jobs according to some dynamic variables. Using Matrix/Axes I cannot do it.

            Show
            alcastel Alberto added a comment - I have the same problem mentioned by Alberto Arango . With a scripted pipeline inside a declarative one, BlueOcean gets confused. \ I am using a scripted pipeline inside a declarative one because I need to spawn multiple parallel jobs according to some dynamic variables. Using Matrix/Axes I cannot do it.

              People

              Assignee:
              Unassigned Unassigned
              Reporter:
              acarr468 Adam Carroll
              Votes:
              28 Vote for this issue
              Watchers:
              32 Start watching this issue

                Dates

                Created:
                Updated: