我从用户运行詹金斯jenkins
多数民众赞成在已经$PATH
设置的东西,当我进入詹金斯Web界面,在系统属性窗口(http://$host/systemInfo
)我看到一个不同的$PATH
。
我已经用来自Jenkins网站的本地rpm在Centos上安装了Jenkins。我正在使用安装随附的启动脚本sudo /etc/init.d/jenkins start
谁能告诉我为什么会这样?
我从用户运行詹金斯jenkins
多数民众赞成在已经$PATH
设置的东西,当我进入詹金斯Web界面,在系统属性窗口(http://$host/systemInfo
)我看到一个不同的$PATH
。
我已经用来自Jenkins网站的本地rpm在Centos上安装了Jenkins。我正在使用安装随附的启动脚本sudo /etc/init.d/jenkins start
谁能告诉我为什么会这样?
Answers:
迈克尔
两件事情:
当詹金斯连接到计算机时,它将连接到sh
外壳,而不是bash
外壳(至少这是我已经注意到的-我可能错了)。因此,不会考虑您对bashrc文件中的$ PATH所做的任何更改。
另外,您在本地shell中对$ PATH所做的任何更改(您个人ssh所进行的更改)都不会在Jenkins中显示。
要更改Jenkins使用的路径,您有两个选择(AFAIK):
1)编辑/etc/profile
文件并在其中添加所需的路径
2)进入从站的配置页面,并添加环境变量PATH
,其值为:$PATH:/followed-by/paths/you/want/to/add
如果使用第二个选项,则系统信息仍不会显示,但是您的构建将看到添加的路径。
我一直遇到这个问题,但是现在我添加:
source /etc/profile
作为构建过程的第一步。现在,我所有的后续规则都已加载,以使詹金斯能够顺利运行。
source /etc/profile
第一个命令放在Build> Execute Shell> Command textarea中。
/usr/local/bin
在中指定了路径/etc/paths
,并/etc/paths
在中使用/usr/libexec/path_helper
,在中执行了path_helper /etc/profile
。
您还可以编辑/etc/sysconfig/jenkins
文件以对环境变量等进行任何更改。我只是添加source /etc/profile
到文件末尾。/etc/profile
具有所有正确的PATH
变量设置。执行此操作时,请确保重新启动Jenkins
/etc/init.d/jenkins restart
我们正在运行ZendServer CE,它以不同的路径安装了pear,phing等,因此很有帮助。而且,我们不会遇到LD_LIBRARY_PATH
以前使用Oracle客户端和Jenkins时遇到的错误。
我为此找到了两个插件。一个从文件中加载值,另一个使您可以在作业配置屏幕中配置值。
Envfile插件 —此插件使您可以通过文件设置环境变量。文件的格式必须是标准Java属性文件格式。
EnvInject插件 —此插件可以添加环境变量并执行设置脚本,以便为Job设置环境。
您是否只能在Jenkins设置中将其添加为环境变量:
管理Jenkins->全局属性>环境变量:然后单击“添加”以将属性PATH及其值添加到所需的内容。
这就是我解决这个烦人的问题的方法:
我PATH
按照@sagar在他的第二个选项中建议的方式更改了变量,但仍然得到了与PATH
预期不同的值。
最终,我发现这是EnvInject
替换我的PATH
变量的插件!
因此,我可以卸载EnvInject
或仅使用它来注入PATH变量。
由于我们许多Jenkins作业都使用该插件,因此我不想将其卸载...
因此,我在environment_variables.properties
Jenkins主目录下创建了一个文件:
该文件包含我需要的路径环境值:
PATH=$PATH:/usr/local/git/bin/
。
在Jenkins网络界面中:Manage Jenkins -> Configure System
。在该屏幕中-我勾选了该Prepare jobs environment
选项,然后在Properties File Path
字段中输入了文件的路径:/var/lib/jenkins/environment_variables.properties
。
这样,我们在每一个詹金斯工作中都会收到我放入此environment_variables.properties
文件中的任何变量。
在“ /etc/init.d/jenkins强制重新加载”之后,我仅在此问题上取得了进展。我建议先尝试,然后再使用而不是重新启动。
source ~/.bashrc
我首先用echo $SHELL
和验证了Jenkins正在运行BASH,echo $BASH
(请注意,我明确地将#!/bin/bash
Jenkins放在textarea的顶部,我不确定是否要获得BASH才是必需的)。source
荷兰国际集团/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
如我所料被改变。
我试图弄清楚如何正确地欺骗交互式外壳程序以/etc/bash.bashrc
进行加载,但是事实证明,我所需的全部内容都放在了~/.bashrc
,所以只需将source
其解决即可。
#!/bin/bash -el
告诉Bash作为登录shell启动。这应该导致bash产生必要的.rc文件
我从上面尝试了所有事情-对我没用。
我找到了两种解决方案(两者都适用于SSH-Slave)
进入从属设置
添加一个新的环境变量
“ $ {HOME}”部分很重要。这使得附加PATH是绝对的。相对路径对我不起作用。
选项II(管道脚本)
pipeline {
agent {
label 'your-slave'
}
environment {
PATH = "/home/jenkins/.pub-cache/bin:$PATH"
}
stages {
stage('Test') {
steps {
ansiColor('xterm') {
echo "PATH is: $PATH"
}
}
}
}
}
在设置了环境变量的情况下运行命令也是有效的。当然,您必须为运行的每个命令执行此操作,但是您可能有一个作业脚本,因此每个构建中可能只有一个命令。我的工作脚本是一个python脚本,它使用环境来决定要使用哪个python,因此我仍然需要将/usr/local/bin/python2.7放在其路径中:
PATH=/usr/local/bin <my-command>
我通过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
source /etc/sysconfig/jenkins
,但其中设置的所有env变量都不会被jenkins进程继承,因为它是在具有新环境的单独登录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进程设置env var的方法是通过.bashrc
其主目录- /var/lib/jenkins
。我不得不创建/var/lib/jenkins/.bashrc
它以前不存在的东西。
这是我在詹金斯2.176.2上对Ubuntu 18.04 LTS所做的工作
我创建了.bash_aliases文件,并在其中添加了路径,代理变量等。
在.bashrc的开头定义了这个。
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
因此,它正在检查是否要启动非交互式外壳,那么我们在这里什么也不做。
.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。
首先这没有用,但是后来我断开了从属服务器并重新连接它,因此它再次加载了变量。如果您要修改从属变量,则无需重新启动整个詹金斯。只需断开并重新连接即可。
echo $PATH
,它是否与您在jenkins中看到的内容匹配?