【问题标题】:How to pass boolean parameter value in pipeline to downstream jobs?如何将管道中的布尔参数值传递给下游作业?
【发布时间】:2016-08-29 17:46:40
【问题描述】:

我正在使用具有集成交付管道功能 (https://jenkins.io/solutions/pipeline/) 的 Jenkins v2.1 来编排两个现有构建(构建和部署)。

在我的参数化构建中,我设置了 3 个用户参数,也需要在管道中进行选择。

管道脚本如下:

node: {
    stage 'build'
    build job: 'build', parameters: [[$class: 'StringParameterValue', name: 'target', value: target], [$class: 'ListSubversionTagsParameterValue', name: 'release', tag: release], [$class: 'BooleanParameterValue', name: 'update_composer', value: update_composer]]

    stage 'deploy'
    build job: 'deploy', parameters: [[$class: 'StringParameterValue', name: 'target', value: target]]
}

除了BooleanParameterValue 之外,这可以正常工作。当我构建管道时,会引发以下错误:

java.lang.ClassCastException: hudson.model.BooleanParameterValue.value expects boolean but received class java.lang.String

如何解决此类型转换错误? 或者更好的是,有没有一种不那么繁琐的方法,我可以将所有管道参数传递给下游作业。

【问题讨论】:

  • 我如何在下游作业中使用(例如打印“目标”的值)它们?

标签: jenkins groovy jenkins-pipeline


【解决方案1】:

假设

value: update_composer

是问题,试试

value: Boolean.valueOf(update_composer)

有没有一种不那么繁琐的方法,我可以将所有管道参数传递给下游作业

据我所知,至少在不使用 Jenkins API 调用和禁用 Groovy 沙箱的情况下是这样。

【讨论】:

  • 感谢您的回答。下周一我回去工作的时候试试这个。现在请假几天。
  • 你的答案对我有用。在阅读 groovy 文档时,我什至发现了一种更短的方法。 update_composer.toBoolean() 也可以。
  • +1 for @BramGerritsen 评论 - 即使在 Groovy 沙箱中也对我有用,而 Boolean.valueOf 没有:)
【解决方案2】:

除了Jesse Glick的答案,如果你想传递字符串参数然后使用:

build job: 'your-job-name', 
    parameters: [
        string(name: 'passed_build_number_param', value: String.valueOf(BUILD_NUMBER)),
        string(name: 'complex_param', value: 'prefix-' + String.valueOf(BUILD_NUMBER))
    ]

【讨论】:

【解决方案3】:

像 Jesse Jesse Glickabguy 说你可以将字符串枚举为布尔类型:

Boolean.valueOf(string_variable)

或相反的布尔转换成字符串:

String.valueOf(boolean_variable)

在我的情况下,我不得不将布尔参数传递给另一个工作。 所以为此你需要使用类 BooleanParameterValue

build job: 'downstream_job_name', parameters:
[
[$class: 'BooleanParameterValue', name: 'parameter_name', value: false],
], wait: true

【讨论】:

【解决方案4】:

Jenkins“布尔”参数实际上只是“选择参数”类型的快捷方式,选择硬编码为字符串“true”和“false”,并带有一个用于设置字符串变量的复选框。但最终,它只是:一个字符串变量,与真正的布尔值无关。这就是为什么如果您不想进行字符串比较,则需要将字符串转换为布尔值:

if (myBoolean == "true")

【讨论】:

    【解决方案5】:

    不确定这是否回答了这个问题。但我在寻找别的东西。强烈推荐查看this 2 minute video。如果您想了解更多详细信息,请参阅docs - Handling Parameters 和此link

    然后,如果您有类似 blue ocean 的东西,选择将如下所示:

    您可以像这样定义和访问您的变量:

    pipeline {
        agent any
    
        parameters {
        string(defaultValue: "TEST", description: 'What environment?', name: 'userFlag')
        choice(choices: ['TESTING', 'STAGING', 'PRODUCTION'], description: 'Select field for target environment', name: 'DEPLOY_ENV')
        }
    
        stages {
            stage("foo") {
                steps {
                    echo "flag: ${params.userFlag}"
                    echo "flag: ${params.DEPLOY_ENV}"
                }
            }
        }
    }
    

    自动构建将采用默认参数。但是,如果您手动操作,那么您可以选择。

    然后像这样赋值:

    【讨论】:

      【解决方案6】:

      现在事情变得容易多了:内置的代码片段生成器支持“构建”步骤(我不知道从什么时候开始)。

      【讨论】:

        【解决方案7】:
        build job: 'downstream_job_name', parameters: [
            booleanParam(name: 'parameter_name', value: false)
        ]
        

        (参见https://www.jenkins.io/doc/pipeline/steps/pipeline-build-step/#-build-%20build%20a%20job

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-05
          • 1970-01-01
          • 2023-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多