2014-01-20 199 views
30

我使用Scriptler插件,因此我可以將Groovy腳本作爲構建步驟運行。我的詹金斯奴隸在服務模式下在窗戶上運行。使用scriptler,我不需要使用windows批處理腳本。在Jenkins構建步驟中訪問從Groovy腳本構建環境變量(Windows)

但我有麻煩獲取環境變量在構建步驟...這是工作:

System.getenv("BASE") 

BASE是詹金斯啓動將env-瓦爾的一部分。不過,我想獲得

%JOB_NAME% 

如果我加入一個「執行Windows批處理命令」蓋步:

echo %JOB_NAME% 

它的工作原理。 如果我加入一個scriptler腳本作爲生成步驟使用相同的設置:

println "JOB_NAME: " + System.getenv("JOB_NAME") 

我越來越:

JOB_NAME: null 

所以,我怎麼可以從Groovy腳本達到注入的環境變量作爲構建步驟?

回答

7

Scriptler Groovy腳本似乎沒有獲取構建的所有環境變量。但是你可以做的是迫使他們在作爲參數傳遞給腳本:

  1. 當您添加Scriptler建設步入你的工作,選擇選項「定義腳本參數」

  2. 添加參數每個要傳入的環境變量。例如「名稱:JOB_NAME」,「值:$ JOB_NAME」。該值將使用'$ envName'類型變量從Jenkins構建環境中擴展,作業配置設置中的大多數字段都支持這種根據我的經驗進行的擴展。

  3. 在你的腳本,你應該有相同的名稱作爲參數變量,這樣你就可以像訪問參數:

    的println「JOB_NAME = $ JOB_NAME」

除了一些實驗之外,我還沒有使用過Sciptler,但是你的問題提出了一個有趣的問題。我希望這有幫助!

+0

這種方法的一個問題(假設變量設置爲MYVAR)是groovy將「炸燬」,如果值不作爲參數提供。要看看WAS通過了什麼,你可以試試這個: ''' println「 - >提供了以下值:」 this.binding.variables.each {k,v - > println「$ k ='$ v' 「} ''' –

16

你也許能夠讓他們像這樣:

def thr = Thread.currentThread() 
def build = thr?.executable 
def envVarsMap = build.parent.builds[0].properties.get("envVars") 
+0

看起來很討厭,但作品... – Rajish

+0

這沒有工作詹金斯1.573 – bicepjai

40

聽衆和構建系統常規運行過程中存在的對象。你可以這樣做:

def myVar = build.getEnvironment(listener).get('myVar') 
+1

謝謝!這似乎是在「Execute System Groovy Script」構建步驟中訪問env vars的唯一方法。 –

+0

不適用於我,得到「作爲構建包裝注入env變量發生問題:null」。沒有額外的錯誤細節,如何調試這種情況? –

+0

該問題陳述「我使用Scriptler插件...」,這需要系統常規執行,因此不回答問題。 – christutty

5

我能得到這個工作(在Linux上)唯一的辦法就是遵循這樣的建議:

https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+System+Groovy+script

import hudson.model.* 

// get current thread/Executor and current build 
def thr = Thread.currentThread() 
def build = thr?.executable 

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

這是詹金斯1。在CentOS 6.7

3

運行624詹金斯2.x中,使用Groovy插件2.0,運行SystemGroovyScript我設法建立變量,如下:

def build = this.getProperty('binding').getVariable('build') 
def listener = this.getProperty('binding').getVariable('listener') 
def env = build.getEnvironment(listener) 
println env.MY_VARIABLE 

如果您正在使用goovy從文件,簡單的System.getenv('MY_VARIABLE')就足夠了

相關問題