40

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

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

4

11 回答 11

31

更新:Jenkins 2.x 解决方案:

使用 Jenkins 2 管道 dsl,您可以使用基于params(Map) 内置的简单语法直接访问任何参数:

echo " FOOBAR value: ${params.'FOOBAR'}"

返回的值将是字符串或布尔值,具体取决于参数类型本身。脚本或声明性语法的语法相同。更多信息:https ://jenkins.io/doc/book/pipeline/jenkinsfile/#handling-parameters

如果您的参数名称本身在变量中:

def paramName = "FOOBAR"
def paramValue = params.get(paramName) // or: params."${paramName}"
echo """ FOOBAR value: ${paramValue}"

Jenkins 1.x 的原始答案:

对于 Jenkins 1.x,语法基于build.buildVariableResolver内置:

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

请注意官方 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()
}
于 2013-10-24T11:24:37.520 回答
27

对于解决单个参数(我猜是最常用的),这是我发现的最简单的:

build.buildVariableResolver.resolve("myparameter")

在您的 Groovy System 脚本构建步骤中。

于 2014-05-14T21:29:01.993 回答
19

关于参数:

先看这个答案。要获取项目的所有构建列表(根据该答案获得):

project.builds

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

关于 p4.change:我怀疑它也被存储为一个动作。在 Jenkins Groovy 控制台中,获取包含 p4.change 的构建的所有操作并检查它们 - 它会让您了解在代码中寻找什么。

于 2012-06-04T14:50:37.120 回答
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")
}
于 2012-11-28T11:32:55.530 回答
6

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

def myParam = env.getProperty(dynamicParamName)

在某些情况下,当参数名称已知并且可以硬编码时,以下 3 行是等效的:

def myParam = env.getProperty("myParamName")
def myParam = env.myParamName
def myParam = myParamName
于 2018-06-06T18:32:13.783 回答
3

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

def myVariable = env.VARNAME

于 2018-02-05T23:43:13.747 回答
2

获取所有参数:

System.getenv().each{
  println it
}

或者更复杂:

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

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

于 2017-05-26T13:09:56.747 回答
2

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

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

参数

使用类似下面的东西。

def dumpParameter()
{
  params.each {
    println it.key + " = " + it.value
  }
}
于 2019-07-12T10:00:59.297 回答
0

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

println System.getenv("MY_PARAM") 
于 2019-09-12T05:35:25.620 回答
0

谢谢帕特里斯-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("================================================")
于 2019-11-11T14:47:34.890 回答
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 以使此语法正常工作

于 2021-02-17T12:49:07.993 回答