Jenkins 有一个关于 Jenkinsfile 语法的相对全面的文档。但我仍然没有找到答案是否可以在管道的顶层进行流量控制?从字面上包括一些东西
if
就在 pipeline {}
部分(声明性),例如:
pipeline {
if (bla == foo) {
triggers {
...configuration
}
}
或
pipeline {
triggers {
if (bla == foo) {
something...
}
}
}
triggers
部分是只能包含一次且只能包含在 pipeline
部分中的部分。但if
声明似乎只能在阶段级别应用。
有人知道如何有条件地在指令中包含某些内容,例如
triggers
,或有条件地包含指令本身吗?
您不能在
when
和 script
之外的管道中使用流量控制,但您可以调用诸如触发器参数之类的函数:
pipeline {
agent any
triggers{ cron( getCronParams() ) }
...
}
def getCronParams() {
if( someCondition ) {
return 'H */4 * * 1-5'
}
else {
return 'H/30 */2 * * *'
}
}
另一种方法是使用
evaluate()
: 动态生成管道脚本
evaluate """
pipeline {
agent any
${getTriggers()}
...
}
"""
String getTriggers() {
if( someCondition ) {
return "triggers{ cron('H */4 * * 1-5') }"
}
else {
return "triggers{ pollSCM('H */4 * * 1-5') }"
}
}
受到 zett42 答案的启发,我使用 Gerrit 触发器插件创建了一个条件触发器。当“isGerrit”变量设置为 false 时,触发器被禁用。看起来,截至今天,Jenkins 不允许“if”指令包围“trigger”声明,因此您必须修改它的参数,以使其不适用于特定情况。
triggers {
gerrit customUrl: GERRIT_HOST,
gerritProjects: !isGerrit ? [] : [[
branches: [
[compareType: 'PLAIN', pattern: 'master'],
[compareType: 'PLAIN', pattern: 'database']
],
compareType: 'PLAIN',
disableStrictForbiddenFileVerification: false,
pattern: 'myProject'
]],
serverName: 'gerrit',
triggerOnEvents: [patchsetCreated()]
}
我遇到了同样的问题:
cron()
在标签、PR 和分支上触发,而我想将其限制为在主分支上每天运行。
使用
properties
,我能够参数化触发器:
// triggers
def job_triggers = []
if(env.BRANCH_NAME == "master" || env.BRANCH_NAME == "main") {
job_triggers << cron('H 2 * * 1-5')
}
properties([pipelineTriggers(job_triggers)])