如何在Jenkins中设置环境变量?

我希望能够做到以下几点:

AOEU=$(echo aoeu)

并让Jenkins设置AOEU=aoeu

Jenkins中的环境变量部分不会这样做。相反,它设置AOEU='$(echo aoeu)'

如何让Jenkins计算shell命令并将输出分配给环境变量?

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

692243 次浏览

这可以通过EnvInject插件实现,方法如下:

  1. 创建一个“Execute shell”构建步骤,运行:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Create an Inject environment variables build step and set "Properties File Path" to propsfile.

Note: This plugin is (mostly) not compatible with the Pipeline plugin.

最简单的方法

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

Add key=value (bash OK!) under 'Build environment '->'向Build process注入环境变量'→& # 39;属性内容# 39;

你怎么知道它有用

EnvInject - Variables inject successfully

EnvInject插件又名(环境注入器插件)提供了几个选项来设置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中做同样的事情,因为它声明:

执行脚本文件,用于设置环境,如创建 文件夹,复制文件,等等。给出脚本文件内容。你 可以使用上面的属性变量。然而,添加或覆盖 脚本中的环境变量不会对 建立工作> < /强劲。< / p >

构建环境传播插件可以让你添加新的构建环境变量,例如:

Jenkins Build - Propagate构建环境变量

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

通常可以在配置系统中的全局属性中配置环境变量

然而,对于带有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. In Jenkins Build (Execute shell), invoke the script and its variables before anything else, e.g.

    source ~/load_env.sh
    

在我的例子中,我需要添加JMETER_HOME环境变量,以便通过我的Ant构建脚本在我的Jenkins服务器(Linux)上的所有项目中可用,以一种不会干扰build.xml脚本中的本地构建环境(Windows和Mac)的方式。通过管理Jenkins -配置系统-全局属性设置环境变量是实现这一目标的最简单和最少干扰的方法。不需要插件。

Manage Jenkins Global Properties


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

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

这可以通过添加:

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

生产:

JMeter Home: ~/.jmeter

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

我成功地设置了全局env变量使用jenkins 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>

你可以尝试这样做

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

你可以使用环境注入器插件在作业和节点级别设置Jenkins中的环境变量。下面我将展示如何将它们设置为工作级别。

  1. 在Jenkins的网页界面中,进入Manage Jenkins > Manage Plugins并安装插件。

Environment Injector Plugin

  1. 进入你的工作Configure屏幕
  2. Build部分找到Add build step并选择Inject environment variables
  3. 将所需的环境变量设置为VARIABLE_NAME=VALUE模式。在我的例子中,我改变了USERPROFILE变量的值

enter image description here

如果你需要根据某些条件(例如作业参数)定义一个新的环境变量,那么你可以引用这个回答

尝试环境脚本插件 (GitHub),它与EnvInject非常相似。它允许您在构建之前(SCM签出之后)运行一个脚本,为它生成环境变量。如。

Jenkins Build - Regular job - Build Environment

在你的脚本中,你可以将例如FOO=bar输出到标准输出来设置该变量。

添加到现有__abc0样式变量的示例:

echo PATH+unique_identifier=/usr/local/bin

所以你可以自由地在脚本中做任何你需要的事情——cat文件,或者从你的项目的源代码树中运行其他语言的脚本,等等。

我们使用groovy作业文件:

description('')
steps {
environmentVariables {
envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
}
}

在我的例子中,我使用以下选项配置环境变量,它工作了-

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

这是存储环境变量并访问它的代码片段。

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)来解析它。

你可以使用下面列出的任何一种方式:

  1. 使用Env注入插件创建环境变量。遵循这个用法和更多细节https://github.com/jenkinsci/envinject-plugin
    1. 浏览下面并可以添加
    2. 李< / ol > < / >

    管理Jenkins—>配置系统—>全局属性—>环境变量—>添加

    enter image description here

扩展@JSixface的答案:

要定义环境变量在全球范围内以便从声明式管道的所有阶段中访问,可以在pipeline块中添加environment节。

pipeline {
agent {
node {
label 'myAgent'
}
}
environment {
AOEU = "${sh(returnStdout: true, script: 'echo aoeu').trim()}"
}
stages {
...
}
}

我们使用的Scripted Pipeline语法是这样的:

env.AEOU = sh label:'set env var',
returnStdout: true,
script : '''#!/bin/bash
echo "aeou"
'''
sh label:'checkit',
script : '''#!/bin/bash
echo "${AEOU}"
'''

注意,sh步骤的script参数使用了triple-single-quote表示法。这确保了${AEOU}不会被Groovy插入,而会被bash shell插入。