詹金斯/哈德森环境变量

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 -&gt; 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 $SHELLecho $BASH(注意我明确地将 #!/bin/bash 放在 Jenkins 的文本区域顶部,我不确定这是否是获得 BASH 的要求)。 sourceing /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 中,所以只需 sourceing 它就解决了问题。

【讨论】:

确保使用#!/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 — 该插件可以添加环境变量并执行设置脚本,以便为作业设置环境。

【讨论】:

以上是关于詹金斯/哈德森环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在Hudson中增加构建队列的数量?

Jenkins数组变量在环境标记/正文中

哈德森:“是的:标准输出:断管”

Java 怎么设置环境变量

詹金斯是否具有非秘密凭证等功能?

swiftUI 2.0列表滚动很慢,我找不到原因..即使是保罗哈德森的伎俩也不起作用