如何确保在运行Jenkins管道之前更新参数列表?
Jenkins管道项目配置为从Git回购获取其如何确保在运行Jenkins管道之前更新参数列表?,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,Jenkins管道项目配置为从Git回购获取其Jenkins文件: 如果我更改参数列表,例如,从: properties([ parameters([ string(name: 'FOO', description: 'Choose foo') ]) ]) 致: 并运行生成,第一次运行时不显示新添加的条参数: 由于更新后的Jenkins文件期望出现BAR参数,这会导致更改后的第一次生成失败,因为用户没有输入此值 有没有办法防止
Jenkins文件
:
如果我更改参数列表,例如,从:
properties([
parameters([
string(name: 'FOO', description: 'Choose foo')
])
])
致:
并运行生成,第一次运行时不显示新添加的条
参数:
由于更新后的Jenkins文件期望出现BAR
参数,这会导致更改后的第一次生成失败,因为用户没有输入此值
有没有办法防止这种情况?在显示参数输入页面之前,要确保
Jenkinsfile
是最新的?我有一个函数,除非作业具有所有必需的参数,否则跳过生成,例如:
if (job.hasParameters(['FOO', 'BAR'])) {
// pipeline code
}
简短回答:没有。如果有一些工具可以独立于构建来解析和处理Jenkins文件,那就好了,但是没有 Jenkins在检索、解析并运行Jenkins文件之前不知道新参数,唯一的方法是运行构建
实际上,构建历史将始终“落后于”Jenkins文件;当您更改Jenkins文件中的某些内容时,下一个构建将使用“old”Jenkins文件运行,但随后将为构建拾取并处理新的Jenkins文件。解决此问题的唯一方法是手动添加“skip_run”布尔参数,而不是在作业的每个阶段添加when{}子句
properties([
parameters([
BooleanParameter(name: 'skip_run', description: 'Skips all stages. Used to update parameters in case of changes.', default: False)
])
])
当然,这很容易出错
或者,您可以添加一个阶段作为管道的开始,并故意使构建失败
stage('Update Build Info only') {
when {
expression { return params.skip_run ==~ /(?i)(Y|YES|T|TRUE|ON|RUN)/ }
}
steps {
error("This was done deliberately to update the build info.")
}
}
更新:
多亏了,我想出了这个解决方案:
为了防止构建实际显示为红色,可以使用try-catch将其包装起来,然后优雅地退出构建
final updateOnly = 'updateOnly'
try {
stage('Update Build Info only') {
when {
expression { return params.skip_run ==~ /(?i)(Y|YES|T|TRUE|ON|RUN)/ }
}
steps {
error(updateOnly)
}
}
...
//other stages here
...
} catch (e) {
if (e.message == updateOnly) {
currentBuild.result = 'ABORTED'
echo('Skipping the Job to update the build info')
// return here instead of throwing error to keep the build "green"
return
}
// normal error handling
throw e
}
几年前,詹金斯报道了一个与此相关的问题
仍然开放,因此还没有优雅的解决方案。您(您是从'17年起)如何调用
BAR
?我发现了同样的问题,我的解决方案是测试params.BAR
if(params.BAR==null){def BAR=“baz”}否则{echo“yes,BAR已设置”}
Jenkins bug tracker上对此问题进行了一些讨论:
stage('Update Build Info only') {
when {
expression { return params.skip_run ==~ /(?i)(Y|YES|T|TRUE|ON|RUN)/ }
}
steps {
error("This was done deliberately to update the build info.")
}
}
final updateOnly = 'updateOnly'
try {
stage('Update Build Info only') {
when {
expression { return params.skip_run ==~ /(?i)(Y|YES|T|TRUE|ON|RUN)/ }
}
steps {
error(updateOnly)
}
}
...
//other stages here
...
} catch (e) {
if (e.message == updateOnly) {
currentBuild.result = 'ABORTED'
echo('Skipping the Job to update the build info')
// return here instead of throwing error to keep the build "green"
return
}
// normal error handling
throw e
}