You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Jenkins Pipeline仅在两个上游触发器均成功后运行

实现Trigger1和Trigger2均成功后触发当前Pipeline的方法

默认的upstream触发器用逗号分隔多个任务时是逻辑或(任一任务达标就触发),要实现逻辑与(两个都成功才触发),给你两个可行方案:

方案一:上游任务主动触发,当前任务校验双成功信号

  1. 先修改Trigger1和Trigger2的流水线,在它们成功跑完后,触发当前流水线的参数化构建,各自传递一个成功标记:

    • Trigger1末尾添加这段代码:
      stage('触发下游任务') {
          when { success() }
          steps {
              build job: '你的当前流水线名称', parameters: [string(name: 'TRIGGER1_OK', value: 'yes')], wait: false
          }
      }
      
    • Trigger2同理,传递参数TRIGGER2_OK: 'yes'
  2. 在当前流水线中添加校验阶段,确认两个成功标记都收到后再执行后续步骤:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:05:23