如何将管道中的布尔参数值传递给下游作业?

Posted

技术标签:

【中文标题】如何将管道中的布尔参数值传递给下游作业?【英文标题】: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

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

【问题讨论】:

我如何在下游作业中使用(例如打印“目标”的值)它们? 【参考方案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))
    ]

【讨论】:

build job: 'deploy', parameters: [booleanParam(name: 'target', value: target)] 是布尔参数的等效语法 这似乎只适用于较新的 Jenkins,请参阅 issues.jenkins-ci.org/browse/JENKINS-27295【参考方案3】:

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

Boolean.valueOf(string_variable)

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

String.valueOf(boolean_variable)

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

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

【讨论】:

想知道为什么 BooleanParameterValue 没有在插件的文档中列出:jenkins.io/doc/pipeline/steps/pipeline-build-step/…【参考方案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)

【讨论】:

以上是关于如何将管道中的布尔参数值传递给下游作业?的主要内容,如果未能解决你的问题,请参考以下文章

如何将不同的值传递给管道参数

如何在 GitLab CI 的管道中将变量的值从一个作业传递到下一个作业?

传递给 Y 的参数 X 必须是布尔值的实例,给定的布尔值 - PHP7

通过 Ajax 将布尔值传递给 asp.net api 控制器

如何在运行Jenkins CI管道时屏蔽作为用户输入传递的密码?

如何在 Tensorflow 中使用 benchmark_model 时将布尔值传递给占位符?