Come elencare tutte le proprietà `env` all'interno del lavoro della pipeline di jenkins?


105

Data una pipeline di build 2.1 di jenkins, jenkins inietta una envvariabile nel file node{}. Ad esempio, è BRANCH_NAMEpossibile accedervi con

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

Voglio fare l'eco di tutte le env proprietà all'interno della pipeline di jenkins

... considerando che non conosco tutte le proprietà in anticipo.

Sto cercando un codice come

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

che farebbe eco qualcosa di simile

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

env è una mappa. Hai provato l'iterazione normale? like - env.each {println it}
Jayan

3
Si presenta come un duplicato di stackoverflow.com/questions/36836806/...
Krzysztof Krason

3
Afaik env incapsula semplicemente le variabili d'ambiente. Non penso che tu possa passare attraverso di esso. Prova 'sh env' su linux / 'bat set' su Windows.
Dominik Gebhart

1
@Renato @Jayan per il mio commento qui sotto, env.each { name, value -> println "Name: $name -> Value $value" }stampe Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979

1
@ JamesThomasMoon1979 Questo perché Pipeline interrompe le chiusure di Groovy. Se lo fai nel vecchio stile Java (cioè new ClassName() { ... }), dovrebbe funzionare. Oppure lo esegui su un metodo etichettato @NonCPS, quindi le chiusure funzioneranno anche all'interno.
Daniel C. Sobral

Risposte:



80

Secondo la documentazione di Jenkins per la pipeline dichiarativa :

sh 'printenv'

Per la pipeline con script di Jenkins :

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

Quanto sopra ordina anche i tuoi env vars per comodità.


1
printenvè solo un comando di shell che stampa l'ambiente, niente di specifico di Jenkins. Senza argomenti equivale a envsenza argomenti. Sono abbastanza sicuro sh 'printenv | sort'che funzionerà in DCL o pipeline con script.
simon.watts

Testato e sh 'printenv | sort'in effetti funziona per una pipeline dichiarativa Jenkins; Anche fwiw sh 'env | sort'funziona (entrambi testati su Jenkins ver. 2.46.1). L'ho menzionato originariamente sh 'printenv'perché si faceva riferimento nella documentazione ufficiale di Jenkins.
Wimateeka

1
Se perdi returnStdout: true, non hai bisogno dell'eco; Sta solo stampando ciò che lo script di shell ha già stampato.
Ed Randall

26

I seguenti lavori:

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

Nota che molto probabilmente fallirà alla prima esecuzione e richiederà l'approvazione di vari metodi groovy per l'esecuzione nella sandbox jenkins. Questa operazione viene eseguita in "Gestisci jenkins / approvazione script in-process"

L'elenco che ho ricevuto includeva:

  • BUILD_DISPLAY_NAME
  • ID build
  • BUILD_NUMBER
  • BUILD_TAG
  • BUILD_URL
  • CLASSPATH
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • NOME DEL LAVORO
  • JOB_URL

1
Questo non funziona:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
ottaviano

5
Ti sei assicurato di includere il @NonCPS?
Joe C.

1
Questa è la risposta migliore perché funzionerà al di fuori di un blocco di nodi . Grazie mille per questo.
Gi0rgi0s

15

Puoi ottenere il risultato usando sh/ batstep e readFile:

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

Purtroppo env.getEnvironment()restituisce una mappa molto limitata delle variabili d'ambiente.


1
sh 'env > env.txt'funziona bene e include variabili d'ambiente create dal processo della shell. env.getEnvironment()mostra solo le variabili d'ambiente dell'insieme di Jenkins che sono un sottoinsieme di quello visto nella sh 'env'tecnica. Inoltre, necessita dell'approvazione della sicurezza dello script method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment. Il env.each { name, value -> println "Name: $name -> Value $value" }consigliato da @Renato @Jayan stampa solo Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979

Bello!!! Essere in grado di stampare tutte le variabili env mi ha aiutato a scoprire che Jenkins 2 imposta una var JOB_BASE_NAME che contiene il nome del lavoro senza la cartella in cui risiede.
Bill Agee,

una versione che funziona anche su Windows sarebbe fantastica :)
Bas Hamer,

@Bas Hamer per una versione Windows prova a sostituire "sh" con "bat"
Sebastien

2
Mi dà un errore java.lang.UnsupportedOperationException: la chiamata statica pubblica java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.lang.Object, groovy.lang.Closure) su una chiusura trasformata da CPS non lo è ancora supportato (JENKINS-26481); incapsulare in un metodo @NonCPS o utilizzare loop in stile Java
Ben Mathews

12

Perché tutta questa complicità?

sh 'env'

fa quello che ti serve (sotto * nix)


Ciò richiede un blocco del nodo per essere eseguito. Per il mio caso d'uso, ho bisogno di elaborare quale ambiente avrà il nodo, quindi avviare un nodo in base a determinati criteri.
Bill Warner,

10

Ecco uno script veloce che puoi aggiungere come processo di pipeline per elencare tutte le variabili di ambiente:

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

Questo elencherà sia le variabili di sistema che quelle di Jenkins.


9

Modo multipiattaforma per elencare tutte le variabili d'ambiente:

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

7

Uso il plug-in Blue Ocean e non mi piaceva che ogni voce di ambiente ricevesse il proprio blocco. Ne voglio uno blocco con tutte le linee.

Stampa male:

sh 'echo `env`'

Stampa male:

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

Stampa bene:

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

Stampa bene: (come menzionato da @mjfroehlich)

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

3

Le risposte precedenti sono ormai antiquate a causa della nuova sintassi della pipeline. Di seguito vengono stampate le variabili d'ambiente.

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

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

1
1. È necessario averlo in un blocco di script. 2. Stanno svalutando il loop dello "stile groovy".
Eddie

Il forcon una chiusura causerà anche problemi senza @NonCPSun'annotazione.
dissipato

2

Le soluzioni Groovy pure che leggono la envvariabile globale non stampano tutte le variabili d'ambiente (ad esempio mancano le variabili dal environmentblocco, dal withEnvcontesto e la maggior parte delle variabili specifiche della macchina dal sistema operativo). Utilizzando i passaggi della shell è possibile ottenere un set più completo, ma ciò richiede un filenode contesto, che non è sempre desiderato.

Ecco una soluzione che utilizza il getContextpassaggio per recuperare e stampare il set completo di variabili di ambiente, inclusi i parametri della pipeline, per il contesto corrente.

Avvertenza: non funziona nella sandbox di Groovy. Puoi usarlo da una libreria condivisa affidabile.

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

1

se vuoi davvero scorrere l' envelenco basta fare:

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

0

un altro modo per ottenere esattamente l'output menzionato nella domanda:

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

Questo può essere facilmente esteso per costruire una mappa con un sottoinsieme di env var che corrispondono a un criterio:

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

Suppongo che tu ne abbia bisogno sotto forma di script, ma se qualcun altro vuole solo dare un'occhiata alla GUI di Jenkins, quell'elenco può essere trovato selezionando la sezione "Variabili d'ambiente" nel menu contestuale a sinistra di ogni build Seleziona progetto = > Seleziona build => Variabili d'ambiente

inserisci qui la descrizione dell'immagine


2
Questo non è sempre disponibile.
shuckc

1
Non credo sia affatto disponibile per Jenkinsfiles. Lo screenshot sembra una build freestyle.
Jakub Bochenski

0

Ho scoperto che questo è il modo più semplice:

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

-1

Puoi ottenere tutte le variabili dalla tua istanza di jenkins. Basta visitare:

  • $ {} Jenkins_host /env-vars.html
  • $ {} Jenkins_host / gasdotto-sintassi / globali
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.