如何在流水线中将布尔参数值传递给下游作业?

70
我正在使用集成交付管道功能的Jenkins v2.1(https://jenkins.io/solutions/pipeline/),来协调两个现有构建(构建和部署)。
在我的参数化构建中,我设置了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

我该如何解决这个类型转换错误?或者更好的办法是,我能否以一种不那么麻烦的方式将所有管道参数传递给下游作业?

我如何能在我的下游作业中使用它们(例如打印“target”的值)? - Rod Kimble
7个回答

57

除了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))
    ]

21
build job: 'deploy', parameters: [booleanParam(name: 'target', value: target)] 是布尔参数的等效语法。 - Morgan Christiansson
这似乎只适用于较新的Jenkins,参见https://issues.jenkins-ci.org/browse/JENKINS-27295。 - childno͡.de

42
假设:

Assuming

value: update_composer

问题所在,请尝试

value: Boolean.valueOf(update_composer)

有没有一种不那么麻烦的方法,可以将所有管道参数直接传递给下游作业?

就我所知,没有这样的方法,至少不能在禁用 Groovy 沙盒的情况下使用 Jenkins API 调用。


谢谢您的回答。我下周一回到工作岗位时会尝试这个方法。现在放了几天假。 - Bram Gerritsen
10
你的回答对我有用。当我阅读 Groovy 文档时,我甚至发现了一种更短的方法:update_composer.toBoolean() 也可以使用。 - Bram Gerritsen
2
+1 对 @BramGerritsen 的评论 - 这对我来说有效,即使在Groovy沙盒中,而 Boolean.valueOf 却不行 :) - Steve Campbell

15

像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

想知道为什么在该插件的文档中没有列出 BooleanParameterValue: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/#-build-%20build%20a%20job - Valentin Jacquemin

13

8

Jenkins的"boolean"参数实际上只是"choice parameter"类型的快捷方式,其选项硬编码为字符串"true"和"false",并带有复选框来设置字符串变量。但最终,它只是一个字符串变量,与真正的布尔值无关。因此,如果不想进行字符串比较,就需要将字符串转换为布尔值,例如:

if (myBoolean == "true")


4

不确定这是否回答了这个问题。但我正在寻找其他东西。强烈推荐观看这个2分钟的视频。如果您想了解更多细节,请参阅文档-处理参数链接

然后,如果您有像蓝海这样的东西,选择会看起来像这样:

enter image description here

作为视频中讨论的一部分,Jenkins之所以是蓝色的,是因为它使用了Blue Ocean Plugin
您可以通过以下方式定义和访问变量:
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}"
            }
        }
    }
}

自动构建将使用默认参数。但如果您手动执行,则可以选择选项。
然后像这样分配值:

enter image description here


1
这与问题无关,问题是关于向作业传递下游参数。 - Brandon

1
现在的事情要简单得多:内置的片段生成器支持“构建”步骤(虽然我不知道从什么时候开始)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接