Como listar todas as propriedades `env` dentro do trabalho do pipeline jenkins?

105

Dado um pipeline de construção do jenkins 2.1, o jenkins injeta uma envvariável no node{}. Por exemplo, BRANCH_NAMEpode ser acessado com

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

Eu quero ecoar todas as env propriedades dentro do pipeline Jenkins

... considerando que não conheço todas as propriedades com antecedência.

Estou procurando um código como

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

que ecoaria algo como

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...
JamesThomasMoon1979
fonte
env é um mapa. Você tentou a iteração normal? like - env.each {println it}
Jayan
3
Parece uma duplicata de stackoverflow.com/questions/36836806/…
Krzysztof Krasoń
3
Afaik env apenas encapsula as variáveis ​​de ambiente. Eu não acho que você pode fazer um loop por isso. Tente 'sh env' no linux / 'bat set' no Windows.
Dominik Gebhart
1
@Renato @Jayan por meu comentário abaixo, env.each { name, value -> println "Name: $name -> Value $value" }imprime Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979
1
@ JamesThomasMoon1979 Isso ocorre porque o Pipeline quebra os fechamentos do Groovy. Se você acertar no estilo antigo do Java (isto é, new ClassName() { ... }), ele deve funcionar. Ou você o executa em um método marcado @NonCPS, então os fechamentos funcionarão dentro dele também.
Daniel C. Sobral

Respostas:

80

De acordo com a documentação do Jenkins para pipeline declarativo :

sh 'printenv'

Para pipeline com script Jenkins :

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

O item acima também classifica seus env vars por conveniência.

Wimateeka
fonte
1
printenvé apenas um comando shell que imprime o ambiente, nada específico do Jenkins. Sem argumentos, é equivalente a envsem argumentos. Tenho certeza sh 'printenv | sort'que funcionará em DCL ou pipeline com script.
simon.watts
Testado e de sh 'printenv | sort'fato funciona para um pipeline declarativo do Jenkins; fwiw sh 'env | sort'também funciona (ambos testados no Jenkins versão 2.46.1). Mencionei originalmente sh 'printenv'porque foi referenciado na documentação oficial do Jenkins.
Wimateeka de
1
Se você perder returnStdout: true, não precisará do echo; É apenas imprimir o que o script de shell já imprimiu.
Ed Randall
26

O seguinte funciona:

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

Observe que provavelmente falhará na primeira execução e exigirá a aprovação de vários métodos interessantes para execução no jenkins sandbox. Isso é feito em "gerenciar aprovação de script jenkins / em processo"

A lista que recebi incluída:

  • 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
Omri Spector
fonte
1
Isso não funciona:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
octavian
5
Você se certificou de incluir o @NonCPS?
Joe C.
1
Esta é a melhor resposta porque funcionará fora de um bloco de . Muito obrigado por isso.
Gi0rgi0s
15

Você pode obter o resultado usando sh/ batstep e readFile:

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

Infelizmente env.getEnvironment()retorna um mapa muito limitado de variáveis ​​de ambiente.

luka5z
fonte
1
sh 'env > env.txt'funciona bem e inclui variáveis ​​de ambiente criadas pelo processo do shell. env.getEnvironment()mostra apenas as variáveis ​​de ambiente do conjunto Jenkins que são um subconjunto daquelas vistas na sh 'env'técnica. Além disso, ele precisa da aprovação de segurança do script method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment. O env.each { name, value -> println "Name: $name -> Value $value" }recomendado por @Renato @Jayan apenas imprime Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979
Agradável!!! Ser capaz de imprimir todos os env vars me ajudou a descobrir que Jenkins 2 define que um JOB_BASE_NAME var contém o nome do trabalho sem a pasta em que ele reside.
Bill Agee
uma versão que funcionasse no Windows também seria incrível :)
Bas Hamer
@Bas Hamer para uma versão do Windows tente substituir "sh" por "bat"
Sebastien
2
Me dá um erro java.lang.UnsupportedOperationException: Chamar public static java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.lang.Object, groovy.lang.Closure) em um fechamento transformado CPS não é ainda com suporte (JENKINS-26481); encapsular em um método @NonCPS ou usar loops no estilo Java
Ben Mathews
12

Por que toda essa complexidade?

sh 'env'

faz o que você precisa (sob * nix)

Andrey Regentov
fonte
Isso requer um bloco de nó para ser executado. Para meu caso de uso, preciso processar qual ambiente o nó terá e, em seguida, girar um nó com base em certos critérios.
Bill Warner
10

Este é um script rápido que você pode adicionar como um trabalho de pipeline para listar todas as variáveis ​​de ambiente:

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

Isso listará as variáveis ​​do sistema e do Jenkins.

Daniel
fonte
9

Forma multiplataforma de listar todas as variáveis ​​de ambiente:

if (isUnix()) {
    sh env
}
else {
    bat set
}
Terry
fonte
7

Eu uso o plugin Blue Ocean e não gosto que cada entrada de ambiente receba seu próprio bloco. Eu quero um bloco com todas as linhas.

Imprime mal:

sh 'echo `env`'

Imprime mal:

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

Imprime bem:

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

Imprime bem: (como mencionado por @mjfroehlich)

echo sh(script: 'env', returnStdout: true)
Jon Lauridsen
fonte
3

As respostas acima agora são antiquadas devido à nova sintaxe do pipeline. Abaixo imprime as variáveis ​​de ambiente.

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

        for(String vars: envs){
            println(vars)
        }
    }
Eddie
fonte
1
1. Você precisa tê-lo em um bloco de script. 2. Eles estão depreciando o ciclo do 'estilo descolado'.
Eddie
O forcom um fechamento também causará problemas sem uma @NonCPSanotação.
desenhou
2

As soluções Groovy puras que lêem a envvariável global não imprimem todas as variáveis ​​de ambiente (por exemplo, elas estão faltando variáveis ​​doenvironment bloco, do withEnvcontexto e a maioria das variáveis ​​específicas da máquina do SO). Usando etapas de shell é possível obter um conjunto mais completo, mas isso requer um nodecontexto, o que nem sempre é desejado.

Aqui está uma solução que usa o getContext etapa para recuperar e imprimir o conjunto completo de variáveis ​​de ambiente, incluindo parâmetros de pipeline, para o contexto atual.

Advertência: não funciona na sandbox Groovy. Você pode usá-lo em uma biblioteca compartilhada confiável.

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

se você realmente deseja repetir a envlista, faça:

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

outra maneira de obter exatamente a saída mencionada na pergunta:

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

Isso pode ser facilmente estendido para construir um mapa com um subconjunto de env vars que correspondem a um critério:

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}
romano
fonte
0

Suponho que você precise disso na forma de um script, mas se alguém quiser apenas dar uma olhada na GUI do Jenkins, essa lista pode ser encontrada selecionando a seção "Variáveis ​​de ambiente" no menu contextual esquerdo de cada construção Selecionar projeto = > Selecione build => Variáveis ​​de Ambiente

insira a descrição da imagem aqui

Claudod
fonte
2
Isso nem sempre está disponível.
shuckc de
1
Não acho que esteja disponível para Jenkinsfiles. A captura de tela parece uma construção de estilo livre.
Jakub Bochenski
0

Achei que esta é a maneira mais fácil:

pipeline {
    agent {
        node {
            label 'master'
        }
    }   
    stages {
        stage('hello world') {
            steps {
                sh 'env'
            }
        }
    }
}
Prosenjit Sen
fonte
-1

Você pode obter todas as variáveis ​​de sua instância jenkins. Basta visitar:

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / pipeline-syntax / globals
Dmitriy Tarasevich
fonte