How to set environment variables in Jenkins?
Asked Answered
E

16

281

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.

Ex answered 16/5, 2012 at 19:21 Comment(3)
EnvInject plugin is having some serious security vulnerability. Now Jenkins is having inbuilt support for this https://mcmap.net/q/107850/-how-to-set-environment-variables-in-jenkinsDux
@Dux the link just goes to the questionMonahan
@Z.Cochrane, it's a link to an answer that has been deleted by the author.Ex
F
242

This can be done via EnvInject plugin in the following way:

  1. Create an "Execute shell" build step that runs:

    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.

Friedcake answered 16/5, 2012 at 20:28 Comment(9)
EnvInject doesn't handle the situation I gave above: [EnvInject] - Injecting as environment variables the properties content AOEU=$(echo aoeu) [EnvInject] - Variables injected successfully. [EnvInject] - Unset unresolved 'AOEU' variable.Ex
It seems that I did not quite get what it was that you wanted. My meaning was that you first run a shell build step where you write something like echo 'AOEU=' > propsfile and then echo `echo aoeu` > propsfile. In the next build step you load propsfile (the contents of which is now AOEU=aoeu).Friedcake
That solution uses Unix shell syntax and won't work on windows.Ethelinda
@Ethelinda I'm running it on Windows. You just need to make sure you have sh on the path.Hutchens
EnvInject does not work if the "execute shell" exits with an error because the build does not proceed to the injection part.Donoghue
Using the managed script is also the same result, in case if anyone is wondering. The propsFile will be under the /workspace of your project directoryViole
What's wrong with just adding a "Execute shell" with export foo="bar" ?Wengert
@Vitim.us, foo will get exported in that specific shell action but not in other actions.Ex
Doesn't work with Maven plugin. EnvInject looks for propsfile before any pre-build step is executed.Eastlake
S
124

The simplest way

You can use EnvInject plugin to injects environment variables at build startup. For example:

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

How you know it's working

EnvInject - Variables injected successfully

Spot answered 18/6, 2015 at 23:7 Comment(12)
Try setting the value based on the output of a shell command.Ex
@NoelYap Works too, as long as in the end the line evaluates to key=value. In my use case I generate the line completely: 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"])'Spot
@theFunkyEngineer what version of EnvInject are you using? With 1.91.3, a command like yours is interpreted as "cat=app...". Would be great if this feature was supported, but I'm getting the sense that this may have worked for you by accident.Yahiya
FWIW, I did get my variables to work by creating a property file first using the Script Content box (not shown) and then reading it back in using the Path field shown in the screenshot above. It only supports hard-coded absolute paths though which is a bummer.Yahiya
@Yahiya Not sure, I'm also using 1.91.3. I haven't tried with a simple echo FOO=BAR, but that seems like a good test of whether it would work for you.Spot
@theFunkyEngineer Yeah, I tried a lot of variations of echo, printf, and eval and finally gave up. Wonder if it's a shell idiosyncracy of some kind. I'm running Jenkins 1.620 with Ubuntu 14.04. Thanks just the same - it's a tantalizing possibility that this could work!Yahiya
attempting to assign a value to the output of a shell command is not working for me either: BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S" and BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S") and BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"` did not work for meThorvald
is it possible to do it globally to apply for every build?Taro
@scottyseus did you ever solve that? Am trying to do the same.Hitchcock
@AndyHayden it has been a while since I last did this, but I believe my solution was to add a build step to capture the date in a file, and then I somehow injected that file into the build.Thorvald
@scottyseus I ended up using this wiki.jenkins-ci.org/display/JENKINS/Environment+Script+Plugin worked like a charm. https://mcmap.net/q/107850/-how-to-set-environment-variables-in-jenkinsHitchcock
If I use this method, how can/do I manipulate the variable inside an "Execute shell" step? If I simply set the same variable inside the step it doesn't get set. For example if set it in one "Execute shell" step, and echo it in another "Execute shell" step, it doesn't show the changes.Surefire
M
72

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.

Manage Jenkins Global Properties


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

Mishear answered 17/8, 2016 at 18:52 Comment(4)
That is a global property. It will effect ALL jobs on Jenkins. Supposed I just want this property for one job?Overbearing
I've added to Manage Jenkins - Configure System - Global properties, the following: git /path/to/my/git and PATH+git /path/to/my/git. However, if I am trying to access git from the a Jenkins pipeline script, I get: /bin/sh: git: command not found.Mccafferty
I just needed to set up JAVA_HOME environment variable and this answer was the one that helped me.Verism
@Overbearing In that case, could you use an environment variable that only that particular job would be aware of?Mishear
D
42

In my case, I had configure environment variables using the following option and it worked-

Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
Dibromide answered 21/2, 2019 at 13:4 Comment(3)
This is the best waySubversive
How to access this Global properties' Environment variables from Jenkins Build "Execute shell" ?Villiers
three hours no luck and then your comment saved me. Thanks man!Inurn
S
27

You can try something like this

stages {
        stage('Build') {
            environment { 
                    AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
                }
            steps {
                sh 'env'
                sh 'echo $AOEU'
            }
        }
    }
Stative answered 24/7, 2017 at 20:37 Comment(4)
This doesn't parse.Majewski
This formatt is for the Jenkinsfile pipeline project. What job type are you using this snippet in?Stative
This works perfectly in a Jenkinsfile for a pipeline (not job)! That's awesome, thanks for it!Hereof
How to make this a global variable so that AOEU can be referenced in subsequent stages?Alkali
A
26

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:

  1. From the Jenkins web interface, go to Manage Jenkins > Manage Plugins and install the plugin.

Environment Injector Plugin

  1. Go to your job Configure screen
  2. Find Add build step in Build section and select Inject environment variables
  3. Set the desired environment variable as VARIABLE_NAME=VALUE pattern. In my case, I changed value of USERPROFILE variable

enter image description here

If you need to define a new environment variable depending on some conditions (e.g. job parameters), then you can refer to this answer.

Alcaic answered 21/11, 2017 at 10:32 Comment(0)
M
16

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.

Mydriasis answered 14/5, 2016 at 6:59 Comment(0)
P
15

There is Build Env Propagator Plugin which lets you add new build environment variables, e.g.

Jenkins Build - Propagate build environment variables

Any successive Propagate build environment variables step will override previously defined environment variable values.

Pudendas answered 9/7, 2016 at 21:9 Comment(1)
Thank you! Build Env Propagator Plugin worked when I tried it, and it's great to have the ability to set environment variables during the Build steps!Capitate
C
8

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).

Chita answered 31/5, 2019 at 15:49 Comment(0)
P
7

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.

  1. Log-in as Jenkins: sudo su - jenkins or sudo su - jenkins -s /bin/bash
  2. 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
    
  3. In Jenkins Build (Execute shell), invoke the script and its variables before anything else, e.g.

    source ~/load_env.sh
    
Pudendas answered 9/7, 2016 at 22:7 Comment(3)
unfortunately did not work for me. after sudo su - jenkins, still echo $USER gives me root.Hypothesis
@prayagupd You need to simulate a full login, so use su -l parameter to do that, otherwise ask a separate question.Pudendas
@Pudendas after invoking the script, how do I read env variable again? for example, this does not work sh """ source ~/load_env.sh echo "VM_NAME: $VM_NAME" echo "VM_NAME: ${VM_NAME}" """Stewartstewed
S
6

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 {
    ...
  }
}                                                                                               
Seesaw answered 19/10, 2021 at 12:30 Comment(0)
P
4

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.

Jenkins Build - Regular job - Build Environment

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.

Pudendas answered 8/2, 2018 at 1:18 Comment(0)
H
2

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>
Hypothesis answered 9/5, 2017 at 2:22 Comment(1)
Is there a way such as using cloudbees API or any kind of restAPI to change the value of Jenkins environment variable?Invest
K
2

You can use either of the following ways listed below:

  1. Use Env Inject Plugin for creating environment variables. Follow this for usage and more details https://github.com/jenkinsci/envinject-plugin
    1. Navigate below and can add

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

enter image description here

Kolnick answered 8/12, 2019 at 9:28 Comment(0)
C
0

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.

Cryotherapy answered 30/3, 2022 at 4:28 Comment(0)
S
-3

We use groovy job file:

description('')
steps {
    environmentVariables {
        envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
    }
}
Sawyere answered 7/12, 2018 at 18:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.