目标 在同一节点上运行声明性Jenkins管道的多个阶段。
安装程序 这只是显示问题的一个最小示例。有2个Windows节点“ windows-slave1”和“ windows-slave2”,均标有“ windows”标签。
注意:我真正的Jenkinsfile无法使用全局代理,因为存在需要在不同节点上运行的阶段组(例如Windows与Linux)。
预期行为 Jenkins根据标签选择“阶段1”中的节点之一,并在“阶段2”中使用相同的节点,因为变量 windowsNode 已更新为在“阶段1”中选择的节点。
实际行为 “阶段2”有时与“阶段1”在同一节点上运行,有时在不同的节点上运行。请参见下面的输出。
詹金斯档案
#!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
任何想法设置有什么问题吗?我想这就是Jenkinsfile的解析和执行方式。
还有其他建议吗?最初设置 windowsNode 时,也许有一个Jenkins API根据“ windows”标签选择一个节点。
从声明性管道插件的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/