Jenkins 声明式管道动态选择参数在首次构建后不会更新

标签 jenkins groovy jenkins-pipeline jenkins-declarative-pipeline

我正在尝试将旧的 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/

相关文章:

Groovy - 扩展结构

java - 使用 Robolectric 测试 Android 库

git - Jenkins MultiBranch - 从管道文件 (Jenkinsfile) 中引用 git repo 的标签

jenkins - 在 Jenkins 中聚合下游参数化作业的结果

java - 可以在jenkins docker容器中安装oracle jdk 8

java - 如何在 Jenkins Groovy 脚本中使用逗号分隔符分割字符串?

maven - Jenkins 管道和 Gradle 项目,如何获取 GAV 属性以使用 Jenkins Nexus 插件部署 Artifact ?

java - 如何在 Jenkins 中配置 Java 的 Checkstyle 配置

java - gradle - 最小化 processResources 中的 json 资源

jenkins-pipeline - 使用 Jenkins 管道解压缩文件