如何将管道中的布尔参数值传递给下游作业?
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 控制器