如何在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个回答

0

另一种获得问题中提到的确切输出的方法:

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

这可以轻松地扩展为使用符合条件的一部分环境变量构建地图:

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}

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