这开始让我发疯了..但似乎我自己搞砸了:/
我需要建立一种机制来在两个从机之间共享字符串值,例如,名为 slave A和 slave B。
目前我发现的最接近的是这个 SO Question: Jenkins Slave Environment Variable Refresh
但它的目标仍然是在 buildscripts 中启用访问,而不是在 Slaves 环境变量本身中。(相关的 SO Question: 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%
非常不言自明和直截了当的恕我直言。
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
注意:resetvars.bat 和 resetvars.vbs 取自此 SO 问题:是否有从 Windows 的命令提示符刷新环境变量的命令?
输出(%HOR_BUILD_ID% 和 %HOR_UPSTREAM_ID% 值)仍然过时......刷新新变量的唯一方法是重新启动该死的 jenkins(主)服务,但这在 CI 环境中绝对不行。 ..
现在问题浮出水面 - 如何在B上的构建作业B被触发时刷新/重新读取这些变量,以便我可以使用例如 EnvInject 插件从不使用从属设备访问系统变量?
另一个需要用户交互的问题和答案,因此在我的情况下是不可接受的:Jenkins - 在工作之间传递变量?
这在我的情况下也不起作用:http: //comments.gmane.org/gmane.comp.java.hudson.user/37897
也许从站及其对应的节点没有收到变量/正确解析其环境,导致无法从全局环境变量中检索信息?查了一下,突然一些有趣的环境变量配置数据让我眼前一亮:
NODE_LABELS | 产品发布
NODE_NAME | 一种
...这是给奴隶B的,但它应该是不同的值,因为这最初是给奴隶A 的...什么鬼???????????????!!!!!!!!!:/
我开始觉得根本问题是 Jenkins 在解析多个从节点信息时存在错误。
决定创建一个问题@Jenkins jira:https ://issues.jenkins-ci.org/browse/JENKINS-15397