2014-03-13 29 views
3

我试图使用系统Groovy脚本为构建步骤这样来操纵我们的工作之一,一些变量:总是解析为null

//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 

但是,当我尝试以下方法,它只是打印空:

println build.buildVariableResolver.resolve(OS_MACHINE) 

即使当我尝试这个它打印空:

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}" 

现在我已经恢复了运行在一个新的工作很简单的脚本,该脚本是取自

这也打印空。

对于我的生活,我无法理解这里出了什么问题......任何人都可以帮助我吗?

+0

你可以尝试没有'def'关键字,所以变量进入绑定? –

+0

它引发了一个NPE在groovy.lang.Binding.setVariable – danf

+0

我不太了解Groovy,但任何机会这些是环境变量,而不是构建变量,因此无法访问“buildVariableResolver”?我用'高清relnum = manager.build.getEnvVars() “RELNUM”]'和'调用println “$ {} relnum”' – Slav

回答

2

A solution可以在Jenkins用户列表归档中找到。您正在创建新的StringParameterValue对象并将它们添加到构建ParametersAction中。

以上链接的解决方案为我写的(可能是因为我在一个旧版本詹金斯1.466.2的)并没有完全工作。 createUpdated方法没有被识别,所以我复制它在我的代码中,我将在下面发布。

// sets build parameters based on the given map 
// only supports StringParameterValue 
def setBuildParameters(parmMap) { 
    def npl = new ArrayList<StringParameterValue>() 
    for (k in parmMap.keySet()) { 
    npl.add(new StringParameterValue(k, parmMap.get(k))) 
    } 
    def newPa = null 
    def oldPa = build.getAction(ParametersAction.class) 

    if (oldPa != null) { 
    for (oldp in oldPa) { 
     if (! parmMap.containsKey(oldp.name)) { //oldp was not overridden by the new list 
     npl.add(oldp) 
     } 
    } 
    build.actions.remove(oldPa) 
    } 
    newPa = new ParametersAction(npl) 
    build.actions.add(newPa) 
} 
+0

谢谢你的答案,但我不明白这与我所做的有什么不同 - 为了将新参数添加到构建参数中,我必须做出什么一个全新的列表包含你喜欢的建议? – danf

+0

原来,我的问题的答案是肯定的:您必须用新的参数替换旧的参数动作(可以包含旧的参数),@EricP建议的脚本适用于我。 – danf

0

抱歉现在才来添加一个答案,但我有同样的问题,阅读这篇文章给我一个解决方案:

  • 只是添加在詹金斯的工作,一个字符串参数与变量的同名。

因此,解析器将在env参数中找到值,作为jenkins构建变量。

这样做解决了我的问题。