詹金斯/哈德森环境变量
Posted
技术标签:
【中文标题】詹金斯/哈德森环境变量【英文标题】:Jenkins / Hudson environment variables 【发布时间】:2011-08-14 16:11:03 【问题描述】:我正在从用户 jenkins
运行 Jenkins,这已将 $PATH
设置为某个值,当我进入 Jenkins Web 界面时,在 System Properties 窗口 (http://$host/systemInfo
) 我看到了不同的$PATH
.
我已经在 Centos 上使用 Jenkins 网站上的本机 rpm 安装了 Jenkins。我正在使用安装时提供的启动脚本sudo /etc/init.d/jenkins start
谁能解释一下为什么会这样?
【问题讨论】:
如果您以 jenkins 和echo $PATH
身份登录,它是否与您在 jenkins 中看到的相符?
@Dave 不,它不匹配。不明白为什么
它不匹配的原因是因为当您以 jenkins 用户身份登录时,您正在调用登录 shell,而 jenkins 只是执行 /bin/sh -xe your script 所以它没有t 运行更改 PATH 环境变量的同一组脚本。事实上,脚本集确实会根据您安装的 *nix 和/或 shell 的特定风格而有所不同。我已经用 jenkins 在 AWS Linux AMI 上进行了测试,遗憾的是 /etc/profile /etc/profile.d/xxx.sh /etc/bashrc /etc/environment ~/.bash_profile ~/.profile ~/.bashrc 都没有影响传递给 /bin/sh 的 PATH
【参考方案1】:
这是我使用 Jenkins 2.176.2 在 ubuntu 18.04 LTS 上所做的
我创建了 .bash_aliases 文件并在其中添加了路径、代理变量等。
在 .bashrc 的开头有这个定义。
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
所以它检查如果我们启动非交互式shell,那么我们在这里什么都不做。
.bashrc 的底部有 .bash_aliases 的包含
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
所以我将 .bash_aliases 首先加载到 .bashrc 的非交互式检查上方。
这首先不起作用,但后来我断开了从属设备并重新连接它,所以它再次加载变量。如果要修改从变量,则无需重新启动整个 jenkins。只需断开并重新连接即可。
【讨论】:
【参考方案2】:Jenkins 还支持将PATH+<name>
格式添加到任何变量,而不仅仅是PATH:
全局环境变量或节点环境变量:
流水线步骤withEnv
也支持这一点:
node
withEnv(['PATH+JAVA=/path/to/java/bin'])
...
请注意,它位于变量的前面。如果必须附加它,您需要执行其他答案显示的操作。
请参阅流水线步骤文档here。
您也可以使用语法 PATH+WHATEVER=/something 将 /something 添加到 $PATH
或者 EnvVars here 上的 java 文档。
【讨论】:
【参考方案3】:1- 添加到您的配置文件“.bash_profile”文件中
它在“/home/your_user/”文件夹中
vi .bash_profile
添加:
export JENKINS_HOME=/apps/data/jenkins
export PATH=$PATH:$JENKINS_HOME
==> 这是 e jenkins 工作区
2- 如果您使用码头: 转到 jenkins.xml 文件
并添加:
<Arg>/apps/data/jenkins</Arg>
【讨论】:
【参考方案4】:我尝试了上面的所有方法 - 对我不起作用。
我找到了两个解决方案(都用于 SSH-Slave)
进入从站设置
添加新的环境变量
路径 $PATH:$HOME/.pub-cache/bin:$HOME/.local/bin“$HOME”部分很重要。这使得附加的 PATH 是绝对的。 相对路径对我不起作用。
选项二(管道脚本)
pipeline
agent
label 'your-slave'
environment
PATH = "/home/jenkins/.pub-cache/bin:$PATH"
stages
stage('Test')
steps
ansiColor('xterm')
echo "PATH is: $PATH"
【讨论】:
【参考方案5】:迈克尔,
两件事:
当 Jenkins 连接到计算机时,它会转到 sh
shell,而不是 bash
shell(至少这是我注意到的 - 我可能错了)。因此,您在 bashrc 文件中对 $PATH 所做的任何更改都不会被考虑在内。
此外,您在本地 shell(您个人 ssh 进入的 shell)中对 $PATH 所做的任何更改都不会显示在 Jenkins 中。
要更改 Jenkins 使用的路径,您有两个选择 (AFAIK):
1) 编辑您的 /etc/profile
文件并在其中添加您想要的路径
2) 进入slave的配置页面,添加环境变量PATH
,值为:$PATH:/followed-by/paths/you/want/to/add
如果您使用第二个选项,您的系统信息仍然不会显示它,但您的构建将看到添加的路径。
【讨论】:
这个答案对我有用,但我注意到 Jenkins 对您在配置页面中写入的内容非常敏感。我无法让它与带空格的路径一起使用。 是的,但是当您在 UNIX shell 中输入带有空格的路径时,通常会使用 `` 字符对空格进行转义。因此,如果您的路径是“/opt/bin/My Folder Name”,您可能想尝试“/opt/bin/My\Folder\Name”。这将转义空格并允许您使用它们。 解决方案2是要走的路。 后续:在我的 Ubuntu 系统上,jenkins 服务是一个新贵的工作,所以我正在修改旧的 sysvinit 存根脚本。错误的地方。当我调整 /etc/init/jenkins.conf 脚本并在它执行 java 之前更新 PATH 时,这似乎确实有效。 有一个小黑角:jenkins master 缓存了 slave 的环境变量,以便修补自定义。因此,如果您更改从属(系统或用户)上的环境变量,则需要重新启动主以更新从属配置。【参考方案6】:这就是我解决这个烦人问题的方法:
我按照@sagar 在他的第二个选项中建议的那样更改了PATH
变量,但我得到的PATH
值仍然与我预期的不同。
最终我发现是 EnvInject
插件替换了我的 PATH
变量!
所以我可以卸载 EnvInject
或者只使用它来注入 PATH 变量。
由于我们的许多 Jenkins 工作都使用该插件,我不想卸载它...
所以我在我的 Jenkins 主目录下创建了一个文件:environment_variables.properties
。
此文件包含我需要的路径环境值:
PATH=$PATH:/usr/local/git/bin/
.
来自 Jenkins 网络界面:Manage Jenkins -> Configure System
。
在那个屏幕上 - 我勾选了Prepare jobs environment
选项,并在Properties File Path
字段中输入了我的文件路径:/var/lib/jenkins/environment_variables.properties
。
这样,我们收到的每个 Jenkins 作业都会收到我放入此 environment_variables.properties
文件中的任何变量。
【讨论】:
这应该是正确的答案。如前所述,更新 /etc/profile 在 OSX 上不是一个可行的解决方案,因为该文件是只读的并且需要弄乱权限。这个解决方案似乎是最干净的,并且利用了 Jenkins 上已经存在的插件。创建属性文件并将其设置在 Jenkins 上后,请记住重新启动 jenkins【参考方案7】:添加
/usr/bin/bash
在
Jenkins -> 管理 Jenkins -> 配置系统 -> Shell->Shell 可执行文件
Jenkins 使用了 sh,所以即使 /etc/profile 对我也不起作用 当我添加这个时,我拥有了所有的环境。
【讨论】:
哪个版本的 Jenkins 为您工作@sumang_87?在 Jenkins 2.9 上它没有帮助我【参考方案8】:我通过 zypper(包管理器)在 SLES 11 SP3 上安装了 Jenkins 1.639。 安装配置jenkins即服务
# service jenkins
Usage: /etc/init.d/jenkins start|stop|status|try-restart|restart|force-reload|reload|probe
虽然 /etc/init.d/jenkins
来源 /etc/sysconfig/jenkins
,但 jenkins 进程不会继承其中设置的任何 env 变量,因为它是在具有如下新环境的单独登录 shell 中启动的:
startproc -n 0 -s -e -l /var/log/jenkins.rc -p /var/run/jenkins.pid -t 1 /bin/su -l -s /bin/bash -c '/usr/java/default/bin/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --javaHome=/usr/java/default --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --httpPort=8080 --ajp13Port=8009 --debug=9 --handlerCountMax=100 --handlerCountMaxIdle=20 &' jenkins
我设法为 jenkins 进程设置环境变量的方法是通过其主目录中的.bashrc
- /var/lib/jenkins
。我必须创建/var/lib/jenkins/.bashrc
,因为它以前不存在。
【讨论】:
【参考方案9】:你不能把它作为环境变量添加到 Jenkins 设置中吗:
管理 Jenkins -> 全局属性 > 环境变量: 然后单击“添加”以将属性 PATH 及其值添加到您需要的内容中。
【讨论】:
似乎是 1.620 版中的“管理 Jenkins -> 配置系统 -> 环境变量”。【参考方案10】:对我有用的解决方案
source ~/.bashrc
说明
我首先验证 Jenkins 正在运行 BASH,使用 echo $SHELL
和 echo $BASH
(注意我明确地将 #!/bin/bash
放在 Jenkins 的文本区域顶部,我不确定这是否是获得 BASH 的要求)。 source
ing /etc/profile
正如其他人所建议的那样不起作用。
看着/etc/profile
我找到了
if [ "$PS1" ]; then
...
并检查“$PS1”发现它为空。我尝试欺骗$PS1
无济于事
export PS1=1
bash -c 'echo $PATH'
但是这并没有产生预期的结果(添加我希望看到的 $PATH
的其余部分)。但是如果我告诉 bash 是交互式的
export PS1=1
bash -ci 'echo $PATH'
$PATH
已按照我的预期进行了更改。
我试图弄清楚如何正确地欺骗交互式 shell 以加载 /etc/bash.bashrc
,但事实证明我需要的只是在 ~/.bashrc
中,所以只需 source
ing 它就解决了问题。
【讨论】:
确保使用#!/bin/bash -el
告诉 bash 作为登录 shell 启动。这应该会导致 bash 获取必要的 .rc 文件【参考方案11】:
对我有用的是覆盖从属设备的 PATH 环境。
Set: PATH
To: $PATH:/usr/local/bin
然后断开并重新连接从站。
尽管系统信息显示它有效。
【讨论】:
【参考方案12】:设置环境变量运行命令也是有效的。当然,您必须为您运行的每个命令执行此操作,但您可能有一个作业脚本,因此您可能每次构建只有一个命令。我的作业脚本是一个python脚本,它使用环境来决定使用哪个python,所以我仍然需要将/usr/local/bin/python2.7放在它的路径中:
PATH=/usr/local/bin <my-command>
【讨论】:
【参考方案13】:在 Ubuntu 上,我只需编辑 /etc/default/jenkins 并在最后添加源 /etc/profile 即可。
【讨论】:
【参考方案14】:在我的 Ubuntu 13.04 上,我尝试了很多调整,然后才成功:
-
编辑 /etc/init/jenkins.conf
找到“exec start-stop-server...”开始的位置
在此之前插入环境更新,即
导出 PATH=$PATH:/some/new/path/bin
【讨论】:
【参考方案15】:在“/etc/init.d/jenkins force-reload”之后,我才在这个问题上取得了进展。我建议先尝试它,然后使用它而不是重新启动。
【讨论】:
您实际上在哪里添加了 PATH 元素?我已经尝试了所有我能想象到的地方。【参考方案16】:有关此答案的信息已过时。你需要去配置 Jenkins > 然后你可以从那里点击添加一个环境变量键值对。
例如:export MYVAR=test
将是 MYVAR
是键,test
是值。
【讨论】:
【参考方案17】:在我较新的 EC2 实例上,只需将新值添加到 Jenkins 用户的 .profile 的 PATH 中,然后重新启动 tomcat 即可。
在配置不同的旧实例上,使用来自 Sagar's answer 的 #2 是唯一有效的方法(即 .profile、.bash* 无效)。
【讨论】:
【参考方案18】:我尝试了/etc/profile
、~/.profile
和~/.bash_profile
,但都没有奏效。我发现为 jenkins 从属帐户编辑 ~/.bashrc
可以。
【讨论】:
这是因为非登录 shell 既不读取/etc/profile
也不读取 ~/.profile
【参考方案19】:
您还可以编辑/etc/sysconfig/jenkins
文件以对环境变量等进行任何更改。我只是在文件末尾添加了source /etc/profile
。 /etc/profile
具有所有正确的 PATH
变量设置。执行此操作时,请确保重新启动 Jenkins
/etc/init.d/jenkins restart
我们正在运行 ZendServer CE,它将 pear、phing 等安装在不同的路径中,所以这很有帮助。此外,我们不会收到以前在 Oracle 客户端和 Jenkins 中遇到的 LD_LIBRARY_PATH
错误。
【讨论】:
这是一个关键注释,或者从 jenkins-url/restart 或 jenkins-url/safeRestart 重新启动 jenkins。通过在 ubuntu 主机上编辑甚至 /etc/environment,我一直在思考为什么没有拾取路径更改 - RESTART 将修复它,如 jenkins-url/systemInfo 所验证 其他都失败了,这是唯一有效的!我希望它更普遍,这样我就不会浪费最后几个小时了!【参考方案20】:我一直遇到这个问题,但现在我只是添加:
source /etc/profile
作为我构建过程的第一步。现在我的所有后续规则都已加载,以便 Jenkins 顺利运行。
【讨论】:
嗯?详细一点,请...你在哪里添加?如何?什么时候?它可以在 Windows 上运行吗? 我假设您正在运行一个 shell 命令作为构建的一部分。将source /etc/profile
作为该 Build > Execute Shell > Command textarea 中的第一个命令。
它可以在Mac上运行,我也发现/usr/local/bin
这样的路径在/etc/paths
中指定,/etc/paths
被/usr/libexec/path_helper
使用,path_helper在/etc/profile
中执行。跨度>
你拯救了我的一天 :)
Sourcing /etc/profile 在作业中添加“echo $PATH”调试时确实显示了路径,但如果我查看作业的环境变量,它就不一样了。跨度>
【参考方案21】:
我为此找到了两个插件。 一个从文件加载值,另一个让您在作业配置屏幕中配置值。
Envfile Plugin — 该插件使您能够通过文件设置环境变量。文件的格式必须是标准的 Java 属性文件格式。
EnvInject Plugin — 该插件可以添加环境变量并执行设置脚本,以便为作业设置环境。
【讨论】:
以上是关于詹金斯/哈德森环境变量的主要内容,如果未能解决你的问题,请参考以下文章