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" } } } }}