由 Jenkins 管道中的参数化 Cron 触发

Ale*_*vey 2 jenkins jenkins-pipeline

我有一个像这样的詹金斯管道工作:

  triggers {
    parameterizedCron(env.BRANCH_NAME == "master" ? "0 12 * * * % RUN_E2E=true;MODE=parallel" : "")
  }
Run Code Online (Sandbox Code Playgroud)

后来我有这样的条件逻辑:

    stage('Build Release') {
      when {
        allOf {
          branch 'master'
          not {
            triggeredBy 'TimerTrigger'
          }
        }
      }
Run Code Online (Sandbox Code Playgroud)

然而,triggeredBy 并未激活。也就是说,即使在parameterizedCron 运行时,“不是由timerTrigger 触发”似乎也是true。

我从这里的文档中得到了这个例子。

我的问题是,如果我希望构建/发布阶段仅在分支== master上执行,而不是在parameterizedCron执行期间执行,我该怎么做?

Mar*_*atC 7

你的问题是,这parameterizedCron不是a ,只有常规的才是TimerTriggercron

满足您的要求的最简单方法是添加参数并将其设置为parameterizedCron

triggers {
    parameterizedCron(env.BRANCH_NAME == "master" ? "0 12 * * * % RUN_E2E=true;MODE=parallel;SHOULD_BUILD_RELEASE=no" : "")
  }
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

    stage('Build Release') {
      when {
        allOf {
          branch 'master'
          expression { SHOULD_BUILD_RELEASE == 'yes' }
        }
      }
Run Code Online (Sandbox Code Playgroud)

否则,您可能会以编程方式发现触发构建的原因,如果发现是parameterizedCron触发了构建/发布部分,则退出构建/发布部分。请参阅此处的示例。在 的情况下parameterizedCron,相关部分是这样的:

timerCause = currentBuild.rawBuild.getCause(org.jenkinsci.plugins.parameterizedscheduler.ParameterizedTimerTriggerCause)
if (timerCause) {
    echo "Build reason: Build was started by parameterized timer"
}
Run Code Online (Sandbox Code Playgroud)

最后,您可以尝试使用确切的类,如下所示(我还没有检查它,它可能会也可能不会起作用):

    stage('Build Release') {
      when {
        allOf {
          branch 'master'
          not {
            triggeredBy 'ParameterizedTimerTriggerCause'
          }
        }
      }
Run Code Online (Sandbox Code Playgroud)