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

Viz*_*onz 57 groovy jenkins jenkins-pipeline

如何parameters在"工作流"Jenkins作业的"此构建参数化"部分中访问set?

测试用例

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

    node()
    {
         print "DEBUG: parameter foo = ${env.foo}"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 跑步工作.

结果

DEBUG: parameter foo = null

小智 76

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

node()
{
    print "DEBUG: parameter foo = ${foo}"
}
Run Code Online (Sandbox Code Playgroud)

  • 确保使用双引号而不是单引号.后者将跳过插值. (5认同)
  • 正确,如[此处](https://github.com/jenkinsci/workflow-plugin/blob/master/TUTORIAL.md#build-parameters)所述. (2认同)
  • 不,我错了 - 我正在使用sh'''echo X'''而不是sh"""echo X""" (2认同)

Gab*_*oux 52

我从这个帖子中尝试了一些解决方案.它似乎有效,但我的价值观总是如此,我也遇到了以下问题: JENKINS-40235

我设法使用jenkinsfile以下语法在groovy中使用参数:params.myVariable

这是一个有效的例子:

print 'DEBUG: parameter isFoo = ' + params.isFoo
print "DEBUG: parameter isFoo = ${params.isFoo}"
Run Code Online (Sandbox Code Playgroud)

一个更详细(和工作)的例子:

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" }
}
Run Code Online (Sandbox Code Playgroud)

产量

[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
Run Code Online (Sandbox Code Playgroud)

我发送了一个Pull Request来更新误导性的管道教程#build-parameters引用,它说"它们可以作为同名的Groovy变量访问"..;)

编辑:正如Jesse Glick所指出的那样: 发行说明会详细介绍

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

  • 参数继续可用而没有像以前那样的"params"(作为扁平字符串,没有默认值支持).它们在技术上是现在的环境变量,尽管您仍然可以使用裸表达式来引用它们的值,因为`env.前缀现在对于访问也是可选的.[发布说明](https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Groovy+Plugin#PipelineGroovyPlugin-2.18%28Sep23%2C2016%29)详细介绍. (2认同)
  • `属性部分已从0.8版本重命名。请改用选项。`这不再起作用 (2认同)

Cra*_*ues 12

当你添加一个构建参数foo时,它会被转换为类似"裸变量"的东西,所以在你的脚本中你会这样做:

node {
   echo foo
}
Run Code Online (Sandbox Code Playgroud)

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

例如,你可以这样做:

node {
    getProperty("foo")
}
Run Code Online (Sandbox Code Playgroud)

如果您很好奇,我写的是一个工作流脚本,它试图在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}"
   }
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的另一个代码示例,我想测试一下是否设置了构建参数.

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"
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这会产生: org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: 脚本不允许使用方法 java.lang.Class getName (2认同)

bur*_*vyg 7

给参数变量添加前缀"params".例如:

params.myParam
Run Code Online (Sandbox Code Playgroud)

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

  • 这已经解释过 [here](/sf/answers/2889386951/) 你为什么要重复它? (3认同)
  • 有些人认为它很有用。 (3认同)

小智 7

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

文档: 管道语法:参数

例子:

pipeline{

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

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

    stage('Initialize'){

        steps{

          echo "${params.suiteFile}"

        }
    }
 }
Run Code Online (Sandbox Code Playgroud)


Ken*_*dge 6

使用双引号而不是单引号

例如echo "$foo",而不是echo '$foo'

如果使用"使用参数构建"选项将管道配置为接受参数,则可以将这些参数作为同名的Groovy变量进行访问.看到这里.

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