我有一个共享库,其中包含一个声明性管道,许多作业正在使用该管道进行构建。 但是,我希望能够将触发器块从 Jenkinsfile 传递到共享库,因为我想通过 Cron,一些我想通过 SNS 触发的作业,而另一些则使用上游作业触发器。
有没有办法做到这一点?我尝试过的一切都失败了
我试过了
#Jenkinsfile
@Library('build') _
buildAmi{
OS = "amazonlinux"
owners = "amazon"
filters = ""Name=name,Values=amzn-ami-hvm-*-x86_64-gp2""
template = "linux_build_template.json"
trigger = triggers {
cron('0 H(06-07) * * *')
}
#Shared Lib
pipeline {
$buildArgs.trigger
失败
Not a valid section definition
还尝试仅将 cron 时间表传递到共享库中,例如
triggers {
cron("${buildArgs.cron}")
}
但这给出了错误
Method calls on objects not allowed outside "script" blocks
尝试了其他各种事情,但似乎声明式风格需要一个触发器块,里面只有触发器。
有谁知道实现我想要做的事情的方法吗?
注释代码太多:
我们想将一些预设属性与 jenkinsfile 属性合并。 这是使其工作的方法,因为属性方法只能调用一次。
我们在触发器信息中使用了额外的管道参数:
詹金斯文件:
mypipeline (
pipelineTriggers: [pollSCM(scmpoll_spec: '0 5,11,15,22 * * 1-5')],
)
然后在共享库中
@Field def pipelineProperties = [
disableConcurrentBuilds(abortPrevious: true),
buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '0'))
]
def pipelineTriggersArgs = args.pipelineTriggers
def setJobProperties() {
def props = pipelineProperties
def str = ""
pipelineProperties.each { str += (blue + it.getClass().toString() + it.toString() + "n") }
if (pipelineTriggersArgs) {
if (debugLevel > 29) {
def plTrig = pipelineTriggers(pipelineTriggersArgs)
str += (mag + "args: " + pipelineTriggersArgs.getClass().toString() + "tt" + pipelineTriggersArgs.toString() + "n" + off)
str += (red + "expr: " + plTrig.getClass().toString() + "tt" + plTrig.toString() + "n" + off)
echo str
}
props?.add(pipelineTriggers(pipelineTriggersArgs)) // pass param with list as the arg
}
properties(props)
}
这是合并预设和参数的唯一方法,因为属性无法覆盖。 不完全是答案,但我认为是一种解决它的方法。