How to list all `env` properties within jenkins pipeline job?

JenkinsGroovyJenkins Pipeline

Jenkins Problem Overview


Given a jenkins build pipeline, jenkins injects a variable env into the node{}. Variable env holds environment variables and values.

I want to print all env properties within the jenkins pipeline. However, I do no not know all env properties ahead of time.

For example, environment variable BRANCH_NAME can be printed with code

node {
    echo ${env.BRANCH_NAME}
    ...

I am looking for code like

node {
    for(e in env){
        echo e + " is " + ${e}
    }
    ...

which would echo something like

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

I used Jenkins 2.1 for this example.

Jenkins Solutions


Solution 1 - Jenkins

According to Jenkins documentation for declarative pipeline:

sh 'printenv'

For Jenkins scripted pipeline:

echo sh(script: 'env|sort', returnStdout: true)

The above also sorts your env vars for convenience.

Solution 2 - Jenkins

Another, more concise way:

node {
    echo sh(returnStdout: true, script: 'env')
    // ...
}

cf. https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-shell-script

Solution 3 - Jenkins

The following works:

@NonCPS
def printParams() {
  env.getEnvironment().each { name, value -> println "Name: $name -> Value $value" }
}
printParams()

Note that it will most probably fail on first execution and require you approve various groovy methods to run in jenkins sandbox. This is done in "manage jenkins/in-process script approval"

The list I got included:

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • BUILD_NUMBER
  • BUILD_TAG
  • BUILD_URL
  • CLASSPATH
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • JOB_NAME
  • JOB_URL

Solution 4 - Jenkins

You can accomplish the result using sh/bat step and readFile:

node {
    sh 'env > env.txt'
    readFile('env.txt').split("\r?\n").each {
        println it
    }
}

Unfortunately env.getEnvironment() returns very limited map of environment variables.

Solution 5 - Jenkins

Why all this complicatedness?

sh 'env'

does what you need (under *nix)

Solution 6 - Jenkins

Cross-platform way of listing all environment variables:

if (isUnix()) {
    sh env
}
else {
    bat set
}

Solution 7 - Jenkins

Here's a quick script you can add as a pipeline job to list all environment variables:

node {
    echo(env.getEnvironment().collect({environmentVariable ->  "${environmentVariable.key} = ${environmentVariable.value}"}).join("\n"))
    echo(System.getenv().collect({environmentVariable ->  "${environmentVariable.key} = ${environmentVariable.value}"}).join("\n"))
}

This will list both system and Jenkins variables.

Solution 8 - Jenkins

I use Blue Ocean plugin and did not like each environment entry getting its own block. I want one block with all the lines.

Prints poorly:

sh 'echo `env`'

Prints poorly:

sh 'env > env.txt'
for (String i : readFile('env.txt').split("\r?\n")) {
    println i
}

Prints well:

sh 'env > env.txt'
sh 'cat env.txt'

Prints well: (as mentioned by @mjfroehlich)

echo sh(script: 'env', returnStdout: true)

Solution 9 - Jenkins

The pure Groovy solutions that read the global env variable don't print all environment variables (e. g. they are missing variables from the environment block, from withEnv context and most of the machine-specific variables from the OS). Using shell steps it is possible to get a more complete set, but that requires a node context, which is not always wanted.

Here is a solution that uses the getContext step to retrieve and print the complete set of environment variables, including pipeline parameters, for the current context.

Caveat: Doesn't work in Groovy sandbox. You can use it from a trusted shared library though.

def envAll = getContext( hudson.EnvVars )
echo envAll.collect{ k, v -> "$k = $v" }.join('\n')

Solution 10 - Jenkins

Show all variable in Windows system and Unix system is different, you can define a function to call it every time.

def showSystemVariables(){    
   if(isUnix()){
     sh 'env'
   } else {
     bat 'set'
   }
}

I will call this function first to show all variables in all pipline script

stage('1. Show all variables'){
     steps {
         script{            
              showSystemVariables()
         }
     }
} 

Solution 11 - Jenkins

The easiest and quickest way is to use following url to print all environment variables

http://localhost:8080/env-vars.html/

Solution 12 - Jenkins

The answers above, are now antiquated due to new pipeline syntax. Below prints out the environment variables.

script {
	    sh 'env > env.txt'
        String[] envs = readFile('env.txt').split("\r?\n")
            
        for(String vars: envs){
            println(vars)
        }
    }

Solution 13 - Jenkins

if you really want to loop over the env list just do:

def envs = sh(returnStdout: true, script: 'env').split('\n')
envs.each { name  ->
    println "Name: $name"
}

Solution 14 - Jenkins

I found this is the most easiest way:

pipeline {
    agent {
        node {
            label 'master'
        }
    }	
    stages {
        stage('hello world') {
            steps {
				sh 'env'
            }
        }
    }
}

Solution 15 - Jenkins

You can get all variables from your jenkins instance. Just visit:

  • ${jenkins_host}/env-vars.html
  • ${jenkins_host}/pipeline-syntax/globals

Solution 16 - Jenkins

another way to get exactly the output mentioned in the question:

envtext= "printenv".execute().text
envtext.split('\n').each
{ 	envvar=it.split("=")
 	println envvar[0]+" is "+envvar[1]
}

This can easily be extended to build a map with a subset of env vars matching a criteria:

envdict=[:]
envtext= "printenv".execute().text
envtext.split('\n').each
{ 	envvar=it.split("=")
 	if (envvar[0].startsWith("GERRIT_"))
	 	envdict.put(envvar[0],envvar[1])
}    
envdict.each{println it.key+" is "+it.value}

Solution 17 - Jenkins

I suppose that you needed that in form of a script, but if someone else just want to have a look through the Jenkins GUI, that list can be found by selecting the "Environment Variables" section in contextual left menu of every build Select project => Select build => Environment Variables

enter image description here

Solution 18 - Jenkins

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJamesThomasMoonView Question on Stackoverflow
Solution 1 - JenkinsWimateekaView Answer on Stackoverflow
Solution 2 - JenkinsmjfroehlichView Answer on Stackoverflow
Solution 3 - JenkinsOmri SpectorView Answer on Stackoverflow
Solution 4 - Jenkinsluka5zView Answer on Stackoverflow
Solution 5 - JenkinsAndrey RegentovView Answer on Stackoverflow
Solution 6 - JenkinsTerryView Answer on Stackoverflow
Solution 7 - JenkinsDanielView Answer on Stackoverflow
Solution 8 - JenkinsJon LauridsenView Answer on Stackoverflow
Solution 9 - Jenkinszett42View Answer on Stackoverflow
Solution 10 - JenkinsAssault72View Answer on Stackoverflow
Solution 11 - JenkinsMuhammad MaroofView Answer on Stackoverflow
Solution 12 - JenkinsEddieView Answer on Stackoverflow
Solution 13 - JenkinsdsaydonView Answer on Stackoverflow
Solution 14 - JenkinsProsenjit SenView Answer on Stackoverflow
Solution 15 - JenkinsDmitriy TarasevichView Answer on Stackoverflow
Solution 16 - JenkinsRomanView Answer on Stackoverflow
Solution 17 - JenkinsclaudodView Answer on Stackoverflow
Solution 18 - JenkinsROYView Answer on Stackoverflow