2014-03-13 60 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構建變量。

這樣做解決了我的問題。