85

您如何访问parameters“工作流程”Jenkins 作业的“此构建已参数化”部分中的设置?

测试用例

  1. 创建工作流作业。
  2. 启用“此构建已参数化”。
  3. foo添加一个具有默认值的 STRING PARAMETER bar text
  4. 将以下代码添加到Workflow Script

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

结果

DEBUG: parameter foo = null

4

10 回答 10

98

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

node()
{
    print "DEBUG: parameter foo = ${foo}"
}
于 2015-03-27T11:42:13.220 回答
74

我尝试了这个线程中的一些解决方案。它似乎有效,但我的价值观始终是正确的,我还遇到了以下问题: JENKINS-40235

我设法使用jenkinsfile以下语法在 groovy 中使用参数: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来更新误导性的管道 tutorial#build-parameters引用,上面写着“它们可以作为同名的 Groovy 变量访问”。. ;)

编辑:正如 Jesse Glick 指出的: 发行说明进入更多细节

您还应该将 Pipeline Job Plugin 更新到 2.7 或更高版本,以便将构建参数定义为环境变量,从而可以像全局 Groovy 变量一样访问它们。

于 2016-12-22T06:26:04.903 回答
17

当您添加构建参数 foo 时,它会被转换为类似于“裸变量”的东西,因此在您的脚本中您将执行以下操作:

node {
   echo foo
}

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

例如,您可以这样做:

node {
    getProperty("foo")
}

如果您好奇,这里是我编写的一个工作流脚本,它尝试打印出 Wo​​rkflowScript 类的构建参数、环境变量和方法。

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"
   }
}
于 2015-12-29T22:29:15.743 回答
9

为参数变量添加前缀“params”。例如:

params.myParam

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

于 2017-04-04T07:52:34.010 回答
9

使用双引号而不是单引号

例如echo "$foo",与echo '$foo'

如果您使用 Build with Parameters 选项将管道配置为接受参数,则这些参数可以作为同名的 Groovy 变量访问。见这里

如果不需要执行变量替换,您可以删除分号 ( ;)、括号 ( ( and )),并使用单引号 ( ') 代替双引号 ( ") 。见这里。这让我想到了我的问题,尽管我发现只需要双 ( ) 才能使其工作。"

于 2016-09-29T21:26:27.477 回答
4

希望以下代码对您有用:

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

def value = item.lastBuild.getEnvironment(null).get('foo')
于 2015-02-18T06:52:21.750 回答
4

您还可以尝试使用参数指令来使您的构建参数化并访问参数:

文档: 管道语法:参数

例子:

pipeline{

agent { node { label 'test' } }
options { skipDefaultCheckout() }

parameters {
    string(name: 'suiteFile', defaultValue: '', description: 'Suite File')
}
stages{

    stage('Initialize'){

        steps{

          echo "${params.suiteFile}"

        }
    }
 }
于 2019-03-08T10:06:42.837 回答
2

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

getBinding().hasVariable("MY_PARAM")

不再工作了。请改用这个:

def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false
于 2016-11-15T16:13:16.797 回答
2

以下代码段使您可以访问所有作业参数

    def myparams = currentBuild.rawBuild.getAction(ParametersAction)
    for( p in myparams ) {
        pMap[p.name.toString()] = p.value.toString()
    }
于 2016-02-28T18:04:44.247 回答
0

根据管道插件教程

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

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

node()
{
     print "DEBUG: parameter foo = " + foo
     print "DEBUG: parameter bar = ${bar}"
}
于 2016-10-19T21:44:02.400 回答