我有一个使用 Perforce 插件的参数化作业,并且想要检索构建参数/属性以及由 Perforce 插件设置的 p4.change 属性。
如何使用 Jenkins Groovy API 检索这些属性?
更新: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()
}
对于解决单个参数(我猜是最常用的),这是我发现的最简单的:
build.buildVariableResolver.resolve("myparameter")
在您的 Groovy System 脚本构建步骤中。
关于参数:
先看这个答案。要获取项目的所有构建列表(根据该答案获得):
project.builds
当您找到您的特定构建时,您需要使用 获取ParametersAction类型的所有操作build.getActions(hudson.model.ParametersAction)
。然后查询返回的对象以获取您的特定参数。
关于 p4.change:我怀疑它也被存储为一个动作。在 Jenkins Groovy 控制台中,获取包含 p4.change 的构建的所有操作并检查它们 - 它会让您了解在代码中寻找什么。
我刚刚完成了这项工作,特别是,使用 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")
}
如果无法对参数名称进行硬编码,我发现这将是访问参数的最简单和最好的方法:
def myParam = env.getProperty(dynamicParamName)
在某些情况下,当参数名称已知并且可以硬编码时,以下 3 行是等效的:
def myParam = env.getProperty("myParamName")
def myParam = env.myParamName
def myParam = myParamName
要从 GroovyScript(使用 Pipeline)的当前构建中获取参数化构建参数,您需要做的就是:假设您有一个名为 VARNAME 的变量。
def myVariable = env.VARNAME
System.getenv().each{
println it
}
或者更复杂:
def myvariables = getBinding().getVariables()
for (v in myvariables) {
echo "${v} " + myvariables.get(v)
}
您需要同时禁用“使用 Groovy Sandbox”。
如果您尝试将所有参数传递给 Jenkins 作业,您可以使用 groovy 管道中的全局变量params来获取它。
http://jenkins_host:8080/pipeline-syntax/globals
参数
使用类似下面的东西。
def dumpParameter()
{
params.each {
println it.key + " = " + it.value
}
}
以下可用于检索环境参数:
println System.getenv("MY_PARAM")
谢谢帕特里斯-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("================================================")
以下代码片段对我有用,可以在参数化项目中获取参数值:
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 以使此语法正常工作