Reputation: 19808
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.
Upvotes: 282
Views: 776848
Reputation: 8608
You can use Environment Injector Plugin to set environment variables in Jenkins at job and node levels. These are the steps to set them at job level:
Manage Jenkins > Manage Plugins
and install the plugin.Configure
screenAdd build step
in Build
section and select Inject environment variables
If you need to define a new environment variable depending on some conditions (e.g. job parameters), then you can refer to this answer.
Upvotes: 26
Reputation: 149
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.
Upvotes: 0
Reputation: 1407
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 {
...
}
}
Upvotes: 6
Reputation: 166879
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.
Upvotes: 15
Reputation: 1574
In my case, I had configure environment variables using the following option and it worked-
Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
Upvotes: 44
Reputation: 954
You can use either of the following ways listed below:
Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
Upvotes: 2
Reputation: 81
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).
Upvotes: 8
Reputation: 5171
We use groovy job file:
description('')
steps {
environmentVariables {
envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
}
}
Upvotes: -3
Reputation: 166879
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.
sudo su - jenkins
or sudo 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
Upvotes: 7
Reputation: 16615
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.
Upvotes: 242
Reputation: 166879
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.
Upvotes: 4
Reputation: 707
You can try something like this
stages {
stage('Build') {
environment {
AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
}
steps {
sh 'env'
sh 'echo $AOEU'
}
}
}
Upvotes: 27
Reputation: 31252
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>
Upvotes: 2
Reputation: 7519
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
Upvotes: 73
Reputation: 3990
You can use EnvInject plugin to injects environment variables at build startup. For example:
Upvotes: 126
Reputation: 7825
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:
execute
method: return [HOSTNAME_SHELL: 'hostname'.execute().text,
DATE_SHELL: 'date'.execute().text,
ECHO_SHELL: 'echo hello world!'.execute().text
]
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.
Upvotes: 16