如何列出所有的‘ env’属性在詹金斯管道作业?

给定一个 jenkins 构建管道,jenkins 将一个变量 env注入到 node{}中。

我想在 Jenkins 管道中打印 所有 env属性。但是,我不知道 所有 env属性提前时间。

例如,环境变量 BRANCH_NAME可以用代码打印

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

但是,我不能提前知道所有的变量,我需要处理这些变量的代码,比如

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

这会引起类似

 BRANCH_NAME is myBranch2
CHANGE_ID is 44
...

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

225648 次浏览

你可以使用 sh/bat步骤和 readFile:

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

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

以下作品:

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

请注意,它很可能在第一次执行时失败,并且需要您批准在 jenkins 沙箱中运行各种 Groovy 方法。这是在“管理 jenkins/in-process 脚本审批”中完成的

我得到的名单包括:

  • BUILD _ display _ Name
  • BUILD _ ID
  • BUILD _ Number
  • BUILD _ TAG
  • BUILD _ URL
  • CLASSPATH
  • HUDSON _ Home
  • 服务器
  • HUDSON _ URL
  • 饼干
  • JENKINS _ URL
  • JOB _ BASE _ NAME
  • 工作 _ 名称
  • JOB _ URL

另一种更简洁的方式是:

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

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

由于新的管道语法,上面的答案现在已经过时了。

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


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

我使用蓝色海洋插件,不喜欢每个环境条目得到自己的块。我要所有线路的 模块。

指纹不清晰:

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'

打印良好: (如@mjfreehlich 提到的)

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

根据 詹金斯的文件声明性管道声明性管道的说法:

sh 'printenv'

对于詹金斯 脚本管道:

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

为了方便起见,上面还对您的 env vars 进行了分类。

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

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

这可以很容易地扩展到构建一个带有匹配条件的 env vars 子集的 map:

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}

下面是一个可以作为管道作业添加的快速脚本,用于列出所有环境变量:

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

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

我认为你需要一个脚本,但是如果其他人只是想通过 Jenkins GUI 看一看,那么你可以在每个构建的上下文左边菜单中选择“ Environment Variables”部分来找到这个列表 选择 project = > Select build = > Environment Variables

enter image description here

为什么这么复杂?

sh 'env'

做你需要的(在 * nix 下)

如果你真的想在 env列表上循环,只要做:

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

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

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

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

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

警告: 不能在 Groovy 沙箱中工作,但是你可以从一个可信的共享库中使用它。

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

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

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

你可以从你的 Jenkins 实例中得到所有的变量,只需访问:

  • ${ jenkins _ host }/env-vars. html
  • ${ jenkins _ host }/管道-语法/全局变量

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

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

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

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

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

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

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

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

你可以使用 sh 'printenv'

 stage('1') {
sh "printenv"
}