Jenkins声明式Pipeline如何实现外层map并行内层map顺序执行
Jenkins流水线并行执行实现方案
需求梳理
outer_map1存储<字符串, 待执行命令>键值对,所有条目需并行执行outer_map2存储<字符串, 内层map>键值对,内层map为<字符串, 待执行命令>结构;要求outer_map2的顶层条目按顺序执行,单个顶层条目对应的内层map所有命令并行执行- 核心目标:实现
outer_map1整体执行逻辑和outer_map2整体执行逻辑的并行,支持单stage实现或拆分为独立stage并行两种形式
现有代码问题
原有写法中parallel outer_map1执行完成后,才会进入后续outer_map2.each的遍历逻辑,两个逻辑块串行运行在stage主线程,无法实现并行效果。
方案1:单stage内实现(推荐)
Jenkins的parallel关键字支持传入多个独立闭包作为并行分支,只需将两个逻辑块分别封装为独立分支传入即可,无需拆分stage:
stage('test'){ parallel( // 分支1:全量并行执行outer_map1 'run_outer_map1': { parallel outer_map1 }, // 分支2:顺序执行outer_map2顶层条目,每个内层map并行 'run_outer_map2': { outer_map2.each{ key, value -> echo "当前执行outer_map2节点:${key}" parallel value() } } ) }
执行逻辑说明:
- 流水线进入该stage后,两个顶层分支立即同时启动
run_outer_map1分支直接并行启动outer_map1下的所有待执行命令run_outer_map2分支按map遍历顺序逐个处理顶层条目,上一个内层map的所有命令执行完成后,才会启动下一个内层map的并行任务- 两个顶层分支完全独立并行,互不阻塞
方案2:拆分为独立stage并行
如果需要拆分为两个独立stage实现,可直接将stage作为并行分支传入parallel,脚本式流水线写法如下:
parallel( 'outer1_stage': { stage('执行outer_map1') { parallel outer_map1 } }, 'outer2_stage': { stage('顺序执行outer_map2') { outer_map2.each{ key, value -> stage("outer_map2节点:${key}") { parallel value() } } } } )
声明式流水线对应写法:
pipeline { agent any stages { stage('并行任务总阶段') { parallel { stage('执行outer_map1') { steps { script { parallel outer_map1 } } } stage('顺序执行outer_map2') { steps { script { outer_map2.each{ key, value -> stage("outer_map2节点:${key}") { parallel value() } } } } } } } } }
配置说明
- parallel传入的map键名对应流水线UI上展示的分支/阶段名称,可根据业务语义自定义
- 如需避免单个分支失败导致所有并行分支终止,可在parallel参数中添加
failFast: false - 并行分支内尽量避免读写共享全局变量,防止出现并发冲突问题
内容的提问来源于stack exchange,提问作者piks
相关产品推荐
相关产品推荐

