【发布时间】:2014-03-13 14:34:20
【问题描述】:
我正在尝试在我们的一项工作中使用系统 groovy 脚本作为构建步骤来操作一些变量:
//Current Thread run
def thr = Thread.currentThread()
def current_build = thr?.executable
//Get upstream job
def parent_build = current_build.getCause(hudson.model.Cause.UpstreamCause).getUpstreamRun()
//Upstream job build vars
def parentMap = parent_build.getBuildVariables()
println "ParentbuildMap.get(OSType) = " + parentMap.get("OSType")
println "ParentbuildMap.get(DBType) = " + parentMap.get("DBType")
//TODO insert SQL script here to populate OS_MACHINE and DB_MACHINE
def OS_MACHINE = parentMap.get("OSType") + ": ##Machine_Name##"
def DB_MACHINE = parentMap.get("DBType") + ": **Machine_Name**"
现在,当我尝试这样打印它们时,它会很好地打印值:
println "OS_MACHINE = " + OS_MACHINE
println "DB_MACHINE = " + DB_MACHINE
但是当我尝试以下操作时,它只会打印 null:
println build.buildVariableResolver.resolve(OS_MACHINE)
即使我尝试这样做,它也会打印 null:
def thr = Thread.currentThread()
def current_build = thr?.executable
def buildMap = build.getBuildVariables()
println "buildMap.get(OS_MACHINE) = " + buildMap.get("OS_MACHINE")
println "buildMap.get(DB_MACHINE) = " + buildMap.get("DB_MACHINE")
当我尝试这个时:
def params = [
new StringParameterValue('JOB_OS_MACHINE', OS_MACHINE),
new StringParameterValue('JOB_DB_MACHINE', DB_MACHINE),
]
build.addAction(new ParametersAction(params))
println "buildMap.get(JOB_OS_MACHINE) = " + buildMap.get("JOB_OS_MACHINE")
println "buildMap.get(JOB_DB_MACHINE) = " + buildMap.get("JOB_DB_MACHINE")
在这种情况下,如果我将 OS_MACHINE 和 DB_MACHINE 替换为纯字符串,它甚至都不起作用
我现在恢复为在新作业上运行一个非常简单的脚本,该脚本来自: https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+System+Groovy+script
import hudson.model.*
// get current thread / Executor
def thr = Thread.currentThread()
// get current build
def build = thr?.executable
// ... or if you want the parameter by name ...
def hardcoded_param = "FOOBAR"
def resolver = build.buildVariableResolver
def hardcoded_param_value = resolver.resolve(hardcoded_param)
println "param ${hardcoded_param} value : ${hardcoded_param_value}"
这也打印 null。
对于我的一生,我无法理解这里出了什么问题......谁能帮助我吗?
【问题讨论】:
-
您可以尝试不使用
def关键字,以便变量进入绑定吗? -
它在 groovy.lang.Binding.setVariable 处抛出一个 NPE
-
我对 Groovy 了解不多,但有可能这些是环境变量而不是构建变量,因此“buildVariableResolver”无法访问?我使用
def relnum= manager.build.getEnvVars()["RELNUM"]和println "${relnum}" -
我的问题特别是这个块不起作用:def params = [ new StringParameterValue('JOB_OS_MACHINE', OS_MACHINE), new StringParameterValue('JOB_DB_MACHINE', DB_MACHINE), ] build.addAction(new ParametersAction (参数))