Avec un pipeline de génération jenkins 2.1, jenkins injecte une variable env
dans le node{}
. Par exemple, BRANCH_NAME
est accessible avec
node {
echo ${env.BRANCH_NAME}
...
env
dans le pipeline jenkins.Je cherche un 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
...
Une autre façon, plus concise:
node {
echo sh(returnStdout: true, script: 'env')
// ...
}
cf. https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-Shell-script
Selon la documentation Jenkins pour pipeline déclaratif :
sh 'printenv'
Pour Jenkins pipeline scripté :
echo sh(script: 'env|sort', returnStdout: true)
Ce qui précède trie également vos env pour plus de commodité.
Vous pouvez obtenir le résultat en utilisant sh
/bat
step et readFile
:
node {
sh 'env > env.txt'
readFile('env.txt').split("\r?\n").each {
println it
}
}
Malheureusement, env.getEnvironment()
renvoie une carte très limitée de variables d'environnement.
Les oeuvres suivantes:
@NonCPS
def printParams() {
env.getEnvironment().each { name, value -> println "Name: $name -> Value $value" }
}
printParams()
Notez qu'il échouera probablement lors de la première exécution et vous obligera à approuver diverses méthodes groovy à exécuter dans le bac à sable jenkins. Ceci est fait dans "gérer l'approbation des scripts jenkins/in-process"
La liste que j'ai obtenue est la suivante:
J'utilise le plugin Blue Ocean et je n'aimais 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
}
Imprime bien:
sh 'env > env.txt'
sh 'cat env.txt'
Imprime bien: (comme mentionné par @mjfroehlich)
echo sh(script: 'env', returnStdout: true)
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"))
}
Ceci listera les variables système et Jenkins.
Les réponses ci-dessus sont maintenant obsolètes en raison de la nouvelle syntaxe du pipeline. La liste ci-dessous affiche les variables d'environnement.
script {
sh 'env > env.txt'
String[] envs = readFile('env.txt').split("\r?\n")
for(String vars: envs){
println(vars)
}
}
Pourquoi toute cette complication?
sh 'env'
fait ce dont vous avez besoin (sous * nix)
Manière multiplateforme de lister toutes les variables d'environnement:
if (isUnix()) {
sh env
}
else {
bat set
}
si vous voulez vraiment parcourir la liste env
, faites simplement:
def envs = sh(returnStdout: true, script: 'env').split('\n')
envs.each { name ->
println "Name: $name"
}
une autre façon d'obtenir exactement le résultat mentionné 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 construire une carte avec un sous-ensemble de vars env 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}
Je suppose que vous aviez besoin de cela sous la forme d'un script, mais si quelqu'un d'autre veut simplement consulter l'interface graphique de Jenkins, cette liste peut être trouvée en sélectionnant la section "Variables d'environnement" dans le menu de gauche contextuel de chaque construction. Select project => Select build => Variables d'environnement