触发器指令上 Jenkins 管道中的条件

问题描述 投票:0回答:3

Jenkins 有一个关于 Jenkinsfile 语法的相对全面的文档。但我仍然没有找到答案是否可以在管道的顶层进行流量控制?从字面上包括一些东西

if
就在
pipeline {}
部分(声明性),例如:

pipeline {
    if (bla == foo) {
        triggers {
            ...configuration
        }
} 

pipeline {
    triggers {
        if (bla == foo) {
            something...
        }
    }
} 

triggers
部分是只能包含一次且只能包含在
pipeline
部分中的部分。但
if
声明似乎只能在阶段级别应用。

有人知道如何有条件地在指令中包含某些内容,例如

triggers
,或有条件地包含指令本身吗?

jenkins jenkins-pipeline jenkins-groovy jenkins-declarative-pipeline
3个回答
13
投票

您不能在

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') }"
    } 
}

0
投票

受到 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()]
}

0
投票

我遇到了同样的问题:

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)])
© www.soinside.com 2019 - 2024. All rights reserved.