Jenkinsfile-如何仅在特定阶段启动cron触发器?

时间:2019-01-11 16:27:58

标签: jenkins jenkins-pipeline

我有一个带有以下触发器的Jenkinsfile:

  triggers {
  cron('0 * * * 1-5')
}

因此它将在星期一至星期五的每小时的顶部触发。

在Jenkinsfile中,我有多个阶段,例如:

stage('CI Build and push snapshot') {
    when {
      anyOf { branch 'PR-*';branch 'develop' }
    }
 .
 .
 .
  stage('Build Release') {
    when {
      branch 'master'
    }
 .
 .
 .
  stage('Integration Tests') {
    when {
       ? // not sure what goes here
     }

我想做的是,当该触发器启动时,我只希望运行Integration Tests阶段。我该如何实现?我认为现在拥有的每个阶段都将运行。

谢谢!

2 个答案:

答案 0 :(得分:2)

我能够使用类似的方法使它工作:

 stage('CI Build and push snapshot') {
    when {
      anyOf { branch 'PR-*';branch 'develop' }
      not {
        expression { return currentBuild.rawBuild.getCause(hudson.triggers.TimerTrigger$TimerTriggerCause) }
      }
    }

 stage('Integration Tests') {
    when {
       branch 'develop'
       expression { return currentBuild.rawBuild.getCause(hudson.triggers.TimerTrigger$TimerTriggerCause) }
     }

答案 1 :(得分:1)

请注意,这是使用共享库函数和脚本语法(不是声明性的),您需要使用脚本{}块才能实现。

出于组织目的,我将其放在/ vars下名为jobCauses.groovy的共享库文件中的自己的函数中,可以根据需要将其保留在行内,或将其放在Jenkinsfile的底部,等等。 / p>

/**
 * Checks if job cause is Cron
 *
 * @return boolean
 */
boolean hasTriggeredCause() {

    List jobCauses = currentBuild.rawBuild.getCauses().collect { it.getClass().getCanonicalName().tokenize('.').last() }

    return jobCauses.contains('TimerTriggerCause')
}

然后在您的管道中:

stage('Integration Tests') {
    script {
        if ( jobCauses.hasTriggeredCause() ) {
            //do the thing
        }
    }
}