6

這是開始開車送我瘋了..但似乎我的運氣由我自己看着辦吧:/傳遞系統環境變量到詹金斯從

我需要建立一個機制,分享串兩個從站之間的值,例如,名爲從站A和從站B

目前最接近最多一個我發現會這樣問: Jenkins Slave Environment Variable Refresh

但它仍然旨在讓在buildscripts訪問,而不是奴隸環境變量本身。 (相關SO問題:How are environment variables used in Jenkins with Windows Batch Command?

目前我有這種設置:

1)一個工作一個被觸發。

它執行這個窗口批次碼(實際路徑,很明顯,被替換爲「<>」):

cmd /c start java -jar <path_of_slave>\slave.jar -jnlpUrl <url_of_slave>/slave-agent.jnlp 

setenv.exe /m HOR_BUILD_ID -delete 
setenv.exe /m HOR_BUILD_ID %BUILD_NUMBER% 
setenv.exe /m HOR_UPSTREAM_ID -delete 
setenv.exe /m HOR_UPSTREAM_ID %JOB_NAME% 

不言自明和直向前IMHO。

2)作業A有上游作業B,這是在成功構建時觸發的。 所以,在從屬構建執行該批次碼(實際路徑,很明顯,被替換爲 '<>'):

SetLocal EnableDelayedExpansion 

@echo off 
@echo --- Refreshing Environemnt variables... 
@echo on 
set prgfil=%ProgramFiles(x86)% 
call "%WORKSPACE%\..\..\..\tools\misc\resetvars.bat" 
@echo --- Reading environment variables... 
copy /y "<path_containing_%HOR_UPSTREAM_ID%_variable" "<path_containing_%HOR_BUILD_ID%_variable" 
if !errorlevel!==0 goto ok1 
goto error 
:ok1 

goto end 

:error 
EndLocal 
exit /b 1 

:end 
EndLocal 

注:resetvars.bat和resetvars.vbs是從這個太問題採取:Is there a command to refresh environment variables from the command prompt in Windows?


輸出(%HOR_BUILD_ID%和%HOR_UPSTREAM_ID%的值),仍然是過時的......只有這樣,才能獲得新的變量刷新是重新啓動織補詹金斯(主)服務,但這是defi netly不走在CI環境...

現在的問題表面 - 如何使這些變量被刷新/重新讀取當的構建工作被觸發,這樣我就可以訪問使用例如EnvInject插件的從站的系統變量?


另一個SO問題和需要用戶交互的答案,所以在我的情況不能接受:Jenkins - passing variables between jobs?


這也不會在我的情況下工作:http://comments.gmane.org/gmane.comp.java.hudson.user/37897


也許Slave及其相應的節點不能接收變量/內核地解析其環境,導致無法檢索到全局envirtone mtn變量?切斷它,突然有一些有趣的環境變量 config data我的眼睛:

NODE_LABELS |一個prodreleases

NODE_NAME |一個

...這是從,但它應該是不同的值,因爲這原本是奴隸一個 ...什麼地獄????????????? ????? !!!! :/

我開始覺得根源問題是Jenkins在解析多個從節點NODE信息時有bug。

決定到@詹金斯JIRA創建一個問題:https://issues.jenkins-ci.org/browse/JENKINS-15397

+0

嘿夥計,我聽不懂你寫的一切。但基本上我確實能夠通過螞蟻腳本傳遞Jenkins系統變量。 –

+0

這對於這樣的基本需求來說是過分膨脹和java解析馬力。 :/ –

+0

我會避免通過Jenkins腳本/作業在從站之間傳遞數據 - 當添加從站或使從站脫機時,這可能會中斷。鏈接作業(如@zagrev所建議的)是一種更好的方式,然後您可以將數據傳遞給工件或使用插件。 –

回答

2

你看過添加參數化的觸發器插件嗎?

https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin

這應該允許您從第一份工作參數傳遞給第二(如作業名稱,刪除)。

+0

nop。 diID不工作。 –

+0

我需要的是讀取一個SYSTEM env變量(在機器上下文中)INTO BATCH的作業B < - 從< - SYSTEM env變量(在機器上下文中),我設置爲SYSTEM env變量(在機器上下文中)在作業A中。目前沒有任何東西允許我這樣做。 –

+0

因此,Java不會讓您將系統變量寫回操作系統。 Jenkins在java上運行,所以你可能無法編寫OS環境變量。聽起來就像你需要在作業之間選擇不同的溝通方法。如果作業A實際寫出一個OS環境變量,那麼它將在作業B中被JVM拾取。您是否想過使用文件來包含信息,或者可能是來自隊列中的消息?共享內存?您是否有能力更改Job A傳遞數據的方式? – Zagrev

2

我相信你正在尋找詹金斯參數構建! 按照說明here,你將馬上啓動並運行!

+0

正如我寫的 - 額外的負載在Java上,因此在升級/更新過程中jenkins核心的bug很難在重載預生成ci服務器上運行。此外,它不支持全自動參數化,恕我直言。 –

+1

對於我們來說,在非常繁重的環境中它可以完美地工作 – meza

+0

請指定您使用的完整配置。我迫切需要解決這個問題... –

0

好像這個(https://issues.jenkins-ci.org/browse/JENKINS-6604)固定所作的以下變化:

  • 固定inpossibility安裝在Windows 2K8多個從(R2)x64(Datacenter)機器;
  • 固定不可能正確解析值。設置沒有改變......但似乎重新進入所有登錄都有竅門。
  • probobly打破了工具環境設置,因爲NODE_LABELS和NODE_NAME不再加載到系統信息配置中了xD ......但是隻要這個設置真正起作用(並且在下一次jenkins更新中沒有被破壞......) d

僅供參考,我創建了JIRA問題仍然是開放的......