Jenkins / Hudson环境变量


101

我从用户运行詹金斯jenkins多数民众赞成在已经$PATH设置的东西,当我进入詹金斯Web界面,在系统属性窗口(http://$host/systemInfo)我看到一个不同的$PATH

我已经用来自Jenkins网站的本地rpm在Centos上安装了Jenkins。我正在使用安装随附的启动脚本sudo /etc/init.d/jenkins start

谁能告诉我为什么会这样?


1
如果您以jenkins和身份登录echo $PATH,它是否与您在jenkins中看到的内容匹配?
Upgradingdave

3
@戴夫不,它不匹配。无法理解为什么
Michael

8
之所以不匹配,是因为当您以jenkins用户身份登录时,您正在调用登录shell,而jenkins只是执行/ bin / sh -xe {您的脚本},因此它不会在同一组脚本中运行会更改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
路加福音

Answers:


141

迈克尔

两件事情:

当詹金斯连接到计算机时,它将连接到sh外壳,而不是bash外壳(至少这是我已经注意到的-我可能错了)。因此,不会考虑您对bashrc文件中的$ PATH所做的任何更改。

另外,您在本地shell中对$ PATH所做的任何更改(您个人ssh所进行的更改)都不会在Jenkins中显示。

要更改Jenkins使用的路径,您有两个选择(AFAIK):

1)编辑/etc/profile文件并在其中添加所需的路径

2)进入从站的配置页面,并添加环境变量PATH,其值为:$PATH:/followed-by/paths/you/want/to/add

如果使用第二个选项,则系统信息仍不会显示,但是您的构建将看到添加的路径。


2
这个答案对我有用,但是我注意到Jenkins对您写入配置页面的内容非常敏感。我无法使用带有空格的路径。
miguelSantirso,2012年

是的,但是在UNIX shell中使用空格输入路径时,通常使用``字符转义空格。因此,如果您的路径是“ / opt / bin /我的文件夹名称”,则可能需要尝试使用“ / opt / bin /我的\文件夹\名称”。这将转义空间并允许您使用它们。
萨加尔(Sagar)2012年

11
解决方案2是解决之道。
gagarine

2
后续:在我的Ubuntu系统上,jenkins服务是一项新贵工作,因此我正在修改旧的sysvinit存根脚本。错误的地方。当我调整/etc/init/jenkins.conf脚本,并在exec的java之前更新PATH时,这似乎确实起作用。
稳定狗2014年

15
有一个小的黑角:jenkins主服务器缓存从服务器的环境变量,以修补自定义项。因此,如果更改从属服务器(系统或用户)上的环境变量,则需要重新启动主服务器以更新从属服务器配置。
Thinkeye

36

我一直遇到这个问题,但是现在我添加:

source /etc/profile

作为构建过程的第一步。现在,我所有的后续规则都已加载,以使詹金斯能够顺利运行。


6
??详细信息,请...您在哪里添加?怎么样?什么时候?在Windows上可以使用吗?
HX_unbanned

我假设您在构建过程中正在运行shell命令。将source /etc/profile第一个命令放在Build> Execute Shell> Command textarea中。
布莱恩·肯尼迪

2
它可以在Mac上运行,我也发现/usr/local/bin在中指定了路径/etc/paths,并/etc/paths在中使用/usr/libexec/path_helper,在中执行了path_helper /etc/profile
hiroshi 2012年

1
你救了我的一天:)
RameshVel '16

当在作业中添加'echo $ PATH'调试时,/ etc / profile的确显示了路径,但是如果我查看作业的环境变量,则不一样。
伊利亚·林恩

23

您还可以编辑/etc/sysconfig/jenkins文件以对环境变量等进行任何更改。我只是添加source /etc/profile到文件末尾。/etc/profile具有所有正确的PATH变量设置。执行此操作时,请确保重新启动Jenkins

/etc/init.d/jenkins restart

我们正在运行ZendServer CE,它以不同的路径安装了pear,phing等,因此很有帮助。而且,我们不会遇到LD_LIBRARY_PATH以前使用Oracle客户端和Jenkins时遇到的错误。


这是关键评论,或者从{jenkins-url} / restart或{jenkins-url} / safeRestart重新启动jenkins。我通过甚至在ubuntu主机上编辑/ etc / environment来弄清楚为什么未获取路径更改的原因,正如{jenkins-url} / systemInfo所验证的那样,RESTART将修复它
KERT

所有其他人都失败了,这是唯一起作用的!我希望它更普遍,这样我就不会浪费最近几个小时!
Brad Bonkoski 2015年

15

我试过/etc/profile~/.profile以及~/.bash_profile和这些都不奏效。我发现~/.bashrc对jenkins奴隶帐户进行编辑就可以了。


3
那是因为非登录Shell既不读取/etc/profile也不读取~/.profile
Vincenzo

9

该答案的信息已过期。您需要转到Configure Jenkins>,然后单击以从此处添加环境变量键值对。

例如:export MYVAR=testMYVAR是关键,test是价值。


5

在我较新的EC2实例上,只需将新值添加到Jenkins用户的.profile的PATH中,然后重新启动tomcat就可以了。

在配置不同的较旧实例中,使用Sagar的答案中的#2 是唯一有效的方法(即.profile,.bash *不起作用)。


4

我为此找到了两个插件。一个从文件中加载值,另一个使您可以在作业配置屏幕中配置值。

Envfile插件 —此插件使您可以通过文件设置环境变量。文件的格式必须是标准Java属性文件格式。

EnvInject插件 —此插件可以添加环境变量并执行设置脚本,以便为Job设置环境。


4

您是否只能在Jenkins设置中将其添加为环境变量:

管理Jenkins->全局属性>环境变量:然后单击“添加”以将属性PATH及其值添加到所需的内容。


1
在版本1.620中似乎是“ Manage Jenkins->配置系统->环境变量”。
akaihola '16

4

这就是我解决这个烦人的问题的方法:

PATH按照@sagar在他的第二个选项中建议的方式更改了变量,但仍然得到了与PATH预期不同的值。

最终,我发现这是EnvInject替换我的PATH变量的插件!

因此,我可以卸载EnvInject或仅使用它来注入PATH变量。

由于我们许多Jenkins作业都使用该插件,因此我不想将其卸载...

因此,我在environment_variables.propertiesJenkins主目录下创建了一个文件:

该文件包含我需要的路径环境值: 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文件中的任何变量。


1
这应该是正确的答案。如前所述,在OSX上更新/ etc / profile不是可行的解决方案,因为该文件是只读文件,并且需要弄乱权限。该解决方案似乎是最干净的,并利用了Jenkins上已经存在的插件。记住,一旦创建属性文件并将其设置在Jenkins上,就重新启动jenkins
Voke Ransom Anighoro

3

Jenkins还支持该格式 PATH+<name>附加在任何变量之前,不仅限于PATH:

全局环境变量或节点环境变量:

詹金斯变量+表示法

管道步骤也支持此操作withEnv

node {
  withEnv(['PATH+JAVA=/path/to/java/bin']) {
    ...
  }
}

请注意,它位于变量之前。如果必须附加它,则需要执行其他答案显示的内容。

请参阅此处的管道步骤文档。

您也可以使用语法PATH + WHATEVER = / something到$ PATH之前/ something

或envvars中的Java文档在这里


2

在“ /etc/init.d/jenkins强制重新加载”之后,我仅在此问题上取得了进展。我建议先尝试,然后再使用而不是重新启动。


1
您实际在哪里添加了PATH元素?我已经尽我所能尝试了每个地方。
稳定狗2014年

2

在我的Ubuntu 13.04上,在尝试成功之前,我尝试了很多调整:

  1. 编辑/etc/init/jenkins.conf
  2. 找到“ exec start-stop-server ...”开始的位置
  3. 在此之前插入环境更新,即

导出PATH = $ PATH:/ some / new / path / bin


2

/usr/bin/bash

Jenkins->管理Jenkins->配置系统-> Shell-> Shell可执行文件

Jenkins使用sh使得即使/ etc / profile对我也不起作用当我添加它时,我拥有所有的环境。


@ sumang_87为您完成了哪个版本的Jenkins?它在詹金斯2.9上没有帮助我
hamx0r

1

对我有用的解决方案

source ~/.bashrc

说明

我首先用echo $SHELL和验证了Jenkins正在运行BASH,echo $BASH(请注意,我明确地将#!/bin/bashJenkins放在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文件
Brandon

1

我从上面尝试了所有事情-对我没用。

我找到了两种解决方案(两者都适用于SSH-Slave)

  1. 进入从属设置

  2. 添加一个新的环境变量

  3. 路径
  4. $ {PATH}:$ {HOME} /。pub-cache / bin:$ {HOME} /。local / bin

“ $ {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"
                }
            }
        }
    }
}


0

在设置了环境变量的情况下运行命令也是有效的。当然,您必须为运行的每个命令执行此操作,但是您可能有一个作业脚本,因此每个构建中可能只有一个命令。我的工作脚本是一个python脚本,它使用环境来决定要使用哪个python,因此我仍然需要将/usr/local/bin/python2.7放在其路径中:

PATH=/usr/local/bin <my-command>

0

对我有用的是重写从属服务器的PATH环境。

Set:   PATH 
To:    $PATH:/usr/local/bin

然后断开并重新连接从站。

尽管显示了系统信息,但它仍然有效。


0

我通过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/jenkinssource /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它以前不存在的东西。


0

这是我在詹金斯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。

首先这没有用,但是后来我断开了从属服务器并重新连接它,因此它再次加载了变量。如果您要修改从属变量,则无需重新启动整个詹金斯。只需断开并重新连接即可。


-1

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.