Wie liste ich alle "env" -Eigenschaften innerhalb des Jenkins-Pipeline-Jobs auf?

104

Bei einer Build-Pipeline von Jenkins 2.1 injiziert Jenkins eine envVariable in die node{}. Zum Beispiel BRANCH_NAMEkann mit zugegriffen werden

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

Ich möchte alle env Eigenschaften innerhalb der Jenkins-Pipeline wiedergeben

... wenn man bedenkt, dass ich nicht alle Eigenschaften im Voraus kenne .

Ich suche nach Code wie

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

das würde so etwas wie widerhallen

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...
JamesThomasMoon1979
quelle
env ist eine Karte. Haben Sie eine normale Iteration versucht? like - env.each {println it}
Jayan
3
Sieht aus wie ein Duplikat von stackoverflow.com/questions/36836806/…
Krzysztof Krasoń
3
Afaik env kapselt nur die Umgebungsvariablen. Ich glaube nicht, dass Sie es durchlaufen können. Versuchen Sie 'sh env' unter Linux / 'bat set' unter Windows.
Dominik Gebhart
1
@ Renato @ Jayan laut meinem Kommentar unten, env.each { name, value -> println "Name: $name -> Value $value" }druckt Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979
1
@ JamesThomasMoon1979 Das liegt daran, dass die Pipeline die Groovy-Verschlüsse bricht. Wenn Sie es im alten Java-Stil korrigieren (das heißt new ClassName() { ... }), sollte es funktionieren. Oder Sie führen es mit einer gekennzeichneten Methode aus @NonCPS, dann funktionieren die Verschlüsse auch darin.
Daniel C. Sobral

Antworten:

80

Laut Jenkins Dokumentation für deklarative Pipeline :

sh 'printenv'

Für Jenkins Skript-Pipeline :

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

Das Obige sortiert auch Ihre Umgebungsvariablen für die Bequemlichkeit.

Wimateeka
quelle
1
printenvist nur ein Shell-Befehl, der die Umgebung druckt, nichts spezielles für Jenkins. Ohne Argumente ist es gleichbedeutend mit envohne Argumente. Ich bin mir ziemlich sicher, dass sh 'printenv | sort'es in DCL oder einer Skript-Pipeline funktioniert.
simon.watts
Getestet und sh 'printenv | sort'funktioniert tatsächlich für eine deklarative Jenkins-Pipeline; fwiw sh 'env | sort'funktioniert auch (beide getestet auf Jenkins Version 2.46.1). Ich habe es ursprünglich erwähnt, sh 'printenv'weil es in der offiziellen Jenkins-Dokumentation erwähnt wurde.
Wimateeka
1
Wenn Sie den returnStdout: true verlieren, benötigen Sie das Echo nicht. Es wird nur gedruckt, was das Shell-Skript bereits gedruckt hat.
Ed Randall
25

Folgendes funktioniert:

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

Beachten Sie, dass es höchstwahrscheinlich bei der ersten Ausführung fehlschlägt und Sie verschiedene groovige Methoden genehmigen müssen, um in Jenkins Sandbox ausgeführt zu werden. Dies erfolgt unter "Verwalten der Genehmigung von Jenkins / In-Process-Skripten".

Die Liste, die ich bekommen habe, ist enthalten:

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • BUILD_NUMBER
  • BUILD_TAG
  • BUILD_URL
  • KLASSENPFAD
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • BERUFSBEZEICHNUNG
  • JOB_URL
Omri Spector
quelle
1
Dies funktioniert nicht:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
Octavian
5
Haben Sie sichergestellt, dass Sie die enthalten @NonCPS?
Joe C.
1
Dies ist die beste Antwort, da sie außerhalb eines Knotenblocks funktioniert . Vielen Dank dafür.
Gi0rgi0s
15

Sie können das Ergebnis mit sh/ batstep und erreichen readFile:

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

Leider wird nur eine env.getEnvironment()sehr begrenzte Karte von Umgebungsvariablen zurückgegeben.

luka5z
quelle
1
sh 'env > env.txt'funktioniert gut und enthält Umgebungsvariablen, die vom Shell-Prozess erstellt wurden. env.getEnvironment()zeigt nur die Jenkins-Set-Umgebungsvariablen, die eine Teilmenge der in der sh 'env'Technik beobachteten Variablen sind . Außerdem ist eine Genehmigung für die Skriptsicherheit erforderlich method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment. Das env.each { name, value -> println "Name: $name -> Value $value" }von @Renato @Jayan empfohlene wird nur gedruckt Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979
Nett!!! Durch das Drucken aller env-Variablen konnte ich feststellen, dass Jenkins 2 eine JOB_BASE_NAME-Variable festlegt, die den Jobnamen ohne den Ordner enthält, in dem sie sich befindet.
Bill Agee
Eine Version, die unter Windows funktioniert, wäre auch fantastisch :)
Bas Hamer
@ Bas Hamer für eine Windows-Version versuchen, "sh" durch "bat" zu ersetzen
Sebastien
2
Gibt mir einen Fehler java.lang.UnsupportedOperationException: Das Aufrufen der öffentlichen statischen Datei java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.lang.Object, groovy.lang.Closure) für einen CPS-transformierten Abschluss ist nicht möglich noch unterstützt (JENKINS-26481); Kapselung in eine @ NonCPS-Methode oder Verwendung von Java-Schleifen
Ben Mathews
12

Warum all diese Kompliziertheit?

sh 'env'

macht was du brauchst (unter * nix)

Andrey Regentov
quelle
Dies erfordert die Ausführung eines Knotenblocks. Für meinen Anwendungsfall muss ich verarbeiten, welche Umgebung der Knoten haben wird, und dann einen Knoten basierend auf bestimmten Kriterien hochfahren.
Bill Warner
10

Hier ist ein schnelles Skript, das Sie als Pipeline-Job hinzufügen können, um alle Umgebungsvariablen aufzulisten:

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

Dadurch werden sowohl System- als auch Jenkins-Variablen aufgelistet.

Daniel
quelle
9

Plattformübergreifende Auflistung aller Umgebungsvariablen:

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

Ich benutze das Blue Ocean Plugin und mochte nicht, dass jeder Umgebungseintrag einen eigenen Block bekommt. Ich möchte einen Block mit allen Zeilen.

Druckt schlecht:

sh 'echo `env`'

Druckt schlecht:

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

Druckt gut:

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

Druckt gut: (wie von @mjfroehlich erwähnt)

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

Die obigen Antworten sind aufgrund der neuen Pipeline-Syntax jetzt veraltet. Unten werden die Umgebungsvariablen ausgedruckt.

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

        for(String vars: envs){
            println(vars)
        }
    }
Eddie
quelle
1
1. Sie müssen es in einem Skriptblock haben. 2. Sie verlieren die 'Groovy Style'-Schleife.
Eddie
Das formit einem Verschluss verursacht auch Probleme ohne @NonCPSAnmerkung.
Zeichnen
2

Die reinen Groovy- Lösungen, die die globale envVariable lesen, drucken nicht alle Umgebungsvariablen (z. B. fehlen Variablen aus dem environmentBlock, aus dem withEnvKontext und den meisten maschinenspezifischen Variablen aus dem Betriebssystem). Mit Shell-Schritten ist es möglich, einen vollständigeren Satz zu erhalten, dies erfordert jedoch einen nodeKontext, der nicht immer erwünscht ist.

Hier ist eine Lösung, die den getContextSchritt verwendet, um den vollständigen Satz von Umgebungsvariablen einschließlich der Pipeline-Parameter für den aktuellen Kontext abzurufen und zu drucken.

Vorsichtsmaßnahme: Funktioniert nicht im Groovy-Sandkasten. Sie können es jedoch aus einer vertrauenswürdigen gemeinsam genutzten Bibliothek verwenden.

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

Wenn Sie die envListe wirklich durchlaufen möchten, gehen Sie einfach wie folgt vor :

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

Ein anderer Weg, um genau die in der Frage erwähnte Ausgabe zu erhalten:

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

Dies kann leicht erweitert werden, um eine Karte mit einer Teilmenge von Umgebungsvariablen zu erstellen, die einem Kriterium entsprechen:

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}
römisch
quelle
0

Ich nehme an, Sie brauchten das in Form eines Skripts, aber wenn jemand anderes nur einen Blick auf die Jenkins-GUI werfen möchte, können Sie diese Liste finden, indem Sie den Abschnitt "Umgebungsvariablen" im Kontextmenü jedes Builds auswählen. Wählen Sie project = > Wählen Sie build => Umgebungsvariablen

Geben Sie hier die Bildbeschreibung ein

claudod
quelle
2
Dies ist nicht immer verfügbar.
Shuckc
1
Ich glaube nicht, dass es für Jenkinsfiles überhaupt verfügbar ist. Screenshot sieht aus wie ein Freestyle-Build.
Jakub Bochenski
0

Ich fand, dass dies der einfachste Weg ist:

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

Sie können alle Variablen von Ihrer Jenkins-Instanz abrufen. Nur besuchen:

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / Pipeline-Syntax / Globals
Dmitriy Tarasevich
quelle