【问题标题】:Jenkins / Hudson environment variables詹金斯/哈德森环境变量
【发布时间】:2023-12-03 14:16:01
【问题描述】:

我正在从用户 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

标签: jenkins environment-variables hudson


【解决方案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)

        1. 进入从站设置

        2. 添加新的环境变量

        3. 路径
        4. ${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 上,我尝试了很多调整,然后才成功:

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

                  导出 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 — 该插件可以添加环境变量并执行设置脚本,以便为作业设置环境。

                        【讨论】: