如何在詹金斯管道作业中列出所有`env`属性?


104

给定了jenkins 2.1构建管道,jenkins将env变量注入node{}。例如,BRANCH_NAME可以通过

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

我想回显詹金斯管道内的所有 env属性

...考虑到我不知道所有物业提前。

我正在寻找类似的代码

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

这会回声类似

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

env是一张地图。您是否尝试过普通迭代?像-env.each {println it}
Jayan


3
Afaik env只是封装了环境变量。我不认为您可以遍历它。在linux上尝试使用“ sh env”,在Windows上尝试使用“ bat set”。
Dominik Gebhart's

1
@Renato @Jayan根据我在下面的评论进行env.each { name, value -> println "Name: $name -> Value $value" }打印Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null
JamesThomasMoon1979年

1
@ JamesThomasMoon1979那是因为管道中断了Groovy的关闭。如果您使用的是旧Java风格(即new ClassName() { ... }),则应该可以使用。或者,您可以在标记为的方法上运行它@NonCPS,然后闭包也将在其中运行。
Daniel C. Sobral

Answers:



80

根据詹金斯声明式管道文档

sh 'printenv'

对于Jenkins 脚本化管道

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

为了方便起见,上面也对环境变量进行了排序。


1
printenv只是一个可打印环境的shell命令,没有Jenkins特有的命令。没有参数就相当于env没有参数。我很确定sh 'printenv | sort'可以在DCL或脚本化管道中使用。
simon.watts

经过测试,sh 'printenv | sort'实际上对Jenkins声明式管道有效;fwiw sh 'env | sort'也可以工作(两者都在Jenkins 2.46.1版上进行了测试)。我最初提到sh 'printenv'它是因为Jenkins官方文档中已引用了它。
Wimateeka '18年

1
如果您丢失了returnStdout:true,则不需要回显。它只是打印shell脚本已经打印的内容。
Ed Randall

25

以下作品:

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

请注意,它极有可能在首次执行时失败,并且需要您批准各种常规方法才能在jenkins沙箱中运行。这是在“管理詹金斯/进程内脚本批准”中完成的

我得到的清单包括:

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • BUILD_NUMBER
  • BUILD_TAG
  • BUILD_URL
  • 类路径
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • JOB_NAME
  • JOB_URL

1
这不起作用:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
octavian

5
您确定要包含@NonCPS吗?
Joe C.

1
这是最佳答案,因为它将在节点块之外运行。非常感谢。
Gi0rgi0s

15

您可以使用sh/ batstep和完成结果readFile

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

不幸的是env.getEnvironment()返回的环境变量映射非常有限。


1
sh 'env > env.txt'可以很好地工作,并包含由Shell进程创建的环境变量。env.getEnvironment()仅显示了詹金斯集环境变量,该变量是sh 'env'技术中所见变量的子集。另外,还需要脚本安全批准method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment。在env.each { name, value -> println "Name: $name -> Value $value" }通过@Renato @Jayan建议只打印Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null
JamesThomasMoon1979年

很好!!! 如果能够打印所有ENV乏帮我发现詹金斯2套一JOB_BASE_NAME变种中包含的作业名称SANS它生活在该文件夹。
比尔·阿吉

在Windows上运行的版本也会很棒:)
Bas Hamer

Windows版本的@Bas Hamer尝试将“ sh”替换为“ bat”
塞巴斯蒂安

2
给我一个错误java.lang.UnsupportedOperationException:在经过CPS转换的闭包上调用public static java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each(java.lang.Object,groovy.lang.Closure)不是尚未支持(JENKINS-26481); 封装在@NonCPS方法中,或使用Java样式的循环
Ben Mathews


10

您可以将以下快速脚本添加为管道作业,以列出所有环境变量:

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

这将同时列出系统变量和詹金斯变量。


9

列出所有环境变量的跨平台方式:

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

7

我使用Blue Ocean插件,不喜欢每个环境条目都有自己的块。我想要一个与所有的线块。

打印效果不佳:

sh 'echo `env`'

打印效果不佳:

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

打印效果良好:

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

打印效果良好:(如@mjfroehlich所述)

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

3

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

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

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

1
1.您需要将其放在脚本块中。2.他们正在贬低“时髦风格”循环。
艾迪(Eddie)

for与闭合也会导致没有问题的@NonCPS注解。
提请

2

读取全局变量的纯Groovy解决方案env不会打印所有环境变量(例如,它们是environment块中,withEnv上下文中缺少的变量以及OS中大多数机器特定的变量)。使用shell步骤可以得到更完整的集合,但这需要node上下文,但并非总是如此。

这是一个解决方案,使用以下getContext步骤来检索和打印当前上下文的完整环境变量集,包括管道参数。

注意:在Groovy沙箱中不起作用。不过,您可以从受信任的共享库中使用它。

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

1

如果您真的想遍历env列表,请执行以下操作:

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

0

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

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

这可以很容易地扩展为使用匹配条件的env var子集构建地图:

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}

0

我想您以脚本的形式需要它,但是如果其他人只想通过Jenkins GUI进行浏览,则可以通过在每个构建的上下文左菜单中选择“环境变量”部分来找到该列表。 >选择构建=>环境变量

在此处输入图片说明


2
这并不总是可用。
shuckc

1
我认为它根本不适用于Jenkinsfiles。屏幕截图看起来像是自由样式的版本。
Jakub Bochenski

0

我发现这是最简单的方法:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.