Comment lister toutes les propriétés `env` dans le travail de pipeline Jenkins?


105

Étant donné un pipeline de construction jenkins 2.1, jenkins injecte une envvariable dans le fichier node{}. Par exemple, BRANCH_NAMEaccessible avec

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

Je veux faire écho à toutes les env propriétés du pipeline jenkins

... considérant que je ne connais pas toutes les propriétés à l'avance.

Je recherche du code comme

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

qui ferait écho à quelque chose comme

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

env est une carte. Avez-vous essayé l'itération normale? like - env.each {println it}
Jayan


3
Afaik env encapsule simplement les variables d'environnement. Je ne pense pas que vous puissiez le parcourir. Essayez 'sh env' sous linux / 'bat set' sous Windows.
Dominik Gebhart

1
@Renato @Jayan par mon commentaire ci-dessous, env.each { name, value -> println "Name: $name -> Value $value" }imprime Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979

1
@ JamesThomasMoon1979 C'est parce que Pipeline rompt les fermetures Groovy. Si vous corrigez le style ancien Java (c'est-à-dire new ClassName() { ... }), cela devrait fonctionner. Ou vous l'exécutez sur une méthode étiquetée @NonCPS, les fermetures fonctionneront également à l'intérieur.
Daniel C.Sobral

Réponses:



81

Selon la documentation Jenkins pour le pipeline déclaratif :

sh 'printenv'

Pour le pipeline scripté Jenkins :

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

Ce qui précède trie également vos variables d'environnement pour plus de commodité.


1
printenvest juste une commande shell qui imprime l'environnement, rien de spécifique à Jenkins. Sans arguments, cela équivaut à envsans arguments. Je suis presque sûr que sh 'printenv | sort'cela fonctionnera dans DCL ou pipeline scripté.
simon.watts

Testé et sh 'printenv | sort'fonctionne en fait pour un pipeline déclaratif Jenkins; fwiw sh 'env | sort'fonctionne également (tous deux testés sur Jenkins ver. 2.46.1). Je l'ai mentionné à l'origine sh 'printenv'parce qu'il était référencé dans la documentation officielle de Jenkins.
Wimateeka

1
Si vous perdez le returnStdout: true, vous n'avez pas besoin de l'écho; Il s'agit simplement d'imprimer ce que le script shell a déjà imprimé.
Ed Randall

26

Les travaux suivants:

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

Notez que cela échouera très probablement lors de la première exécution et que vous devrez approuver diverses méthodes groovy pour s'exécuter dans le sandbox jenkins. Cela se fait dans "gérer jenkins / approbation des scripts en cours de processus"

La liste que j'ai incluse:

  • 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
  • NOM DU TRAVAIL
  • JOB_URL

1
Cela ne fonctionne pas:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
octave

5
Vous êtes-vous assuré d'inclure le @NonCPS?
Joe C.

1
C'est la meilleure réponse car elle fonctionnera en dehors d'un bloc de nœuds . Merci beaucoup pour cela.
Gi0rgi0s

15

Vous pouvez obtenir le résultat en utilisant sh/ batstep et readFile:

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

env.getEnvironment()Retourne malheureusement une carte très limitée des variables d'environnement.


1
sh 'env > env.txt'fonctionne bien et inclut des variables d'environnement créées par le processus shell. env.getEnvironment()affiche uniquement les variables d'environnement d'ensemble Jenkins qui sont un sous-ensemble de celles vues dans sh 'env'technique. En outre, il nécessite l'approbation de sécurité du script method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment. Le env.each { name, value -> println "Name: $name -> Value $value" }recommandé par @Renato @Jayan ne s'imprime que Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979

Agréable!!! Le fait de pouvoir imprimer toutes les variables d'environnement m'a permis de découvrir que Jenkins 2 définit une variable JOB_BASE_NAME contenant le nom du travail sans le dossier dans lequel il se trouve.
Bill Agee

une version qui fonctionne sur Windows serait génial aussi bien :)
Bas Hamer

@Bas Hamer pour une version Windows essayer de remplacer "sh" par "bat"
Sebastien

2
Me donne une erreur java.lang.UnsupportedOperationException: appeler public static java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.lang.Object, groovy.lang.Closure) sur une fermeture transformée par CPS n'est pas encore pris en charge (JENKINS-26481); encapsuler dans une méthode @NonCPS, ou utiliser des boucles de style Java
Ben Mathews

12

Pourquoi toute cette complication?

sh 'env'

fait ce dont vous avez besoin (sous * nix)


Cela nécessite un bloc de nœuds pour s'exécuter. Pour mon cas d'utilisation, je dois traiter l'environnement du nœud, puis faire tourner un nœud en fonction de certains critères.
Bill Warner

10

Voici un script rapide que vous pouvez ajouter en tant que travail de pipeline pour répertorier toutes les variables d'environnement:

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

Cela listera les variables système et Jenkins.


9

Façon multiplateforme de lister toutes les variables d'environnement:

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

7

J'utilise le plugin Blue Ocean et je n'aime pas que chaque entrée d'environnement ait son propre bloc. Je veux un bloc avec toutes les lignes.

Imprime mal:

sh 'echo `env`'

Imprime mal:

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

S'imprime bien:

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

S'imprime bien: (comme mentionné par @mjfroehlich)

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

3

Les réponses ci-dessus sont désormais désuètes en raison de la nouvelle syntaxe du pipeline. Ci-dessous imprime les variables d'environnement.

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

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

1
1. Vous devez l'avoir dans un bloc de script. 2. Ils déprécient la boucle du «style groovy».
Eddie

Le foravec une fermeture causera également des problèmes sans @NonCPSannotation.
tirage

2

Les solutions Groovy pures qui lisent la envvariable globale n'impriment pas toutes les variables d'environnement (par exemple, il manque des variables du environmentbloc, du withEnvcontexte et de la plupart des variables spécifiques à la machine du système d'exploitation). En utilisant les étapes du shell, il est possible d'obtenir un ensemble plus complet, mais cela nécessite un nodecontexte, ce qui n'est pas toujours souhaité.

Voici une solution qui utilise l' getContextétape pour récupérer et imprimer l'ensemble complet des variables d'environnement, y compris les paramètres de pipeline, pour le contexte actuel.

Avertissement: ne fonctionne pas dans le bac à sable Groovy. Vous pouvez cependant l'utiliser à partir d'une bibliothèque partagée approuvée.

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

1

si vous voulez vraiment faire une boucle sur la envliste, faites simplement:

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

0

une autre façon d'obtenir exactement la sortie mentionnée dans la question:

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

Cela peut facilement être étendu pour créer une carte avec un sous-ensemble de variables d'environnement correspondant à un critère:

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

Je suppose que vous en aviez besoin sous la forme d'un script, mais si quelqu'un d'autre veut juste jeter un œil à l'interface graphique de Jenkins, cette liste peut être trouvée en sélectionnant la section "Variables d'environnement" dans le menu contextuel de gauche de chaque construction Sélectionnez un projet = > Sélectionnez build => Variables d'environnement

entrez la description de l'image ici


2
Ce n'est pas toujours disponible.
shuckc

1
Je ne pense pas du tout qu'il soit disponible pour Jenkinsfiles. La capture d'écran ressemble à une construction freestyle.
Jakub Bochenski le

0

J'ai trouvé que c'était le moyen le plus simple:

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

-1

Vous pouvez obtenir toutes les variables de votre instance jenkins. Visitez simplement:

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / syntaxe-pipeline / globals
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.