如何列出jenkins管道作业中的所有`env`属性?

Jam*_*979 88 groovy jenkins jenkins-pipeline

鉴于jenkins 2.1构建管道,jenkins将一个env变量注入到node{}.例如,BRANCH_NAME可以使用

node {
    echo ${env.BRANCH_NAME}
    ...
Run Code Online (Sandbox Code Playgroud)

我想回显jenkins管道中的所有 env属性.

我正在寻找像这样的代码

node {
    for(e in env){
        echo e + " is " + ${e}
    }
    ...
Run Code Online (Sandbox Code Playgroud)

这会像回应一样

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...
Run Code Online (Sandbox Code Playgroud)

小智 79

另一种更简洁的方式:

node {
    echo sh(returnStdout: true, script: 'env')
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 在Windows下将`sh`替换为`bat`,将`env`替换为`set`. (17认同)

Wim*_*eka 72

根据Jenkins声明性管道文档:

sh 'printenv'
Run Code Online (Sandbox Code Playgroud)

对于Jenkins 脚本管道:

echo sh(script: 'env|sort', returnStdout: true)
Run Code Online (Sandbox Code Playgroud)

为方便起见,上面还对您的env vars进行了排序.

  • `printenv` 只是一个打印环境的 shell 命令,与 Jenkins 无关。没有参数它相当于没有参数的 `env`。我很确定`sh'printenv | sort'` 将在 DCL 或脚本管道中工作。 (4认同)
  • 已测试并`sh'printenv | sort'` 实际上适用于 Jenkins 声明性管道;fwiw `sh 'env | sort'` 也可以工作(都在 Jenkins 版本 2.46.1 上进行了测试)。我最初提到“sh 'printenv'”是因为它在 Jenkins 官方文档中被引用。 (2认同)

Omr*_*tor 20

以下作品:

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

请注意,它很可能在第一次执行时失败,并且需要您批准各种groovy方法才能在jenkins沙箱中运行.这是在"管理jenkins /进程内脚本批准"中完成的

我得到的清单包括:

  • 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

  • 你确定要包括`@ NonCPS`吗? (5认同)
  • 这不是一个好的解决方案,“env.getEnvironment()”未列入白名单,不能在管道脚本中使用:“org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:不允许脚本使用方法 org.jenkinsci.plugins.workflow.support” .actions.EnvironmentAction getEnvironment`。 (2认同)

luk*_*a5z 14

您可以使用sh/ bat步骤完成结果readFile:

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

不幸的是,env.getEnvironment()返回非常有限的环境变量图.

  • `sh 'env > env.txt'` 运行良好,包括由 shell 进程创建的环境变量。`env.getEnvironment()` 仅显示 Jenkins 设置的环境变量,它们是在 `sh 'env'` 技术中看到的环境变量的一个子集。此外,它需要脚本安全批准`method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment`。@Renato @Jayan 推荐的 `env.each { name, value -> println "Name: $name -> Value $value" }` 只打印 `Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee - > 值为空`。 (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风格的循环 (2认同)

And*_*tov 10

为什么这么复杂?

sh 'env'
Run Code Online (Sandbox Code Playgroud)

做你需要的(在* nix下)

  • 这需要一个节点块来执行。对于我的用例,我需要处理节点将具有的环境,然后根据某些标准启动节点。 (2认同)

Dan*_*iel 9

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

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

这将列出系统和Jenkins变量.


zet*_*t42 7

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

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

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

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


Jon*_*sen 6

我使用Blue Ocean插件并不喜欢每个环境条目都有自己的块.我想要一个包含所有线条的块.

打印效果不佳:

sh 'echo `env`'
Run Code Online (Sandbox Code Playgroud)

打印效果不佳:

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

打印好:

sh 'env > env.txt'
sh 'cat env.txt'
Run Code Online (Sandbox Code Playgroud)

打印得很好:(如@mjfroehlich所述)

echo sh(script: 'env', returnStdout: true)
Run Code Online (Sandbox Code Playgroud)


小智 6

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

def showSystemVariables(){    
   if(isUnix()){
     sh 'env'
   } else {
     bat 'set'
   }
}
Run Code Online (Sandbox Code Playgroud)

我将首先调用此函数来显示所有 pipline 脚本中的所有变量

stage('1. Show all variables'){
     steps {
         script{            
              showSystemVariables()
         }
     }
} 
Run Code Online (Sandbox Code Playgroud)


Muh*_*oof 6

最简单快捷的方法是使用以下 url 打印所有环境变量

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


Ter*_*rry 5

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

if (isUnix()) {
    sh env
}
else {
    bat set
}
Run Code Online (Sandbox Code Playgroud)