如何通过声明式Pipeline在多Agent上并行运行Jenkins任务
问题:让Jenkins任务在所有带指定标签的Agent上并行运行
我是Jenkins新手,想在多个带vms标签的Agent上并行运行任务。查了Matrix指令相关文档后,写了如下Pipeline,但现在任务只会在数量等于DUMMY_AXIS取值数的Agent上运行(比如有3个带vms标签的Agent,却只在2个上执行阶段)。请问怎么修改才能让阶段在每个带vms标签的Agent上各运行一次,不受Agent数量影响?
当前Pipeline代码:
pipeline { agent none stages { stage('Update TestHostAgent') { matrix { agent { label 'vms' } axes { axis { name 'DUMMY_AXIS' values 'dummy_val_1', 'dummy_val_2' } } stages { stage('Build') { steps { echo "Build stage" } } stage('Test') { steps { script { echo "Test Step" } } } } } } } }
解决方案
核心问题是你用了固定数量的虚拟轴,导致并行分支数被轴的取值数限制。要实现每个带vms标签的Agent都跑一次,需要动态获取Agent列表并作为Matrix的轴取值,具体修改如下:
修改后的Pipeline代码
pipeline { agent none stages { stage('Update TestHostAgent') { matrix { // 每个分支绑定到具体的Agent agent { label "${AGENT_NAME}" } axes { axis { name 'AGENT_NAME' // 动态获取带vms标签的Agent列表 values script: return getVMsAgents() } } stages { stage('Build') { steps { echo "Build stage on agent: ${AGENT_NAME}" } } stage('Test') { steps { echo "Test Step on agent: ${AGENT_NAME}" } } } } } } } // 自定义函数:获取所有带vms标签的在线Agent名称 def getVMsAgents() { return Jenkins.instance.nodes.findAll { node -> // 筛选带vms标签且在线的Agent node.getLabelString().contains('vms') && node.toComputer().isOnline() }.collect { node -> // 返回Agent名称列表 node.name } }
关键说明
- 动态获取Agent列表:通过
getVMsAgents()函数遍历Jenkins节点,筛选出带vms标签且在线的Agent,返回它们的名称列表。 - Matrix轴绑定Agent:将
AGENT_NAME作为轴名称,动态使用Agent列表作为取值,这样每个Agent对应一个并行分支。 - 指定具体Agent运行:agent部分引用
${AGENT_NAME},确保每个分支在对应的Agent上执行,而不是随机分配到带vms标签的Agent。
注意事项
如果Jenkins提示脚本权限不足,需要进入 Manage Jenkins -> In-process Script Approval 页面,批准Jenkins.instance.nodes等相关方法的调用权限。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

