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

Multibranch plugin with declarative pipelines checks out the project for skipped stages

    XMLWordPrintable

Details

    Description

      I would like to execute 2 stages on 2 different nodes. First stage should be executed always, and the second under a certain condition.

      Everything works, except that when the second stage is not executed (the 'when' expression is not satisfied), a checkout of the repository is still done. 

      This is the Jenkinsfile:

      pipeline {
        agent { label 'node_1' }
      
        stages {
          stage("Stage 1") {
            steps {
              script {
                echo "Stage 1"
              }
            }
          }
      
          stage ('Stage 2') {
            when {
              expression { env.BRANCH_NAME == "master" }
            }
            agent { label 'node_2' }
            steps {
              script {
               echo "Stage 2"
             }
           }
         }
        }
      }

      The big problem with this is that in case the 'node_2' is executing other jobs, the current job cannot continue until this node has a free executor. 

       

      Attachments

        Activity

          Found this problem also. Definitely annoying. Have ECS cluster agents...have to wait for one to spin up just to decide not to run.

          gdjennings Grant Jennings added a comment - Found this problem also. Definitely annoying. Have ECS cluster agents...have to wait for one to spin up just to decide not to run.

          But it works:

           

          pipeline {
            agent { label 'node_1' }
          
            stages {
              stage("Stage 1") {
                steps {
                  script {
                    echo "Stage 1"
                  }
                }
              }
          
              stage ('Stage 2') {
                when {
                  expression { env.BRANCH_NAME == "master" }
                }
                steps {
                  node ('node_2') {
                    script {
                      echo "Stage 2"
                    }
                  }
               }
             }
            }
          }
          

          The problem in interpreting the scenario in the basic pipeline implementation.

           

          vaimr Denis Saponenko added a comment - But it works:   pipeline { agent { label 'node_1' } stages { stage( "Stage 1" ) { steps { script { echo "Stage 1" } } } stage ( 'Stage 2' ) { when { expression { env.BRANCH_NAME == "master" } } steps { node ( 'node_2' ) { script { echo "Stage 2" } } } } } } The problem in interpreting the scenario in the basic pipeline implementation.  
          suomiro Lucian Varlan added a comment -

          Your example doesn't work. 'node' (or even 'agent') is not a valid step.

          suomiro Lucian Varlan added a comment - Your example doesn't work. 'node' (or even 'agent') is not a valid step.
          abayer Andrew Bayer added a comment -

          A solution to this was added in Declarative 1.2.6 - the beforeAgent true option to put inside when. If given, the when will be evaluated before entering the agent for the stage.

          abayer Andrew Bayer added a comment - A solution to this was added in Declarative 1.2.6 - the beforeAgent true option to put inside when . If given, the when will be evaluated before entering the agent for the stage.
          bitwiseman Liam Newman added a comment -

          Bulk closing resolved issues.

          bitwiseman Liam Newman added a comment - Bulk closing resolved issues.

          People

            abayer Andrew Bayer
            suomiro Lucian Varlan
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: