Jak wyświetlić listę wszystkich właściwości „env” w zadaniu Jenkins pipeline?


106

Biorąc pod uwagę potok kompilacji Jenkins 2.1, Jenkins wstrzykuje envzmienną do node{}. Na przykład BRANCH_NAMEmożna uzyskać do niego dostęp za pomocą

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

Chcę powtórzyć wszystkie env właściwości w potoku Jenkinsa

... biorąc pod uwagę, że nie znam wszystkich nieruchomości z wyprzedzeniem.

Szukam kodu takiego jak

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

co mogłoby brzmieć jak echo

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

env to mapa. Czy próbowałeś normalnej iteracji? like - env.each {println it}
Jayan


3
Afaik env po prostu hermetyzuje zmienne środowiskowe. Nie sądzę, żebyś mógł przez to przejść. Wypróbuj „sh env” w systemie Linux / „zestaw bat” w systemie Windows.
Dominik Gebhart

1
@Renato @Jayan na mój komentarz poniżej, env.each { name, value -> println "Name: $name -> Value $value" }drukuje Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979

1
@ JamesThomasMoon1979 To dlatego, że Pipeline łamie zamknięcia Groovy. Jeśli poprawisz to w starym stylu Java (to znaczy new ClassName() { ... }), powinno działać. Lub uruchamiasz go na metodzie oznaczonej tagiem @NonCPS, wtedy zamknięcia również będą działać w tym.
Daniel C. Sobral

Odpowiedzi:



82

Według dokumentacji Jenkinsa dla deklaratywnego rurociągu :

sh 'printenv'

Dla Jenkinsa potoku skryptowego :

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

Powyższe również sortuje zmienne środowiska dla wygody.


1
printenvto po prostu polecenie powłoki, które wyświetla środowisko, nic specyficznego dla Jenkinsa. Bez argumentów jest równoważne envbez argumentów. Jestem prawie pewien sh 'printenv | sort', że będzie działać w DCL lub skrypcie.
simon.watts

Przetestowane i sh 'printenv | sort'faktycznie działa dla deklaratywnego potoku Jenkinsa; fwiw sh 'env | sort'również działa (oba testowane na Jenkins w wersji 2.46.1). Pierwotnie wspomniałem o tym, sh 'printenv'ponieważ było to przywoływane w oficjalnej dokumentacji Jenkinsa.
Wimateeka

1
Jeśli zgubisz returnStdout: true, to nie potrzebujesz echa; To tylko drukowanie tego, co już wydrukował skrypt powłoki.
Ed Randall

26

Następujące prace:

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

Zauważ, że najprawdopodobniej zakończy się niepowodzeniem przy pierwszym uruchomieniu i będzie wymagać zatwierdzenia różnych świetnych metod do uruchomienia w piaskownicy jenkinsa. Odbywa się to w „zarządzaniu jenkinsem / zatwierdzaniu skryptu w procesie”

Lista, którą otrzymałem:

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • NUMER KOMPILACJI
  • BUILD_TAG
  • BUILD_URL
  • CLASSPATH
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • NAZWA PRACY
  • JOB_URL

1
To nie działa:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
oktawski

5
Czy upewniłeś się o dołączeniu @NonCPS?
Joe C.

1
To najlepsza odpowiedź, ponieważ będzie działać poza blokiem węzłów . Wielkie dzięki za to.
Gi0rgi0s

15

Możesz osiągnąć wynik za pomocą sh/ batstep i readFile:

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

Niestety env.getEnvironment()zwraca bardzo ograniczoną mapę zmiennych środowiskowych.


1
sh 'env > env.txt'działa dobrze i zawiera zmienne środowiskowe utworzone przez proces powłoki. env.getEnvironment()pokazuje tylko zmienne środowiskowe zestawu Jenkinsa, które są podzbiorem zmiennych widocznych w sh 'env'technice. Wymaga również zatwierdzenia bezpieczeństwa skryptu method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment. env.each { name, value -> println "Name: $name -> Value $value" }Zalecane przez @Renato @Jayan tylko drukuje Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979

Miły!!! Możliwość wydrukowania wszystkich zmiennych środowiskowych pomogła mi odkryć, że w Jenkins 2 zmienna JOB_BASE_NAME zawiera nazwę zadania bez folderu, w którym się znajduje.
Bill Agee

wersja działająca w systemie Windows byłaby również niesamowita :)
Bas Hamer

@Bas Hamer w wersji dla systemu Windows spróbuj zamienić „sh” na „bat”
Sebastien

2
Daje mi błąd java.lang.UnsupportedOperationException: Wywołanie publicznego statycznego java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.lang.Object, groovy.lang.Closure) na zamknięciu przekształconym przez CPS nie jest jeszcze obsługiwane (JENKINS-26481); hermetyzować w metodzie @NonCPS lub używać pętli w stylu Java
Ben Mathews,

12

Po co ta cała komplikacja?

sh 'env'

robi to, czego potrzebujesz (pod * nix)


Do wykonania tego potrzebny jest blok węzła. W moim przypadku muszę przetworzyć, jakie środowisko będzie miał węzeł, a następnie podkręcić węzeł w oparciu o określone kryteria.
Bill Warner

10

Oto krótki skrypt, który możesz dodać jako zadanie potoku, aby wyświetlić wszystkie zmienne środowiskowe:

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

Spowoduje to wyświetlenie zarówno zmiennych systemowych, jak i zmiennych Jenkinsa.


9

Międzyplatformowy sposób wyświetlania wszystkich zmiennych środowiskowych:

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

7

Używam wtyczki Blue Ocean i nie podobało mi się, że każdy wpis środowiska otrzymuje swój własny blok. Chcę jeden blok ze wszystkimi liniami.

Słabo drukuje:

sh 'echo `env`'

Słabo drukuje:

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

Dobrze się drukuje:

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

Dobrze się drukuje: (jak wspomniał @mjfroehlich)

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

3

Powyższe odpowiedzi są teraz przestarzałe z powodu nowej składni potoku. Poniżej wypisuje zmienne środowiskowe.

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

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

1
1. Musisz mieć to w bloku skryptu. 2. Deprecjonują pętlę w stylu „groovy”.
Eddie

forZ zamknięciem będzie również powodować problemy bez @NonCPSadnotacji.
drewish

2

W czystej Groovy rozwiązania, które czytają globalną envzmienną nie wydrukować wszystkie zmienne środowiskowe (np tracą zmienne z environmentbloku, z withEnvkontekstu i najbardziej zmiennych maszynowego specyficznych od OS). Za pomocą kroków powłoki można uzyskać bardziej kompletny zestaw, ale wymaga to rozszerzenianode kontekstu, który nie zawsze jest potrzebny.

Oto rozwiązanie, które używa getContextkroku do pobrania i wydrukowania pełnego zestawu zmiennych środowiskowych, w tym parametrów potoku, dla bieżącego kontekstu.

Uwaga: nie działa w piaskownicy Groovy. Możesz go jednak używać z zaufanej biblioteki współdzielonej.

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

1

jeśli naprawdę chcesz przeglądać envlistę, po prostu zrób:

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

0

inny sposób na uzyskanie dokładnie tego wyniku, o którym mowa w pytaniu:

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

Można to łatwo rozszerzyć, aby utworzyć mapę z podzbiorem zmiennych środowiskowych pasujących do kryteriów:

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

Przypuszczam, że potrzebowałeś tego w formie skryptu, ale jeśli ktoś inny chce tylko rzucić okiem na GUI Jenkinsa, tę listę można znaleźć, wybierając sekcję "Zmienne środowiskowe" w menu kontekstowym po lewej stronie każdej kompilacji. Wybierz projekt = > Wybierz build => Zmienne środowiskowe

wprowadź opis obrazu tutaj


2
Nie zawsze jest to dostępne.
shuckc

1
Myślę, że w ogóle nie jest dostępny dla Jenkinsfiles. Zrzut ekranu wygląda jak wersja freestyle.
Jakub Bochenski

0

Uważam, że jest to najłatwiejszy sposób:

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

-1

Możesz pobrać wszystkie zmienne z instancji jenkins. Po prostu odwiedź:

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / pipeline-syntax / globals
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.