【问题标题】:Passing System Env variable into Jenkins Slave将系统环境变量传递给 Jenkins Slave
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 我需要的是读取一个系统环境变量(在机器环境中) INTO BATCH of Job B
  • 因此,java 不允许您将系统变量写回操作系统。 Jenkins 在 java 上运行,因此您可能无法编写操作系统环境变量。听起来您需要在工作之间选择不同的通信方式。如果 Job A 实际上写出了一个 OS 环境变量,那么它将被 Job B 中的 JVM 拾取。您是否想过使用文件来包含信息,或者可能是来自队列的消息?共享内存?你有能力改变 Job A 传递数据的方式吗?
  • 文件 - 不,我将它用于一些 VM 管理,所以我不能使用静态文件位置/存储。消息队列...请详细说明。 :) 杰斯,我可以完全控制詹金斯。
  • 这些详细信息取决于您使用的消息传递系统。看了原帖,不应该是调用setenv.exe THEN启动slave吗?
  • 另外,你可以试试环境注入插件吗?
【解决方案2】:

看起来像这样 (https://issues.jenkins-ci.org/browse/JENKINS-6604) 修复做了以下更改:

  • 修复了在 Windows 2k8 (R2) x64 (Datacenter) 机器中无法安装多个从属设备的问题;
  • 修复了无法正确解析值的问题。设置没有改变......但似乎重新输入所有登录名就可以了。
  • 可能破坏了工具环境设置,因为 NODE_LABELS 和 NODE_NAME 不再加载到系统信息配置中 xD ...但只要此设置实际有效(并且在下一次 jenkins 更新中没有损坏...),谁在乎: D

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

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2016-12-08
    • 2013-12-29
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多