目标
在同一节点上运行声明性Jenkins管道的多个阶段。
设置
这只是显示问题的最小示例。有2个Windows节点" windows-slave1"和" windows-slave2"两者都标有标签" windows"。
注意:我真正的Jenkins文件无法使用全局代理,因为有一些阶段需要在不同的节点上运行(例如Windows与Linux)。
预期行为
Jenkins选择" Stage 1"中的一个节点。基于标签并在"阶段2"中使用相同的节点;因为变量 windowsNode 已更新为在"阶段1和#34;中选择的节点。
实际行为
"第2阶段"有时候运行在同一个网站上,有时候运行在与#34;阶段1和#34;不同的节点上。请参阅下面的输出。
Jenkinsfile
#!groovy
windowsNode = 'windows'
pipeline {
agent none
stages {
stage('Stage 1') {
agent {
label windowsNode
}
steps {
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') {
agent {
label windowsNode
}
steps {
echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"
}
}
}
}
输出
[Pipeline] stage
[Pipeline] { (Stage 1)
[Pipeline] node
Running on windows-slave2 in C:\Jenkins\workspace\test-agent-allocation@2
[Pipeline] {
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] echo
windowsNode: windows-slave2, NODE_NAME: windows-slave2
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Stage 2)
[Pipeline] node
Running on windows-slave1 in C:\Jenkins\workspace\test-agent-allocation
[Pipeline] {
[Pipeline] echo
windowsNode: windows-slave2, NODE_NAME: windows-slave1
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
Finished: SUCCESS
任何想法设置有什么问题?我想它是如何解析和执行Jenkins文件的。
其他建议?也许有一个Jenkins API可以根据" windows"选择一个节点。最初设置 windowsNode 时的标签。
答案 0 :(得分:12)
自声明性管道插件版本1.3开始,此功能正式受支持。 正式称为“顺序阶段”。
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"
}
}
}
}
}
}
此处为官方公告:https://jenkins.io/blog/2018/07/02/whats-new-declarative-piepline-13x-sequential-stages/
答案 1 :(得分:7)
您可以在脚本块中定义阶段。这些阶段是在给定代理中运行的父阶段的一些子阶段。这是我必须在类似用例中使用的方法而不是你的方法。
vattrib_df$inst[is.na(vattrib_df$motherinst == TRUE)]
roots = which(sapply(sapply(V(g),
function(x) neighbors(g, x, mode = 'in')), length) == 0)
terminals = which(sapply(sapply(V(g),
function(x) neighbors(g, x, mode = 'out')), length) == 0)
答案 2 :(得分:2)
我发现这可以按照您的预期工作
#!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"
}
}
}
}
}
答案 3 :(得分:-3)
将agent none
替换为agent any