Goal
Run multiple stages of a declarative Jenkins pipeline on the same node.
Setup
This is just a minimal example to show the p
replace agent none
with agent any
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.
#!groovy
windowsNode = '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"
}
}
}
}
}
}
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/
I have found that this works as you would expect
#!groovy
windowsNode = '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"
}
}
}
}
}