将System Env变量传递给Jenkins Slave

HX_*_*ned 7 continuous-integration environment-variables slave jenkins

这开始让我发疯了......但似乎我不幸自己想出来:/

我需要设置一个机构共享两个从机之间的字符串值,例如,名为从属和从.

目前我发现的最接近的是这个问题: Jenkins Slave Environment Variable Refresh

但它仍然旨在启用buildcripts中的访问,而不是Slaves环境变量本身.(相关SO问题:如何在Jenkins中使用Windows批处理命令使用环境变量?)

目前我有这个设置:

1)在A上工作A被触发.

它执行这个Windows批处理代码(显然,实际路径被替换为'<>'):

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%
Run Code Online (Sandbox Code Playgroud)

相当不言自明和直截了当的imho.

2)A上的作业具有上游作业B,即成功构建时触发.因此,在从属B中,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
Run Code Online (Sandbox Code Playgroud)

注意:resetvars.bat和resetvars.vbs取自此SO问题:是否有命令从Windows中的命令提示符刷新环境变量?


输出(%HOR_BUILD_ID%和%HOR_UPSTREAM_ID%值)仍然是过时的...获取新变量的唯一方法是重新启动该darn jenkins(主)服务,但这在CI环境中绝对不行. ..

问题现在浮出水面 - 当B上的构建作业B被触发时如何使这些变量被刷新/重新读取,所以我可以使用例如EnvInject插件从奴隶访问系统变量?


另一个SO问题和答案需要用户交互,因此在我的案例中是不可接受的:Jenkins - 在作业之间传递变量?


这在我的案例中也不起作用:http://comments.gmane.org/gmane.comp.java.hudson.user/37897


也许Slave及其相应的节点没有接收变量/解决其环境,导致无法从全局envirtonemtn变量中检索信息?Cechked它,突然一些有趣的环境变量配置数据cought我的眼睛:

NODE_LABELS | 一个prodreleases

NODE_NAME | 一个

...这是奴隶B,但它应该是不同的值,因为这最初是为奴隶A ...真是太糟糕了????????????????? !!!! :/

我开始觉得根本问题是Jenkins在解析多个从属NODE信息时有错误.

决定创建一个问题@ Jenkins jira:https://issues.jenkins-ci.org/browse/JENKINS-15397

Zag*_*rev 2

您是否考虑过添加参数化触发器插件?

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

这应该允许您将参数从第一个作业传递到第二个作业(例如要删除的作业名称)。