如何配置Jenkins Pipeline仅在两个上游触发器均成功后运行
实现Trigger1和Trigger2均成功后触发当前Pipeline的方法
默认的upstream触发器用逗号分隔多个任务时是逻辑或(任一任务达标就触发),要实现逻辑与(两个都成功才触发),给你两个可行方案:
方案一:上游任务主动触发,当前任务校验双成功信号
先修改Trigger1和Trigger2的流水线,在它们成功跑完后,触发当前流水线的参数化构建,各自传递一个成功标记:
- Trigger1末尾添加这段代码:
stage('触发下游任务') { when { success() } steps { build job: '你的当前流水线名称', parameters: [string(name: 'TRIGGER1_OK', value: 'yes')], wait: false } } - Trigger2同理,传递参数
TRIGGER2_OK: 'yes'
- Trigger1末尾添加这段代码:
在当前流水线中添加校验阶段,确认两个成功标记都收到后再执行后续步骤:
pipeline { agent any parameters { string(name: 'TRIGGER1_OK', defaultValue: 'no') string(name: 'TRIGGER2_OK', defaultValue: 'no') } stages { stage('检查上游状态') { steps { script { if (params.TRIGGER1_OK != 'yes' || params.TRIGGER2_OK != 'yes') { currentBuild.result = 'ABORTED' error('缺少一个上游任务的成功信号,终止当前构建') } } } } stage('Hello') { steps { echo 'Hello World' } } } }- 第一次被Trigger1触发时,因缺少Trigger2的标记会终止构建;等Trigger2也触发后,两个标记齐全,才会执行后续流程。
方案二:当前任务主动轮询双上游的成功状态
如果无法修改上游任务,可通过轮询方式定期检查Trigger1和Trigger2的最新构建是否均为成功:
pipeline { agent any triggers { // 每5分钟轮询一次,频率可按需调整 pollSCM('H/5 * * * *') } stages { stage('等待双上游成功') { steps { script { def trigger1 = Jenkins.instance.getItemByFullName('Trigger1') def trigger2 = Jenkins.instance.getItemByFullName('Trigger2') def timeoutSec = 3600 // 最长等待1小时,可自行修改 def startTime = System.currentTimeMillis() while (true) { def lastSuccess1 = trigger1.getLastSuccessfulBuild() def lastSuccess2 = trigger2.getLastSuccessfulBuild() // 校验两个任务均有成功构建,且最新成功构建是在当前流水线启动后完成的 if (lastSuccess1 && lastSuccess2 && lastSuccess1.timestamp > currentBuild.startTimeInMillis && lastSuccess2.timestamp > currentBuild.startTimeInMillis) { echo 'Trigger1和Trigger2均已成功,开始执行后续任务' break } // 超时则标记构建失败 if (System.currentTimeMillis() - startTime > timeoutSec * 1000) { currentBuild.result = 'FAILED' error('等待上游任务成功超时') } echo '未检测到双上游均成功,1分钟后重试...' sleep(time: 60, unit: 'SECONDS') } } } } stage('Hello') { steps { echo 'Hello World' } } } }
- 注意:执行该流水线的用户需具备读取Trigger1和Trigger2任务的权限;轮询频率和超时时间可根据实际场景调整。
方案对比
- 方案一实时性强,无需轮询,适合可修改上游任务的场景;
- 方案二无需改动上游任务,适合上游任务无法调整的场景,但存在一定轮询延迟。
内容的提问来源于stack exchange,提问作者ZA1NZAFAR
相关产品推荐
相关产品推荐

