如何访问参数化构建中的参数?
Posted
技术标签:
【中文标题】如何访问参数化构建中的参数?【英文标题】:How to access parameters in a Parameterized Build? 【发布时间】:2015-04-18 18:33:36 【问题描述】:如何访问“工作流程”Jenkins 作业的“此构建已参数化”部分中设置的 parameters
?
测试用例
-
创建 WORKFLOW 作业。
启用“此构建已参数化”。
添加一个字符串参数
foo
,默认值为bar text
。
将下面的代码添加到Workflow Script
:
node()
print "DEBUG: parameter foo = $env.foo"
运行作业。
结果
DEBUG: parameter foo = null
【问题讨论】:
另一个误解(#jenkins 中的 autojack:transcript)是您应该使用$foo
,如if ($PARAM == 'true') …
。这只是 Groovy 中的变量标识符。 $
只是某些字符串中的元字符。
要修改 Jenkins 参数,请尝试 EnvInject 插件。这是一个示例:***.com/a/7067223/658497
【参考方案1】:
希望以下代码对您有用:
def item = hudson.model.Hudson.instance.getItem('MyJob')
def value = item.lastBuild.getEnvironment(null).get('foo')
【讨论】:
这工作量太大了,如果您使用“沙盒”模式,或者项目有并发构建,甚至都无法工作。 你也可以使用jenkins.model.Jenkins.instance
【参考方案2】:
我认为在使用 Workflow 插件时,该变量是直接可用的,而不是通过 env。 试试:
node()
print "DEBUG: parameter foo = $foo"
【讨论】:
正确,如here 所述。 但为了使它可用于 shell 任务,我似乎必须分配给 'env' - 这感觉很奇怪......例如:env.PARAM = PARAM 不,我错了 - 我使用的是 sh '''echo X''' 而不是 sh """echo X""" 确保使用双引号而不是单引号。后者将跳过插值。 确保不要使用“env”作为参数之一,因为它是保留关键字,它不起作用【参考方案3】:当您添加构建参数 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"
【讨论】:
对我来说这会产生:org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not allowed to use method java.lang.Class getName【参考方案4】:以下 sn-p 让您可以访问所有作业参数
def myparams = currentBuild.rawBuild.getAction(ParametersAction)
for( p in myparams )
pMap[p.name.toString()] = p.value.toString()
【讨论】:
【参考方案5】:用双引号代替单引号
例如echo "$foo"
而不是 echo '$foo'
如果您使用 Build with Parameters 选项将管道配置为接受参数,则这些参数可以作为同名的 Groovy 变量访问。见Here。
你可以去掉分号(;
),去掉括号(( and )
),用单引号('
)代替双引号("
)如果你不需要执行变量替换。见Here。尽管我发现只有双 ("
) 才能使其工作,但这让我明白了我的问题。
【讨论】:
【参考方案6】:根据Pipeline plugin tutorial:
如果您已将管道配置为在构建时接受参数 - 使用参数构建 - 它们可以作为 Groovy 同名变量访问。
所以尝试直接访问变量,例如:
node()
print "DEBUG: parameter foo = " + foo
print "DEBUG: parameter bar = $bar"
【讨论】:
【参考方案7】:请注意,在管道脚本(管道插件)中访问构建参数的方式已经改变。这种方法:
getBinding().hasVariable("MY_PARAM")
不再工作了。请改用这个:
def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false
【讨论】:
我试过了,env.getEnvironment()
失败并出现以下错误:Scripts not permitted to use method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment
@GabLeRoux,您可以在 Jenkins 中的 Manage Jenkins > In-process Script Approval 下添加权限(在某些情况下这可能不是一个好主意,因为您的安全性会较弱)
确实,这可能行得通,但我更喜欢将安全风险保持在低水平 :) 我设法让它工作了,posted this answer【参考方案8】:
我尝试了该线程中的一些解决方案。它似乎有效,但我的价值观始终是正确的,我也遇到了以下问题: 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 tutorial#build-parameters 引用,该引用说“它们可以作为同名的 Groovy 变量访问。”。 ;)
编辑: 正如 Jesse Glick 指出的: Release notes详细了解
您还应该将 Pipeline Job Plugin 更新到 2.7 或更高版本,以便将构建参数定义为环境变量,从而可以像全局 Groovy 变量一样访问它们。
【讨论】:
参数在没有params
的情况下仍然可用(作为平面字符串,不支持默认值)。从技术上讲,它们现在是环境变量,尽管您仍然可以使用裸表达式引用它们的值,因为 env.
前缀现在对于访问也是可选的。 Release notes 详细说明。
这真的帮助我解决了我的问题:***.com/questions/42115868/… 非常感谢。
任何线索我可以如何继续:***.com/questions/42277315/…?
@Basti:Jon S 的回答在你的问答中是正确的,你必须只调用一次properties
或每次重写所有参数。
The properties section has been renamed as of version 0.8. Use options instead.
这不再有效【参考方案9】:
为参数变量添加前缀“params”。 例如:
params.myParam
别忘了:如果你使用 myParam 的某些方法,可能你应该在“脚本批准”中批准它。
【讨论】:
这已经解释过了here为什么还要重复呢? 因为我添加了重要的注释,是什么问题? 如果您想添加到原始内容中,那么在此处执行的适当操作是对原始答案发表评论。一年后不添加新答案。另外,我不知道你的“重要提示”到底是什么? 有人觉得有用。【参考方案10】:您也可以尝试使用 parameters 指令来使您的构建参数化并访问参数:
文档: Pipeline syntax: Parameters
例子:
pipeline
agent node label 'test'
options skipDefaultCheckout()
parameters
string(name: 'suiteFile', defaultValue: '', description: 'Suite File')
stages
stage('Initialize')
steps
echo "$params.suiteFile"
【讨论】:
以上是关于如何访问参数化构建中的参数?的主要内容,如果未能解决你的问题,请参考以下文章