将System Env变量传递给Jenkins Slave

时间:2012-10-01 09:24:15

标签: continuous-integration jenkins environment-variables slave

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

我需要设置一种机制来在两个从属设备之间共享字符串值,例如,名为slave A 和slave B

目前我找到的最接近的是这个SO问题: Jenkins Slave Environment Variable Refresh

但它仍然旨在启用buildcripts中的访问,而不是Slaves环境变量本身。 (相关的SO问题:How are environment variables used in Jenkins with Windows Batch Command?

目前我有这个设置:

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%

非常明确且直截了当的imho。

2) A 上的作业有上游作业 B ,这是在成功构建时触发的。 因此,在 B 中, B 构建执行此批处理代码(显然,实际路径将替换为'&lt;&gt;'):

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取自此SO问题:Is there a command to refresh environment variables from the command prompt in Windows?


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

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


另一个SO问题和答案需要用户互动,因此在我的案例中是不可接受的:Jenkins - passing variables between jobs?


这在我的情况下也不起作用:http://comments.gmane.org/gmane.comp.java.hudson.user/37897


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

NODE_LABELS |一个prodreleases

NODE_NAME |一个

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

我开始觉得根本问题是Jenkins在解析多个奴隶NODE信息时有错误。

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

3 个答案:

答案 0 :(得分:2)

我相信你正在寻找Jenkins参数化构建! 按照here的说明操作,您将立即启动并运行!

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

似乎这样(https://issues.jenkins-ci.org/browse/JENKINS-6604)修复了以下更改:

  • 修复了在Windows 2k8(R2)x64(数据中心)计算机中安装多个从站的不可能性;
  • 修复了无法正确解析值的问题。设置没有改变......但似乎重新进入所有登录就行了。
  • 问题破坏了工具环境设置,因为NODE_LABELS和NODE_NAME没有再加载到系统信息配置中xD ...但是只要这个设置确实有效(并且在下一个jenkins更新中没有被破坏),谁会关心...: d

作为参考,我创建的jira问题仍然是开放的......