如何访问“Workflow” Jenkins 作业中“此构建是参数化的”部分设置的参数
?
测试用例
- 创建一个工作流作业。
- 启用“此构建是参数化的”选项。
- 添加一个字符串参数
foo
,默认值为bar text
。 将下面的代码添加到
Workflow Script
中:node() { print "DEBUG: parameter foo = ${env.foo}" }
- 运行任务。
结果
调试: 参数 foo = null
如何访问“Workflow” Jenkins 作业中“此构建是参数化的”部分设置的参数
?
测试用例
foo
,默认值为bar text
。将下面的代码添加到Workflow Script
中:
node()
{
print "DEBUG: parameter foo = ${env.foo}"
}
结果
调试: 参数 foo = null
当使用工作流插件时,我认为变量直接可用,而不是通过env获得。尝试:
node()
{
print "DEBUG: parameter foo = ${foo}"
}
我尝试了这个主题中的几个解决方案,它似乎可以工作,但我的值始终为true,我还遇到了以下问题:JENKINS-40235
我成功地在groovy的jenkinsfile
中使用参数,使用以下语法:params.myVariable
下面是一个可行的示例:
print 'DEBUG: parameter isFoo = ' + params.isFoo
print "DEBUG: parameter isFoo = ${params.isFoo}"
node() {
// adds job parameters within jenkinsfile
properties([
parameters([
booleanParam(
defaultValue: false,
description: 'isFoo should be false',
name: 'isFoo'
),
booleanParam(
defaultValue: true,
description: 'isBar should be true',
name: 'isBar'
),
])
])
// test the false value
print 'DEBUG: parameter isFoo = ' + params.isFoo
print "DEBUG: parameter isFoo = ${params.isFoo}"
sh "echo sh isFoo is ${params.isFoo}"
if (params.isFoo) { print "THIS SHOULD NOT DISPLAY" }
// test the true value
print 'DEBUG: parameter isBar = ' + params.isBar
print "DEBUG: parameter isBar = ${params.isBar}"
sh "echo sh isBar is ${params.isBar}"
if (params.isBar) { print "this should display" }
}
[Pipeline] {
[Pipeline] properties
WARNING: The properties step will remove all JobPropertys currently configured in this job, either from the UI or from an earlier properties step.
This includes configuration for discarding old builds, parameters, concurrent builds and build triggers.
WARNING: Removing existing job property 'This project is parameterized'
WARNING: Removing existing job property 'Build triggers'
[Pipeline] echo
DEBUG: parameter isFoo = false
[Pipeline] echo
DEBUG: parameter isFoo = false
[Pipeline] sh
[wegotrade-test-job] Running shell script
+ echo sh isFoo is false
sh isFoo is false
[Pipeline] echo
DEBUG: parameter isBar = true
[Pipeline] echo
DEBUG: parameter isBar = true
[Pipeline] sh
[wegotrade-test-job] Running shell script
+ echo sh isBar is true
sh isBar is true
[Pipeline] echo
this should display
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
我发送了一个Pull Request来更新误导性的pipeline教程#build-parameters引用,该引用说道“它们可以作为相同名称的Groovy变量被访问”。;)
编辑:正如Jesse Glick所指出的那样: 发布说明提供了更多细节。
您还应该将Pipeline Job Plugin更新到2.7或更高版本,这样构建参数将被定义为环境变量,因此可以像全局Groovy变量一样访问。
params
(作为平面字符串,不支持默认值)。它们现在在技术上是环境变量,尽管您仍然可以使用简单表达式来引用它们的值,因为对于访问,env.
前缀现在也是可选的。发行说明提供了更多详细信息。 - Jesse Glickproperties
一次或每次重写所有参数。 - GabLeRoux当您添加一个构建参数“foo”时,它将被转换为类似于“裸变量”的东西,因此在脚本中您需要这样操作:
node {
echo foo
}
如果您查看工作流脚本的实现,您将看到在执行脚本时会动态生成一个名为WorkflowScript的类。所有脚本中的语句都在该类的上下文中执行。所有传递给此脚本的构建参数都会转换为属性,并可从该类中访问。
例如,您可以执行以下操作:
node {
getProperty("foo")
}
如果你好奇,这里是我编写的一个工作流脚本,它试图打印出构建参数、环境变量和WorkflowScript类上的方法。
node {
echo "I am a "+getClass().getName()
echo "PARAMETERS"
echo "=========="
echo getBinding().getVariables().getClass().getName()
def myvariables = getBinding().getVariables()
for (v in myvariables) {
echo "${v} " + myvariables.get(v)
}
echo STRING_PARAM1.getClass().getName()
echo "METHODS"
echo "======="
def methods = getMetaClass().getMethods()
for (method in methods) {
echo method.getName()
}
echo "PROPERTIES"
echo "=========="
properties.each{ k, v ->
println "${k} ${v}"
}
echo properties
echo properties["class"].getName()
echo "ENVIRONMENT VARIABLES"
echo "======================"
echo "env is " + env.getClass().getName()
def envvars = env.getEnvironment()
envvars.each{ k, v ->
println "${k} ${v}"
}
}
这里是我尝试的另一个代码示例,我想测试一下构建参数是否已设置。
node {
groovy.lang.Binding myBinding = getBinding()
boolean mybool = myBinding.hasVariable("STRING_PARAM1")
echo mybool.toString()
if (mybool) {
echo STRING_PARAM1
echo getProperty("STRING_PARAM1")
} else {
echo "STRING_PARAM1 is not defined"
}
mybool = myBinding.hasVariable("DID_NOT_DEFINE_THIS")
if (mybool) {
echo DID_NOT_DEFINE_THIS
echo getProperty("DID_NOT_DEFINE_THIS")
} else {
echo "DID_NOT_DEFINE_THIS is not defined"
}
}
在参数变量前添加前缀“params.”,例如:
params.myParam
pipeline{
agent { node { label 'test' } }
options { skipDefaultCheckout() }
parameters {
string(name: 'suiteFile', defaultValue: '', description: 'Suite File')
}
stages{
stage('Initialize'){
steps{
echo "${params.suiteFile}"
}
}
}
def item = hudson.model.Hudson.instance.getItem('MyJob')
def value = item.lastBuild.getEnvironment(null).get('foo')
jenkins.model.Jenkins.instance
。 - Noam Manos def myparams = currentBuild.rawBuild.getAction(ParametersAction)
for( p in myparams ) {
pMap[p.name.toString()] = p.value.toString()
}
getBinding().hasVariable("MY_PARAM")
已经无法使用,请尝试以下替代方法:
def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false
env.getEnvironment()
返回以下错误: 脚本不允许使用方法org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment
。 - GabLeRoux如果您已经配置了管道以在构建时接受参数 - 使用参数构建 - 则它们可以作为相同名称的Groovy变量访问。
因此,请尝试直接访问变量,例如:
node()
{
print "DEBUG: parameter foo = " + foo
print "DEBUG: parameter bar = ${bar}"
}
。那只是Groovy中的变量标识符。
$`仅在某些类型的字符串中作为元字符。 - Jesse Glick