如何为pipeline添加matrix段实现多节点运行循环任务
Pipeline 4节点调度改造实现方案
核心调整逻辑
原写法的核心问题是所有项目遍历生成的子stage全部嵌套在单Test stage的script执行上下文内,即便指定节点,所有任务也会挤在同一执行器上串行运行,无法实现跨节点分流。改造后通过任务轮询分配、并行分支绑定节点的方式,完全匹配需要的调度规则:
- 按顺序将项目列表均匀分配到4个执行节点:第1个项目AD分配给节点1,第2个CD分配给节点2,第3个DC分配给节点3,第4个DISP_A分配给节点4,后续项目按取模规则循环分配,直到所有项目遍历完成
- 4个节点同时并行执行各自分到的任务队列,无资源抢占
- 每个节点内部的任务按列表顺序串行执行,避免单节点执行器过载
改造后可直接运行的Pipeline代码
pipeline { agent none environment { // 替换为你环境中4个执行节点的实际标签/名称 EXEC_NODES = ['node-slave-1', 'node-slave-2', 'node-slave-3', 'node-slave-4'] // 原有完整测试项目列表,无需改动顺序 TEST_PROJECTS = ['AD', 'CD', 'DC', 'DISP_A', 'DISP_PROC', 'EGI', 'FD', 'FLT', 'FMS_C', 'IFF', 'liblO', 'libNGC', 'libSC', 'MISCMP_MP', 'MISCMP_GP', 'NAV_MGR', 'RADALT', 'SYS', 'SYSIO15', 'SYSIO42', 'SYSRED', 'TACAN', 'VOR_ILS', 'VPA', 'WAAS', 'WCA'] } stages { stage ('Parallel Test Scheduling') { steps { script { // 初始化节点-任务映射关系 def nodeTaskMap = [:] EXEC_NODES.each { nodeName -> nodeTaskMap[nodeName] = [] } // 按取模规则轮询分配项目,实现负载均衡 TEST_PROJECTS.eachWithIndex { project, idx -> def targetNode = EXEC_NODES[idx % EXEC_NODES.size()] nodeTaskMap[targetNode] << project } // 动态构建并行执行分支 def parallelBranches = [:] nodeTaskMap.each { nodeName, taskList -> parallelBranches[nodeName] = { // 绑定当前分支的专属执行节点 node(nodeName) { // 串行执行当前节点分到的所有测试任务 taskList.each { project -> stage("${nodeName} - ${project}") { echo "Running ${project}" build job: "UH60Job", parameters: [ string(name: "TEST_PROJECT", value: project), string(name: "SCADE_SUITE_TEST_ACTION", value: "all"), string(name: "VIEW_ROOT", value: "myview") ] } } } } } // 启动所有并行分支 parallel parallelBranches } } } } }
注意事项
- 代码中的
EXEC_NODES数组需要替换为你Jenkins环境内实际的节点标签,否则会出现节点找不到的调度报错 - 27个测试项目分配到4个节点后,每个节点平均承担6-7个项目的执行量,调度逻辑完全符合初始分配预期
- 如果后续需要扩展节点数量,只需要在
EXEC_NODES数组里追加新节点标签即可,分配逻辑会自动适配,不需要额外修改循环代码
内容的提问来源于stack exchange,提问作者Franktank24
相关产品推荐
相关产品推荐

