我有一个带有以下触发器的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阶段。我该如何实现?我认为现在拥有的每个阶段都将运行。
谢谢!
答案 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
}
}
}