How to set environment variables in Jenkins?
JenkinsContinuous IntegrationEnvironment VariablesJenkins Problem Overview
I would like to be able to do something like:
AOEU=$(echo aoeu)
and have Jenkins set AOEU=aoeu
.
The Environment Variables section in Jenkins doesn't do that. Instead, it sets AOEU='$(echo aoeu)'
.
How can I get Jenkins to evaluate a shell command and assign the output to an environment variable?
Eventually, I want to be able to assign the executor of a job to an environment variable that can be passed into or used by other scripts.
Jenkins Solutions
Solution 1 - Jenkins
This can be done via EnvInject plugin in the following way:
-
Create an "Execute shell" build step that runs:
echo AOEU=$(echo aoeu) > propsfile
-
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.
Solution 2 - Jenkins
The simplest way
You can use EnvInject plugin to injects environment variables at build startup. For example:
How you know it's working
Solution 3 - Jenkins
In my case, I needed to add the JMETER_HOME
environment variable to be available via my Ant build scripts across all projects on my Jenkins server (Linux), in a way that would not interfere with my local build environment (Windows and Mac) in the build.xml
script. Setting the environment variable via Manage Jenkins - Configure System - Global properties was the easiest and least intrusive way to accomplish this. No plug-ins are necessary.
The environment variable is then available in Ant via:
<property environment="env" />
<property name="jmeter.home" value="${env.JMETER_HOME}" />
This can be verified to works by adding:
<echo message="JMeter Home: ${jmeter.home}"/>
Which produces:
> JMeter Home: ~/.jmeter
Solution 4 - Jenkins
In my case, I had configure environment variables using the following option and it worked-
Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
Solution 5 - Jenkins
You can try something like this
stages {
stage('Build') {
environment {
AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
}
steps {
sh 'env'
sh 'echo $AOEU'
}
}
}
Solution 6 - Jenkins
You can use Environment Injector Plugin to set environment variables in Jenkins at job and node levels. Below I will show how to set them at job level.
- From the Jenkins web interface, go to
Manage Jenkins > Manage Plugins
and install the plugin.
- Go to your job
Configure
screen - Find
Add build step
inBuild
section and selectInject environment variables
- Set the desired environment variable as VARIABLE_NAME=VALUE pattern. In my case, I changed value of USERPROFILE variable
If you need to define a new environment variable depending on some conditions (e.g. job parameters), then you can refer to this answer.
Solution 7 - Jenkins
EnvInject Plugin aka (Environment Injector Plugin) gives you several options to set environment variables from Jenkins configuration.
By selecting Inject environment variables to the build process
you will get:
-
Properties File Path
-
Properties Content
-
Script File Path
-
Script Content
-
and finally
Evaluated Groovy script
.
Evaluated Groovy script
gives you possibility to set environment variable based on result of executed command:
- with
execute
method:
return [HOSTNAME_SHELL: 'hostname'.execute().text,
DATE_SHELL: 'date'.execute().text,
ECHO_SHELL: 'echo hello world!'.execute().text
]
- or with explicit
Groovy
code:
return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
DATE_GROOVY: new Date()
]
(More details about each method could be found in build-in help (?))
Unfortunately you can't do the same from Script Content
as it states:
> Execute a script file aimed at setting an environment such as creating > folders, copying files, and so on. Give the script file content. You > can use the above properties variables. However, adding or overriding > environment variables in the script doesn't have any impacts in the > build job.
Solution 8 - Jenkins
There is Build Env Propagator Plugin which lets you add new build environment variables, e.g.
> Any successive Propagate build environment variables step will override previously defined environment variable values.
Solution 9 - Jenkins
Normally you can configure Environment variables in Global properties in Configure System.
However for dynamic variables with shell substitution, you may want to create a script file in Jenkins HOME dir and execute it during the build. The SSH access is required. For example.
-
Log-in as Jenkins:
sudo su - jenkins
orsudo su - jenkins -s /bin/bash
-
Create a shell script, e.g.:
echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh chmod 750 ~/load_env.sh
-
In Jenkins Build (Execute shell), invoke the script and its variables before anything else, e.g.
source ~/load_env.sh
Solution 10 - Jenkins
> This is the snippet to store environment variable and access it.
node {
withEnv(["ENABLE_TESTS=true", "DISABLE_SQL=false"]) {
stage('Select Jenkinsfile') {
echo "Enable test?: ${env.DEVOPS_SKIP_TESTS}
customStep script: this
}
}
}
Note: The value of environment variable is coming as a String. If you want to use it as a boolean then you have to parse it using Boolean.parse(env.DISABLE_SQL).
Solution 11 - Jenkins
Try Environment Script Plugin (GitHub) which is very similar to EnvInject. It allows you to run a script before the build (after SCM checkout) that generates environment variables for it. E.g.
and in your script, you can print e.g. FOO=bar
to the standard output to set that variable.
Example to append to an existing PATH
-style variable:
echo PATH+unique_identifier=/usr/local/bin
So you're free to do whatever you need in the script - either cat
a file, or run a script in some other language from your project's source tree, etc.
Solution 12 - Jenkins
extending the answer of @JSixface:
To define environment variables globally for access from within all the stages of a declarative pipeline, you can add the environment
section within the pipeline
block.
pipeline {
agent {
node {
label 'myAgent'
}
}
environment {
AOEU = "${sh(returnStdout: true, script: 'echo aoeu').trim()}"
}
stages {
...
}
}
Solution 13 - Jenkins
For some reason sudo su - jenkins
does not log me to jenkins
user, I ended up using different approach.
I was successful setting the global env variables using using jenkins config.xml
at /var/lib/jenkins/config.xml
(installed in Linux/ RHEL) - without using external plugins.
I simply had to stop jenkins add then add globalNodeProperties
, and then restart.
Example, I'm defining variables APPLICATION_ENVIRONMENT
and SPRING_PROFILES_ACTIVE
to continious_integration
below,
<?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>
Solution 14 - Jenkins
You can use either of the following ways listed below:
- Use Env Inject Plugin for creating environment variables. Follow this for usage and more details https://github.com/jenkinsci/envinject-plugin
- Navigate below and can add
Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
Solution 15 - Jenkins
Scripted Pipeline syntax that we use is this:
env.AEOU = sh label:'set env var',
returnStdout: true,
script : '''#!/bin/bash
echo "aeou"
'''
sh label:'checkit',
script : '''#!/bin/bash
echo "${AEOU}"
'''
Note the use of triple-single-quote
notation for the script
parameter to the sh
step. This ensures that the ${AEOU}
does not get interpolated by Groovy and does get interpolated by the bash shell.
Solution 16 - Jenkins
We use groovy job file:
description('')
steps {
environmentVariables {
envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
}
}