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
 ...

env ist eine Karte. Haben Sie eine normale Iteration versucht? like - env.each {println it}
Jayan


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.


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

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.


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)


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.


9

Plattformübergreifende Auflistung aller Umgebungsvariablen:

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

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)

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)
        }
    }

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')

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"
}

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}

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


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'
            }
        }
    }
}

-1

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

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / Pipeline-Syntax / Globals
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.