You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过声明式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
    }
}

关键说明

  1. 动态获取Agent列表:通过getVMsAgents()函数遍历Jenkins节点,筛选出带vms标签且在线的Agent,返回它们的名称列表。
  2. Matrix轴绑定Agent:将AGENT_NAME作为轴名称,动态使用Agent列表作为取值,这样每个Agent对应一个并行分支。
  3. 指定具体Agent运行:agent部分引用${AGENT_NAME},确保每个分支在对应的Agent上执行,而不是随机分配到带vms标签的Agent。

注意事项

如果Jenkins提示脚本权限不足,需要进入 Manage Jenkins -> In-process Script Approval 页面,批准Jenkins.instance.nodes等相关方法的调用权限。


内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:25:23