如何在詹金斯中设置环境变量?


228

我希望能够执行以下操作:

AOEU=$(echo aoeu)

并安排詹金斯AOEU=aoeu

Jenkins中的“ 环境变量”部分不这样做。而是设置了AOEU='$(echo aoeu)'

如何让Jenkins评估Shell命令并将输出分配给环境变量?

最终,我希望能够将作业的执行者分配给可以传递给其他脚本或由其他脚本使用的环境变量。


2
EnvInject插件存在一些严重的安全漏洞。现在,詹金斯已经对此stackoverflow.com/a/53430757/1753177
-lambodar

@lambodar链接仅用于问题
Z. Cochrane

@ Z.Cochrane,它是作者已删除答案的链接。
Yap Yap

Answers:


217

可以通过以下方式通过EnvInject插件完成此操作:

  1. 创建一个运行的“执行外壳”构建步骤:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. 创建一个“ 注入”环境变量构建步骤,并将“属性文件路径”设置为propsfile

注意:此插件(大多数)与Pipeline插件不兼容。


4
EnvInject无法处理我上面给出的情况:[EnvInject]-将属性内容AOEU = $(echo aoeu)注入为环境变量[EnvInject]-变量已成功注入。[EnvInject]-设置未解析的'AOEU'变量。
Noel Yap 2012年

1
该解决方案使用Unix Shell语法,无法在Windows上运行。
fbmd

2
@fbmd我正在Windows上运行它。您只需要确保自己已sh步入正轨即可。
Custodio

2
如果“执行外壳”错误退出,则EnvInject不起作用,因为生成不会继续进行到注入部分。
Chadi '16

1
@ Vitim.us foo将在该特定的shell动作中导出,但不会在其他动作中导出。
Noel Yap

109

最简单的方法

您可以使用EnvInject插件在构建启动时注入环境变量。例如:

Add key=value (bash OK!) under 'Build Environment'->'Inject environment variables to the build process' -> 'Properties Content'

你怎么知道它在起作用

EnvInject - Variables injected successfully


5
尝试根据shell命令的输出设置值。
Noel Yap

1
@NoelYap也可以工作,只要最后该行的计算结果为即可key=value。在我的用例中,我完全生成了该行: cat app/build.gradle | grep "def majorVersion" | python -c 'import sys,re,os; print("VERSION_NUMBER="+re.findall(r"[\d+\.]+", sys.stdin.read())[0]+os.environ["BUILD_NUMBER"])'
kenny_k 2015年

@theFunkyEngineer您使用的是哪个版本的EnvInject?在1.91.3中,像您这样的命令被解释为“ cat = app ...”。如果支持此功能,那就太好了,但是我感觉这可能偶然为您工作。
killthrush

1
试图将一个值赋给一个shell命令的输出不是为我工作之一:BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S"BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S")BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"`没有对我的工作
scottysseus


56

就我而言,我需要添加JMETER_HOME环境变量,以便在我的Jenkins服务器(Linux)上的所有项目中都可以通过我的Ant构建脚本使用该环境变量,其方式应不会干扰build.xml脚本中的本地构建环境(Windows和Mac)。通过Manage Jenkins-配置系统-全局属性设置环境变量是实现此目的的最简单,最少侵入的方法。无需插件。

Manage Jenkins Global Properties


然后可以通过以下方式在Ant中使用环境变量:

<property environment="env" />
<property name="jmeter.home" value="${env.JMETER_HOME}" />

可以通过添加以下内容来验证其是否有效:

<echo message="JMeter Home: ${jmeter.home}"/>

产生:

JMeter主页:〜/ .jmeter


那是全球财产。这将影响詹金斯的所有工作。假设我只想将此属性用于一份工作?
IgorGanapolsky '16

我在“管理Jenkins-配置系统-全局”属性中添加了以下内容:git /path/to/my/gitPATH+git /path/to/my/git。但是,如果尝试git从a 访问,则会Jenkins pipeline script得到:/bin/sh: git: command not found
octavian

1
我只需要设置JAVA_HOME环境变量,这个答案对我有帮助。
Sandoval0992

19

您可以使用Environment Injector插件在作业和节点级别的Jenkins中设置环境变量。下面,我将显示如何在工作级别设置它们。

  1. 从Jenkins Web界面,转到Manage Jenkins > Manage Plugins并安装插件。

环境注入器插件

  1. 转到您的工作Configure屏幕
  2. Add build stepBuild部分中查找并选择Inject environment variables
  3. 将所需的环境变量设置为VARIABLE_NAME = VALUE模式。就我而言,我更改了USERPROFILE变量的值

在此处输入图片说明

如果您需要根据某些条件(例如,作业参数)定义新的环境变量,则可以参考此答案


16

您可以尝试这样的事情

stages {
        stage('Build') {
            environment { 
                    AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
                }
            steps {
                sh 'env'
                sh 'echo $AOEU'
            }
        }
    }

这不会解析。
rjurney

2
此格式适用于Jenkinsfile管道项目。您在此代码段中使用哪种工作类型?
JSixface

1
这非常Jenkinsfile适合用于管道(而不是工作)!太好了,谢谢!
mathielo '18

14

EnvInject插件又名(Environment Injector Plugin)为您提供了几个选项,可以通过Jenkins配置来设置环境变量。

通过选择,Inject environment variables to the build process您将获得:

  • Properties File Path
  • Properties Content
  • Script File Path

  • Script Content

  • 最后Evaluated Groovy script


Evaluated Groovy script使您可以根据已执行命令的结果设置环境变量

  • 使用execute方法:
    return [HOSTNAME_SHELL: 'hostname'.execute().text, 
        DATE_SHELL: 'date'.execute().text,
        ECHO_SHELL: 'echo hello world!'.execute().text
    ]
  • 或使用显式Groovy代码:
    return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
        DATE_GROOVY: new Date()
    ] 

(有关每种方法的更多详细信息,请参见内置帮助(?)。


不幸的是,您不能从Script Content状态中做到这一点:

执行旨在设置环境的脚本文件,例如创建文件夹,复制文件等。提供脚本文件的内容。您可以使用以上属性变量。 但是,在脚本中添加或覆盖环境变量不会对构建作业产生任何影响


12

有一个Build Env Propagator插件,可让您添加新的构建环境变量,例如

Jenkins构建-传播构建环境变量

任何后续的Propagate构建环境变量步骤都将覆盖先前定义的环境变量值。


谢谢!我尝试使用Build Env Propagator插件时就可以使用它,并且能够在Build步骤中设置环境变量真是太好了!
twasbrillig '16

10

就我而言,我已经使用以下选项配置了环境变量,并且可以正常工作-

Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add

这是最好的方法
龙阮

7

通常情况下,你可以配置环境变量全球性配置系统

但是,对于使用Shell替换的动态变量,您可能需要在Jenkins HOME目录中创建脚本文件,并在构建过程中执行该脚本文件。SSH访问是必需的。例如。

  1. 以Jenkins身份登录:sudo su - jenkinssudo su - jenkins -s /bin/bash
  2. 创建一个shell脚本,例如:

    echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
    echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
    chmod 750 ~/load_env.sh
    
  3. 在Jenkins Build(Execute shell)中,先调用脚本及其变量,例如

    source ~/load_env.sh
    

不幸的是对我没有用。之后sudo su - jenkinsecho $USER还给我root
祈祷合'17

@prayagupd您需要模拟完整的登录名,因此请使用su -l参数来执行此操作,否则请提出另一个问题。
kenorb

@kenorb调用脚本后,如何再次读取env变量?例如,这是行不通的sh “” “源〜/ load_env.sh回声”VM_NAME:$ VM_NAME“回声”VM_NAME:$ {} VM_NAME“ ”“”

7

这是存储环境变量并对其进行访问的代码段。

node {
   withEnv(["ENABLE_TESTS=true", "DISABLE_SQL=false"]) {
      stage('Select Jenkinsfile') {
          echo "Enable test?: ${env.DEVOPS_SKIP_TESTS}
          customStep script: this
      }
   }
}

注意:环境变量的值以字符串形式出现。如果要将其用作布尔值,则必须使用Boolean.parse(env.DISABLE_SQL)对其进行解析。


4

尝试使用环境脚本插件GitHub),它与EnvInject非常相似。它允许您在生成生成环境变量的脚本之前(在SCM检出之后)运行脚本。例如

Jenkins Build-常规工作-Build Environment

在脚本中,您可以打印FOO=bar到例如标准输出以设置该变量。

附加到现有PATH-style变量的示例:

echo PATH+unique_identifier=/usr/local/bin

因此,您可以自由地执行脚本中所需的任何操作- cat文件或从项目的源代码树中以其他某种语言运行脚本等。



0

由于某种原因,我sudo su - jenkins没有登录到jenkins 用户,所以我最终使用了不同的方法。

我成功了使用设置使用詹金斯全球ENV变量config.xml/var/lib/jenkins/config.xml(安装在Linux的/ RHEL) -无需使用外部插件。

我只是不得不停止jenkins add,然后添加globalNodeProperties,然后重新启动。

例子中,我定义变量APPLICATION_ENVIRONMENTSPRING_PROFILES_ACTIVEcontinious_integration下面,

<?xml version='1.0' encoding='UTF-8'?>
<hudson>

  <globalNodeProperties>
    <hudson.slaves.EnvironmentVariablesNodeProperty>
      <envVars serialization="custom">
        <unserializable-parents/>
        <tree-map>
          <default>
            <comparator class="hudson.util.CaseInsensitiveComparator"/>
          </default>
          <int>2</int>
          <string>APPLICATION_ENVIRONMENT</string>
          <string>continious_integration</string>
          <string>SPRING_PROFILES_ACTIVE</string>
          <string>continious_integration</string>
        </tree-map>
      </envVars>
    </hudson.slaves.EnvironmentVariablesNodeProperty>
  </globalNodeProperties>
</hudson>

-3

我们使用常规的作业文件:

description('')
steps {
    environmentVariables {
        envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
    }
}
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.