我正在尝试将旧的 Jenkins 作业转换为声明性管道代码。
当尝试在脚本中使用选择参数时,我实现了一个应该返回更新值的函数,如果这些值不是最新的值 - 作业将会失败。
问题是,在第一次构建看起来不错之后,这些值保持静态,之后它们不会更新,正如我上面所说的那样,我的工作失败了。 就像我编写的函数在第一次构建时仅运行一次,并且不会再次运行。
我尝试以将输出发送到文件并从中读取的方式编写代码 - 因此也许该函数将通过从文件中获取文本来更新 - 但这不起作用。
我尝试查看 Jenkins 文档/许多其他线程,但没有找到任何东西。
我的代码如下所示:
def GetNames() {
def workspace = "..."
def proc = "${workspace}/script.sh list".execute()
return proc.text
}
${workspace} - 只是我的工作区,没关系。
script.sh - 100% 有效且经过测试的脚本
return proc.text - 是否返回值,我在 Jenkins 网站/脚本部分对其进行了测试,并且值确实返回并更新。
我的参数部分:
parameters {
choice(name: 'Names', choices: GetNames(), description: 'The names')
}
第一次构建我得到 5 个名称,这很好,因为这些是更新的值,第二次构建我知道有 10 个值,但我仍然得到之前的 5 个值,之后的每个构建我仍然会得到相同的 5 个名称- 它们根本不会更新,该功能不会再次触发。
这似乎是一个长期存在的问题,仍然没有得到修补,唯一提到这一点的线程是这个: Jenkins dynamic declarative pipeline parameters但解决方案是采用脚本化而非声明式的方式。
最佳答案
好吧,我终于想通了,解决方案是结合声明式和脚本化方式,
(使用事件参数插件)。
node {
properties([
parameters([
[$class: 'ChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
description: 'The names',
filterLength: 1,
filterable: true,
name: 'Name',
randomName: 'choice-parameter-5631314439613978',
script: [
$class: 'GroovyScript',
script: [
classpath: [],
sandbox: false,
script: '''
some code.....
return something'''
]
]
],
])
])
}
pipeline {
agent any
.
.
这样,每次加载页面时,事件参数的脚本部分都会启动,并且每次都会更新返回值。
关于Jenkins 声明式管道动态选择参数在首次构建后不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55898615/