Jenkins / Hudson环境变量

时间:2011-04-28 12:12:49

标签: jenkins environment-variables hudson

我正在运行Jenkins,用户jenkins已经$PATH设置了某些内容,当我进入Jenkins网络界面时,在系统属性窗口中{{1} })我看到了不同的http://$host/systemInfo

我已经使用Jenkins网站上的原生rpm在Centos上安装了Jenkins。我正在使用$PATH

安装时提供的启动脚本

有人可以向我解释为什么会这样吗?

21 个答案:

答案 0 :(得分:134)

迈克尔,

两件事:

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

此外,您对本地shell中的$ PATH所做的任何更改(您个人搜索的内容)都不会显示在Jenkins中。

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

1)编辑/etc/profile文件并添加您想要的路径

2)转到奴隶的配置页面,添加环境变量PATH,其值为:$PATH:/followed-by/paths/you/want/to/add

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

答案 1 :(得分:34)

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

source /etc/profile

作为构建过程的第一步。现在我的所有后续规则都被加载,以便Jenkins顺利运行。

答案 2 :(得分: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错误。

答案 3 :(得分:14)

我尝试了/etc/profile~/.profile~/.bash_profile,但没有一个有效。我发现为jenkins slave帐户编辑~/.bashrc了。

答案 4 :(得分:9)

此答案的信息已过期。你需要去配置Jenkins>然后,您可以单击以从中添加环境变量键值对。

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

答案 5 :(得分:5)

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

在配置不同的旧实例上,使用Sagar's answer中的#2是唯一可行的(即.profile,.bash *不起作用)。

答案 6 :(得分:4)

我找到了两个插件。 一个加载文件中的值,另一个允许您在作业配置屏幕中配置值。

Envfile Plugin - 此插件允许您通过文件设置环境变量。文件的格式必须是标准的Java属性文件格式。

EnvInject Plugin - 此插件可以添加环境变量并执行设置脚本,以便为作业设置环境。

答案 7 :(得分:4)

你不能在Jenkins设置中将它添加为环境变量:

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

答案 8 :(得分:4)

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

我更改了PATH变量@sagar在他的第二个选项中建议,但我仍然得到了不同于我预期的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文件中的任何变量。

答案 9 :(得分:2)

在“/etc/init.d/jenkins force-reload”之后,我在这个问题上只取得了进展。我建议先尝试一下,然后使用它而不是重新启动。

答案 10 :(得分:2)

在我的Ubuntu 13.04上,我尝试了一些调整,然后才成功:

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

    export PATH = $ PATH:/ some / new / path / bin

答案 11 :(得分:2)

Jenkins还支持格式[2018-07-10 15:40:30,168] INFO Reflections took 1 ms to scan 1 urls, producing 5 keys and 6 values [using 1 cores] (org.reflection s.Reflections) [2018-07-10 15:40:30,170] WARN could not get type for name org.jmock.Mockery from any class loader (org.reflections.Reflections) org.reflections.ReflectionsException: could not get type for name org.jmock.Mockery at org.reflections.ReflectionUtils.forName(ReflectionUtils.java:390) at org.reflections.Reflections.expandSuperTypes(Reflections.java:381) at org.reflections.Reflections.<init>(Reflections.java:126) at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader$InternalReflections.<init>(DelegatingClassLoader.java: 365) at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.scanPluginPath(DelegatingClassLoader.java:277) at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.scanUrlsAndAddPlugins(DelegatingClassLoader.java:216) at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.registerPlugin(DelegatingClassLoader.java:208) at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.initPluginLoader(DelegatingClassLoader.java:177) at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.initLoaders(DelegatingClassLoader.java:154) at org.apache.kafka.connect.runtime.isolation.Plugins.<init>(Plugins.java:56) at org.apache.kafka.connect.cli.ConnectStandalone.main(ConnectStandalone.java:77) Caused by: java.lang.ClassNotFoundException: org.jmock.Mockery at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at org.reflections.ReflectionUtils.forName(ReflectionUtils.java:388) ... 10 more 来附加任何变量,不仅限于PATH:

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

Jenkins variable + notation

管道步骤PATH+<name>中也支持此操作:

withEnv

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

请参阅管道步骤文档here

  

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

或者EnvVars here上的Java文档。

答案 12 :(得分:1)

对我有用的解决方案

source ~/.bashrc

说明

我首先验证了Jenkins正在使用echo $SHELLecho $BASH运行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按我的预期改变了。

我试图弄清楚如何正确欺骗交互式shell来加载/etc/bash.bashrc,但事实证明我所需要的只是在~/.bashrc中,所以只是source它解决了这个问题。

答案 13 :(得分:1)

添加

/usr/bin/bash

at

  

詹金斯 - &gt;管理Jenkins - &gt;配置系统 - &gt;壳 - &GT;外壳   可执行

詹金斯使用sh,所以即使/ etc / profile也不适合我 当我添加它时,我拥有所有的环境。

答案 14 :(得分: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上。

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

答案 15 :(得分:0)

我尝试了上面的所有事情 - 对我不起作用。

我找到了两个解决方案(均为SSH-Slave)

  1. 转到从属设置

  2. 添加新的环境变量

  3. PATH
  4. $ {PATH}:$ {HOME} /酒馆缓存/斌:$ {HOME} / local / bin目录
  5. “$ {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"
                    }
                }
            }
        }
    }
    

答案 16 :(得分:0)

我通过zypper(包管理器)在SLES 11 SP3上安装了Jenkins 1.639。 安装将jenkins配置为服务

/etc/init.d/jenkins

虽然/etc/sysconfig/jenkinsstartproc -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变量,因为它是在一个单独的登录shell中启动的,具有如下新环境:

.bashrc

我设法为jenkins流程设置env vars的方式是在其主目录/var/lib/jenkins中通过/var/lib/jenkins/.bashrc。我必须创建之前不存在的foreach ($html->find('h2[class="entry-title"] a') as $data) { echo $data->innertext; };

答案 17 :(得分:0)

对我有用的是覆盖奴隶的PATH环境。

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

然后断开并重新连接从属设备。

尽管系统信息显示它有效。

答案 18 :(得分:0)

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

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

答案 19 :(得分:0)

在Ubuntu上我只是编辑/ etc / default / jenkins并在最后添加source / etc / profile,它对我有用。

答案 20 :(得分:-1)

1-添加到您的个人档案文件&#34; .bash_profile&#34;文件

它位于&#34; / home / your_user /&#34;夹

vi .bash_profile

添加:

<div>

==&GT;它是e jenkins工作区

2-如果你使用码头: 转到jenkins.xml文件

并添加:

<img>