【发布时间】:2012-10-01 09:24:15
【问题描述】:
这开始让我发疯了..但似乎我自己搞砸了:/
我需要建立一个机制来在两个slave之间共享字符串值,例如命名slave A和slave B。
目前我发现的最接近的是这个 SO 问题: Jenkins Slave Environment Variable Refresh
但它仍然致力于在 buildscripts 中启用访问,而不是在 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%
非常不言自明且直截了当的恕我直言。
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 问题:Is there a command to refresh environment variables from the command prompt in Windows?
输出(%HOR_BUILD_ID% 和 %HOR_UPSTREAM_ID% 值)仍然过时...刷新新变量的唯一方法是重新启动该死的 jenkins(主)服务,但这在CI环境...
现在问题浮出水面 - 如何在 B 上的构建作业 B 被触发时刷新/重新读取这些变量,以便我可以访问系统变量从不使用例如 EnvInject 插件的从属设备?
另一个需要用户交互的 SO 问题和答案,因此在我的情况下不可接受:Jenkins - passing variables between jobs?
这在我的情况下也不起作用:http://comments.gmane.org/gmane.comp.java.hudson.user/37897
也许Slave及其对应的节点没有接收变量/正确解析其环境,导致无法从全局环境变量中检索信息?查了一下,突然一些有趣的环境变量配置数据让我眼前一亮:
NODE_LABELS |一个产品发布
NODE_NAME |一个
...这是给从属 B 的,但它应该是不同的值,因为这最初是给从属 A ... 什么鬼?????? ????????????!!!!!! :/
我开始觉得根本问题是Jenkins在解析多个从节点信息时有错误。
决定创建一个Issue@Jenkins jira:https://issues.jenkins-ci.org/browse/JENKINS-15397
【问题讨论】:
-
嘿伙计,我无法理解你写的所有内容。但基本上我确实能够通过 ant 脚本传递 Jenkins 系统变量。
-
对于这种基本需求来说,过于臃肿和 java 解析能力太强了。 ://
-
我会避免通过 Jenkins 脚本/作业在从属之间传递数据 - 这可能会在添加从属或使从属脱机时中断。链接作业(如@zagrev 所建议)是一种更好的方法,然后您可以在工件中传递数据或使用插件。
标签: continuous-integration jenkins environment-variables slave