How to run multiple stages on the same node with declarative Jenkins pipeline? How to run multiple stages on the same node with declarative Jenkins pipeline? jenkins jenkins

How to run multiple stages on the same node with declarative Jenkins pipeline?


Since version 1.3 of Declarative Pipeline plugin, this is officially supported.It's officially called "Sequential Stages".

pipeline {    agent none    stages {        stage("check code style") {            agent {                docker "code-style-check-image"            }            steps {                sh "./check-code-style.sh"            }        }        stage("build and test the project") {            agent {                docker "build-tools-image"            }            stages {               stage("build") {                   steps {                       sh "./build.sh"                   }               }               stage("test") {                   steps {                       sh "./test.sh"                   }               }            }        }    }}

Official announcement here: https://jenkins.io/blog/2018/07/02/whats-new-declarative-piepline-13x-sequential-stages/


You could define stages inside a script block. Those stages are kind of sub-stages of a parent stage running in a given agent. That was the approach that I had to use in a similar use case than yours.

#!groovywindowsNode = 'windows'pipeline {  agent none  stages {    stage('Stage A') {      agent {        label windowsNode      }      steps {        script {          stage('Stage 1') {                    windowsNode = NODE_NAME            echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"          }          stage('Stage 2') {            echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"          }        }      }    }  }}


I have found that this works as you would expect

#!groovywindowsNode = 'windows'pipeline {    agent none    stages {        stage('Stage 1') {            steps {                node(windowsNode) {                    script {                        // all subsequent steps should be run on the same windows node                        windowsNode = NODE_NAME                    }                    echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"                }            }        }        stage('Stage 2') {            steps {                node(windowsNode) {                    echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"                }            }        }    }}