如何在Jenkins流水线作业中列出所有的`env`属性?

158
给定一个Jenkins构建流水线,Jenkins会将一个变量env注入到node{}中。变量env保存着环境变量和对应的值。 我想在Jenkins流水线中打印出所有env属性。然而,我事先不知道所有env属性。 例如,可以使用以下代码打印环境变量BRANCH_NAME
node {
    echo "BRANCH_NAME is " + ${env.BRANCH_NAME}
    ...

但是,我不知道所有的变量提前。我希望有能够处理这种情况的代码,类似于:
node {
    for(e in env){
        echo e + " is " + ${e}
    }
    ...

会回响出类似的声音
 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

我在这个例子中使用了Jenkins 2.1。

3
看起来这是与 https://dev59.com/uFoV5IYBdhLWcg3wAqvy 相同的内容。 - Krzysztof Krasoń
3
据我所知,env只是封装了环境变量。我认为你不能通过循环来遍历它。在Linux上尝试使用'sh env',在Windows上使用'bat set'。 - Dominik Gebhart
3
根据我下面的评论,@Renato和@Jayan,env.each { name, value -> println "Name: $name -> Value $value" }会打印出Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null - JamesThomasMoon
1
@JamesThomasMoon1979 这是因为 Pipeline 打破了 Groovy 闭包。如果你使用旧的 Java 风格编写(也就是 new ClassName() { ... }),那么它应该能够正常工作。或者你可以在一个标记有 @NonCPS 的方法中运行它,这样闭包也可以在其中工作。 - Daniel C. Sobral
2
'env' 对象不是一个映射,而是某个类对象。 我在 Jenkins 管道脚本中尝试了它。 像 ".each()" 这样的调用将导致 "Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@633862d -> Value null",而像 ".containsKey(...)" 这样的调用将导致 "hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: org.jenkinsci.plugins.workflow.cps.EnvActionImpl.containsKey() is applicable for argument types: (java.lang.String) values: [...]"。 - Alexander Stohr
显示剩余2条评论
21个回答

6

在Windows系统和Unix系统中展示所有变量的方式不同,您可以定义一个函数来每次调用它。

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

我将首先调用此函数以显示所有管道脚本中的变量

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

4

包括系统和构建环境变量:

sh script: "printenv", label: 'print environment variables'

3

参考: https://www.jenkins.io/doc/pipeline/tour/environment/

环境是Jenkins流水线中的重要概念。它提供了一个用于设置,管理和共享环境变量的方法。环境可以被定义为流水线全局环境或阶段级别环境。环境变量可以在整个流水线中使用,并且可以按需进行覆盖。通过正确地使用环境,您可以确保流水线在各种运行时情况下都能正常工作。

node {
    sh 'printenv'
}

3
您可以使用sh 'printenv'
 stage('1') {
    sh "printenv" 
 }

3

由于新的管道语法,上面的回答现在已经过时。下面打印出环境变量。

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

        for(String vars: envs){
            println(vars)
        }
    }

1
  1. 你需要将它放在脚本块中。
  2. 他们正在废弃“Groovy风格”的循环。
- Eddie
使用闭包的 for 循环如果没有 @NonCPS 注释也会导致问题。 - drewish

2
您可以从Jenkins实例中获取所有变量。只需访问以下链接:
  • ${jenkins_host}/env-vars.html
  • ${jenkins_host}/pipeline-syntax/globals

请注意保留HTML标签,此处无需解释。

2

如果您真的想循环遍历env列表,只需执行以下操作:

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

2
我发现这是最简单的方法:
pipeline {
    agent {
        node {
            label 'master'
        }
    }   
    stages {
        stage('hello world') {
            steps {
                sh 'env'
            }
        }
    }
}

1

我猜你需要以脚本的形式来获取这个列表,但如果其他人只是想通过Jenkins GUI查看,那么可以在每个构建的上下文左侧菜单中选择“环境变量”部分找到该列表。

选择项目 => 选择构建 => 环境变量

enter image description here


3
这并非总是可用的。 - shuckc
3
我认为这在Jenkinsfiles中根本不可用。截图看起来像自由风格构建。 - Jakub Bochenski

1
如果我们不想分配节点,而是打印环境变量,这个方法可以帮助我们:
print env.getEnvironment()

测试于Jenkins版本:Jenkins 2.426.1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接