在 EC2-Fleet 上设置 Jenkins 环境变量的问题
Posted
技术标签:
【中文标题】在 EC2-Fleet 上设置 Jenkins 环境变量的问题【英文标题】:Issue setting Jenkins environment variables on EC2-Fleet 【发布时间】:2020-01-20 05:15:13 【问题描述】:我们在动态 EC2-Fleet 上设置 Jenkins 环境变量时遇到问题。
我们已经有一个固定的主机(linux)和一个固定的 Windows 从机,但希望在系统负载变重时动态添加从机。 为此,我们在 AWS 中创建了一个 Spot 请求实例,通过 AMI 启动 linux 机器,并通过 Jenkins 中的 EC2-fleet-plugin 对其进行控制。
在这个 EC2 队列有任何帮助之前,我们的作业必须能够在其节点上运行。 我们的大部分工作都使用 Jenkinsfiles 并且需要设置某些环境变量,但 EC2-fleet-plugin 不提供设置环境变量的可能性 (https://issues.jenkins-ci.org/browse/JENKINS-36544)。
按照此票证 (JENKINS-36544) 的建议,我们尝试在“系统配置”中为动态 ec2 从站设置环境变量,并在“节点配置”中为其他节点设置环境变量,覆盖“系统”配置”,或者我们认为。 如果此错误不存在,这应该可以工作:https://issues.jenkins-ci.org/browse/JENKINS-44425。由于此错误,“系统配置”会覆盖“节点配置”,反之亦然。所以我们不能使用它,因为现有节点将不再具有正确的环境变量。
作为最后的手段,我们尝试通过在 Spot 请求实例使用的 AMI 上创建 /etc/profile.d/jenkinsvars.sh
来设置动态 ec2 从站的环境变量。
该脚本将在登录系统范围内自动运行 (https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh)。
接下来,我们还尝试将它们设置在 AMI 上的 /home/ubuntu/.profile
中,以找出运行 Jenkins 代理的用户 (https://help.ubuntu.com/community/EnvironmentVariables#A.2BAH4-.2F.profile) 的 ubuntu 用户。
但似乎 Jenkins 不使用这些环境变量,而是使用它自己的......
一种可行的方法是调整作业以加载作为 AMI 一部分的 groovy 文件,以设置我们需要的环境变量,但这意味着更改我们拥有的几乎所有作业,除了我们包含在我们的所有 Jenkinsfiles 之外存储库(Bitbucket 项目)。 我们想避免这种情况......
【问题讨论】:
您能否指定需要设置的环境变量之一,该变量会在 linux spot 实例上被覆盖? 那些真的很具体,所以我认为这些信息不会有帮助,但我们使用“gsExec”和“compareExec”分别定义 GhostScript 和 ImageMagick 的路径... 【参考方案1】:尝试以下策略:
-
在 Spot 实例启动时利用用户数据运行 shell 脚本。它是主要的recommended way by Amazon 和plugin authors。
不要将变量保存到环境中,而是让用户数据脚本将它们保存到 /var/tmp 或 /etc/profile 或参数存储中。请参阅此SO question 中的答案。如果您想加密您的信息,请使用 KMS 参数存储,如果您不在乎,请使用其他一种。选择最适合您需求的答案之一。
将您的 Jenkins 作业更改为暂停,直到您的用户数据脚本完成运行(请参阅 documentation from the plugin)
更改您的 Jenkins 作业以从您在第 2 步中选择的位置获取变量。
【讨论】:
您好,感谢您的建议,但就像我在原始问题中提到的那样,我们希望避免更改我们的 Jenkins 工作......【参考方案2】:尝试重新启动服务器环境。 只是说说而已。
【讨论】:
【参考方案3】:所以我们不能使用它,因为现有节点将不再具有正确的环境变量。
更新现有节点以在配置/启动时加载环境变量,然后将它们从系统配置中删除,然后将它们添加到节点配置中。
您也可以尝试将Slave command prefix
字段设置为ENV_VAR1=val1 ENV_VAR2=val2
,尽管我没有尝试过。
第三,您可以尝试将变量直接放入/etc/profile
,无论您以何种用户身份登录,都应始终加载该变量。
但是,到目前为止,最简单的方法是使您的所有无人机/代理完全相同,并在您为构建项目而运行的任何脚本中设置环境变量。使用 docker 在作业期间根据需要将依赖项拉入代理,并为您的应用程序设置特定环境。这大大简化了代理的维护和配置。
【讨论】:
Brandon,谢谢您的建议,但据我所知,这些都行不通...为现有从属设备添加节点 Jenkins 环境变量正是我们所做的(请参阅原始问题)。由于我们还需要 EC2 实例具有 Jenkins 环境变量,因此我们必须使用系统配置来设置它们。由于现有的错误,这些会覆盖节点环境变量。 2 & 3. 如前所述,Jenkins 环境变量与环境变量不同。环境变量已经设置好了,这不是问题。 4. 我们有 Linux 和 Windows 节点remove them from the System configuration
我的意思是在节点配置中定义特定于任何特定从属的所有环境变量,并且只有适用于全局配置中所有从属的环境变量Like indicated, the Jenkins environment variables are not the same as the environment variables.
如果没有设置环境变量,你没有正确地做。 Jenkins 确实可以访问节点本身上设置的环境变量。看到这个答案:***.com/a/9029251/535827
在非常旧的 Jenkins 版本中还有一个错误,它会阻止 env var 更新被识别而不会在 Jenkins 中销毁和重新创建从站。确保您不在旧版本的 Jenkins 上。我知道这是可能的,您只需将它们设置在正确的位置(正确的用户、正确的 shell、非交互式登录 shell 的正确文件)。你也可以看看这个可能有帮助的插件:wiki.jenkins.io/display/JENKINS/EnvInject+Plugin
嗨,Brandon,我已经尝试了您的建议,发现实际上我们创建 AMI 的机器按预期工作。詹金斯有环境变量。对于AMI创建的Spot实例,虽然有环境变量,但Jenkins没有环境变量。【参考方案4】:
问题中缺少 Jenkins 版本或 EC2 插件版本,但根据此合并拉取请求中的描述,此错误现在应该修复:https://github.com/jenkinsci/ec2-plugin/pull/440#issuecomment-597160730
Jenkins 版本:
所以此更改适用于 =2.205
EC2 插件版本:>=ec2-1.50
JENKINS-36544 - 修复 Jenkins 2.205+ 上的节点属性 (#440) @jhansche
来自拉取请求描述:
导航到云配置屏幕(这将移动到新页面 >=2.205) 点击“添加新云” 点击“Amazon EC2” 在“AMI”部分下,点击“添加” 在 AMI 块底部,展开“高级” 希望在块底部看到“节点属性”块
节点属性具有环境变量。
【讨论】:
这不适用于他们询问的 EC2-Fleet 插件。以上是关于在 EC2-Fleet 上设置 Jenkins 环境变量的问题的主要内容,如果未能解决你的问题,请参考以下文章
在 centos 上设置 jenkins:ssh 密钥和 git 的问题