Jenkins并行任务如何实现successFast效果:任意成功立即触发下游
解决方案
Jenkins原生parallel语法没有内置的successFast配置,但可以通过线程安全的共享标记结合子任务内的结果判断实现需求,实现逻辑如下:
- 定义原子布尔类型的标记位,用于记录下游任务是否已经被触发,避免重复执行
- 每个并行子任务执行完成后立刻校验自身执行结果,只要自身结果为SUCCESS且标记位为未触发状态,就立即启动下游任务并更新标记位
- 未完成的并行任务会继续执行,不会影响下游任务的启动时机
完整示例代码如下:
pipeline { agent any stages { stage('Parallel Jobs'){ steps{ script{ // 定义线程安全的触发标记,初始为未触发状态 def downstreamTriggered = new java.util.concurrent.atomic.AtomicBoolean(false) parallel( "JobAKey":{ def jobAResult = build job: "job-A", wait: true, propagate: false, parameters: [string(name: 'param1', value: val1)] // 原子操作保证即使两个任务同时成功,也仅触发一次下游任务 if (jobAResult.result == 'SUCCESS' && downstreamTriggered.compareAndSet(false, true)) { build job: "job-C", wait: false, parameters: [string(name: 'param2', value: val2)] build job: "job-D", wait: false, parameters: [string(name: 'param2', value: val2)] } }, "JobBKey":{ def jobBResult = build job: "job-B", wait: true, propagate: false, parameters: [string(name: 'param1', value: val1)] if (jobBResult.result == 'SUCCESS' && downstreamTriggered.compareAndSet(false, true)) { build job: "job-C", wait: false, parameters: [string(name: 'param2', value: val2)] build job: "job-D", wait: false, parameters: [string(name: 'param2', value: val2)] } } ) // 此处可根据需要追加两个并行任务的最终结果处理逻辑 } } } } }
如果不需要继续执行未完成的并行任务,可以在触发下游任务后添加中断其余并行任务的逻辑,进一步节省资源。
内容的提问来源于stack exchange,提问作者Vikas Khengare
相关产品推荐
相关产品推荐

