如何访问参数化版本中的参数?

如何访问Jenkins工作的“Workflow”的“此构build是参数化”部分中设置的参数?

testing用例

  1. 创build一个工作stream程作业。
  2. 启用“此版本已参数化”。
  3. 使用默认值bar text添加STRING PARAMETER foo
  4. 将以下代码添加到Workflow Script

     node() { print "DEBUG: parameter foo = ${env.foo}" } 
  5. 运行工作。

结果

DEBUG: parameter foo = null

我认为这个variables是直接可用的,而不是通过env,当使用Workflow插件。 尝试:

 node() { print "DEBUG: parameter foo = ${foo}" } 

我尝试了这个线程的一些解决scheme。 它似乎工作,但我的价值观总是如此,我也遇到了以下问题: 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 

我发送了一个合并请求来更新错误的pipe道教程#build-parameters quote,它说“它们可以作为同名的Groovyvariables访问”。 。 ;)

编辑:正如杰西·格里克(Jesse Glick)所指出的: 发行说明进入更多细节

您还应该将pipe道作业插件更新到2.7或更高版本,以便将构build参数定义为环境variables,因此可以像访问全局Groovyvariables一样进行访问。

当你添加一个构build参数foo时,它会被转换成一个“裸露的variables”,所以在你的脚本中你可以这样做:

 node { echo foo } 

如果查看工作stream脚本的实现,将会看到在执行脚本时会dynamic生成一个名为WorkflowScript的类。 脚本中的所有语句都是在这个类的上下文中执行的。 传递给此脚本的所有构build参数都将转换为可从此类访问的属性。

例如,你可以这样做:

 node { getProperty("foo") } 

如果您好奇,下面是我写的一个工作stream脚本,它试图打印出WorkflowScript类的构build参数,环境variables和方法。

 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}" } } 

这里是我试过的另一个代码示例,我想testing一下是否设置了构build参数。

 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" } } 

使用双引号而不是单引号

例如echo“$ foo”而不是echo“$ foo”

如果您使用“使用参数构build”选项将pipe道configuration为接受参数,则可以将这些参数作为具有相同名称的Groovyvariables访问。 看到这里 。

如果你不需要执行variablesreplace ,你可以删除分号(;),删除括号((和)),并使用单引号(')而不是双引号(“)。 ,但我发现只有双(“)才能使其工作。

请注意,在pipe道脚本(pipe道插件)中访问构build参数的方式已更改。 这种方法: getBinding().hasVariable("MY_PARAM")不再工作。 请试试这个: def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false

希望下面这段代码适合你:

 def item = hudson.model.Hudson.instance.getItem('MyJob') def value = item.lastBuild.getEnvironment(null).get('foo') 

下面的代码片段可以让你访问所有的Job params

  def myparams = currentBuild.rawBuild.getAction(ParametersAction) for( p in myparams ) { pMap[p.name.toString()] = p.value.toString() } 

给参数variables添加前缀“params”。 例如:

 params.myParam 

不要忘记:如果您使用myParam的某些方法,可能是您应该在“脚本批准”中批准它。

根据pipe道插件教程 :

如果您已经将stream水线configuration为在构build时接受参数 – 使用参数构build – 它们可以作为具有相同名称的 Groovy variables访问。

所以尝试直接访问variables,例如:

 node() { print "DEBUG: parameter foo = " + foo print "DEBUG: parameter bar = ${bar}" }