Jenkins Pipeline实现部分并行任务完成后触发后续任务
Jenkins Pipeline实现"任意并行任务完成即触发后续任务"的方案
Jenkins Pipeline完全支持你的需求,核心是通过线程安全的原子变量配合并行执行逻辑,确保3台服务器中任意一台完成任务后,立即触发另外4台服务器的任务,且仅触发一次。
实现思路
- 用
parallel块启动3台服务器的并行任务; - 定义一个原子布尔变量,标记后续任务是否已触发,避免重复执行;
- 每台服务器的任务完成后,通过原子操作检查标记:若未触发,则启动4台服务器的并行任务,并将标记设为已触发;若已触发,则直接跳过。
完整代码示例
pipeline { agent any stages { stage('并行执行3台服务器任务') { steps { script { // 线程安全的原子变量,控制后续任务触发逻辑 def isFollowUpTriggered = new java.util.concurrent.atomic.AtomicBoolean(false) // 启动3台服务器的并行任务 parallel( "Server-1": { // 替换为Server-1的实际任务,比如SSH执行命令、部署操作等 sh 'echo "Server-1 任务执行中..." && sleep 10' println "Server-1 任务完成" triggerFollowUpTasks(isFollowUpTriggered) }, "Server-2": { sh 'echo "Server-2 任务执行中..." && sleep 5' println "Server-2 任务完成" triggerFollowUpTasks(isFollowUpTriggered) }, "Server-3": { sh 'echo "Server-3 任务执行中..." && sleep 15' println "Server-3 任务完成" triggerFollowUpTasks(isFollowUpTriggered) } ) } } } } } // 封装后续任务触发逻辑 def triggerFollowUpTasks(def triggerFlag) { // 原子操作:仅当标记为false时,才执行后续任务并将标记设为true if (triggerFlag.compareAndSet(false, true)) { println "触发4台服务器的后续任务" parallel( "FollowUp-Server-A": { // 替换为后续服务器A的实际任务 sh 'echo "后续Server-A 任务执行中..."' }, "FollowUp-Server-B": { sh 'echo "后续Server-B 任务执行中..."' }, "FollowUp-Server-C": { sh 'echo "后续Server-C 任务执行中..."' }, "FollowUp-Server-D": { sh 'echo "后续Server-D 任务执行中..."' } ) } else { println "后续任务已触发,无需重复执行" } }
关键说明
- 原子变量的作用:
AtomicBoolean的compareAndSet方法是线程安全的,能确保只有第一个完成的任务可以触发后续流程,避免多台服务器同时触发导致重复执行; - 并行逻辑独立性:后续任务启动后,原来3台服务器中未完成的任务会继续执行,不会被中断;
- 自定义适配:你可以将示例中的
sh命令替换为实际的服务器操作(如通过sshagent插件执行远程命令、调用部署脚本等),也可以为不同服务器指定专属的agent节点。
内容的提问来源于stack exchange,提问作者Emilia
相关产品推荐
相关产品推荐

