如何访问参数化构建中的参数?

时间:2015-02-17 22:10:59

标签: jenkins groovy jenkins-pipeline

如何访问“工作流程”Jenkins工作的“此版本已参数化”部分中设置的parameters

测试案例

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

    node()
    {
         print "DEBUG: parameter foo = ${env.foo}"
    }
    
  5. 跑步。
  6. RESULT

    DEBUG: parameter foo = null

10 个答案:

答案 0 :(得分:71)

我认为在使用Workflow插件时,变量可以直接使用,而不是通过env。 尝试:

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

答案 1 :(得分:51)

我尝试了这个帖子中的一些解决方案。它似乎有效,但我的价值观总是如此,我也遇到了以下问题: 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变量一样进行访问。

答案 2 :(得分:11)

添加构建参数时,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"
   }
}

答案 3 :(得分:6)

使用双引号而不是单引号

e.g。 echo "$foo"而不是echo '$foo'

如果使用“使用参数构建”选项将管道配置为接受参数,则可以将这些参数作为同名的Groovy变量进行访问。请参阅Here

您可以删除分号(;),删除括号(( and )),然后使用单引号(')而不是双引号("如果您不需要执行变量替换。见Here。这让我想到了我的问题,虽然我发现只需要双(")才能使它工作。

答案 4 :(得分:6)

参数变量add prefix" params。" 例如:

params.myParam

不要忘记:如果你使用myParam的某种方法,可能应该在#34;脚本批准"。

中批准它。

答案 5 :(得分:2)

以下代码段可让您访问所有Job params

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

答案 6 :(得分:2)

请注意,在管道脚本(管道插件)中访问构建参数的方式已更改。这种方法:

getBinding().hasVariable("MY_PARAM")

不再工作了。请试试这个:

def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false

答案 7 :(得分:1)

希望以下代码能够为您服务:

def item = hudson.model.Hudson.instance.getItem('MyJob')

def value = item.lastBuild.getEnvironment(null).get('foo')

答案 8 :(得分:0)

根据Pipeline plugin tutorial

  

如果您已将管道配置为在构建时接受参数 - 使用参数构建 - 它们可以作为Groovy 同名变量进行访问。

因此,请尝试直接访问变量,例如:

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

答案 9 :(得分:0)

您还可以尝试使用 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}"

        }
    }
 }