如何使用Groovy API检索Jenkins构建参数?

时间:2012-06-04 13:53:02

标签: groovy jenkins

我有一个使用Perforce插件的参数化作业,并希望检索构建参数/属性以及Perforce插件设置的p4.change属性。

如何使用Jenkins Groovy API检索这些属性?

12 个答案:

答案 0 :(得分:25)

请注意官方Jenkins Wiki页面也会详细介绍这一点: https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+System+Groovy+script 重要部分转载如下:

// get parameters
def parameters = build?.actions.find{ it instanceof ParametersAction }?.parameters
parameters.each {
   println "parameter ${it.name}:"
   println it.dump()
}

// ... or if you want the parameter by name ...
def hardcoded_param = "FOOBAR"
def resolver = build.buildVariableResolver
def hardcoded_param_value = resolver.resolve(hardcoded_param)

答案 1 :(得分:24)

对于解析单个参数(我想最常需要的),这是我发现的最简单的参数:

  

build.buildVariableResolver.resolve( “myparameter”)

在Groovy System脚本构建步骤中。

答案 2 :(得分:17)

关于参数:

See this answer first。获取项目的所有构建列表(根据该答案获得):

project.builds

当您找到特定版本时,您需要使用ParametersAction获取build.getActions(hudson.model.ParametersAction)类型的所有操作。然后,您可以在返回的对象中查询特定参数。

关于p4.change:我怀疑它也存储为动作。在Jenkins Groovy控制台中获取包含p4.change的构建的所有操作并检查它们 - 它将让您知道在代码中要查找的内容。

答案 3 :(得分:10)

我刚刚开始使用Groovy Postbuild插件,你可以做到以下几点:

def paramText
def actionList = manager.build.getActions(hudson.model.ParametersAction)
if (actionList.size() != 0)
{
  def pA = actionList.get(0)
  paramText = pA.createVariableResolver(manager.build).resolve("MY_PARAM_NAME")
}

答案 4 :(得分:3)

如果参数名称无法硬编码,我发现这是访问参数最简单,最好的方法:

def myParam = env.getProperty(dynamicParamName)

如果参数名称已知且可以硬编码,则以下3行是等效的:

def myParam = env.getProperty("myParamName")
def myParam = env.myParamName
def myParam = myParamName

答案 5 :(得分:2)

获取所有参数:

System.getenv().each{
  println it
}

或更复杂:

def myvariables = getBinding().getVariables()
for (v in myvariables) {
   echo "${v} " + myvariables.get(v)
}

您需要禁用“使用Groovy Sandbox”。

答案 6 :(得分:1)

要从GroovyScript(使用Pipeline)获取当前版本的参数化构建参数,您需要做的就是: 假设您有一个名为VARNAME的变量。

def myVariable = env.VARNAME

答案 7 :(得分:0)

如果您试图将所有参数传递给Jenkins作业,则可以在groovy管道中使用全局变量 params 来获取它。

  

http://jenkins_host:8080/pipeline-syntax/globals

     

参数

     

将构建中定义的所有参数公开为只读映射   具有各种类型的值。示例:

     

如果(params.BOOLEAN_PARAM_NAME){doSomething()}或提供一个   非平凡的默认值:

     

if(params.get('BOOLEAN_PARAM_NAME',true)){doSomething()}注意   多分支(Jenkinsfile)用法:属性步骤可让您   定义作业属性,但是这些属性会在执行步骤时生效,   而构建参数定义通常在   构建开始。为了方便起见,当前在   具有默认值的作业也会在此地图中列出。   这样您就可以编写,例如:

     

properties([parameters([string(name:'BRANCH',defaultValue:   'master')])])git url:'…',branch:params.BRANCH,请确保   即使在最初的构建过程中,主分支也会被检出   分支项目,或者如果先前的构建未指定参数,或者   使用了不同的参数名称。

使用类似下面的内容。

def dumpParameter()
{
  params.each {
    println it.key + " = " + it.value
  }
}

答案 8 :(得分:0)

以下内容可用于检索环境参数:

println System.getenv("MY_PARAM") 

答案 9 :(得分:0)

感谢patrice-n!这段代码可以同时获取正在排队和正在运行的作业及其参数:

import hudson.model.Job
import hudson.model.ParametersAction
import hudson.model.Queue
import jenkins.model.Jenkins

println("================================================")
for (Job job : Jenkins.instanceOrNull.getAllItems(Job.class)) {
    if (job.isInQueue()) {
        println("------------------------------------------------")
        println("InQueue " + job.name)

        Queue.Item queue = job.getQueueItem()
        if (queue != null) {
            println(queue.params)
        }
    }
    if (job.isBuilding()) {
        println("------------------------------------------------")
        println("Building " + job.name)

        def build = job.getBuilds().getLastBuild()
        def parameters = build?.getAllActions().find{ it instanceof ParametersAction }?.parameters
        parameters.each {
            def dump = it.dump()
            println "parameter ${it.name}: ${dump}"
        }
    }
}
println("================================================")

答案 10 :(得分:0)

我用这个

node {  
    //single  
    echo 'deploy' + env.PROJECT_NAME  

    // list all  
    echo sh(returnStdout: true, script: 'env')  
}

答案 11 :(得分:0)

以下代码段对我有用,可以在参数化项目中获取参数值:
String myParameter = this.getProperty('binding').getVariable('MY_PARAMETER')

目标是根据选定的项目参数动态锁定资源。

在“[✓] 此构建需要可锁定资源”中,我有以下“[✓] Groovy 表达式”:

if (resourceName == 'resource_lock_name') {
    Binding binding = this.getProperty('binding')
    String profile = binding.getVariable('BUILD_PROFILE')

    return profile == '-Poradb' // acquire lock if "oradb" profile is selected
}

return false

在“[✓] 此项目已参数化”部分中,我有一个名为例如的“选择参数” BUILD_PROFILE 选项示例如下:

-Poradb
-Ph2db
-DskipTests -T4

只有在带参数构建项目时选择了“-Poradb”才会获取对“resource_lock_name”的锁

[-] 应取消选中使用 Groovy Sandbox 以使此语法起作用