web-dev-qa-db-fra.com

Jenkins Pipeline accédant à des variables d'environnement

J'essaie d'utiliser des pipelines DSL à Jenkins. Je pensais que ce serait bien si je pouvais utiliser le nom du projet dans le cadre de mon script.

git credentialsId: 'ffffffff-ffff-ffff-ffff-ffffffffffffff',\
url: "${repo_root}/${JOB_NAME}.git"

Je reçois l'erreur: 

groovy.lang.MissingPropertyException: \
No such property: JOB_NAME for class: groovy.lang.Binding

Je pensais avoir suivi ces instructions , et ils mentionnent JOB_NAME parmi les variables.

J'ai décidé d'essayer:

sh 'env'

dans mon DSL, et cela affiche:

JOB_NAME = foo-bar

c'est ce que j'attends.

Un autre mentions de blog :

Utilisation des variables d'environnement
Nous avons deux façons d'obtenir leur valeur. Les propriétés passées par -D= au démarrage peuvent être lues comme System.getProperty("key") grâce à la forte relation de Groovy avec Java.

La lecture des variables d’environnement normales en mode Java correspond à System.getenv("VARIABLE")...

Essayons ça:

println "JOB_NAME = " + System.getenv('JOB_NAME'); 

Maintenant, je reçois:

Java.lang.NullPointerException: Cannot get property 'System' on null object

Objet nul? Mais je peux voir que JOB_NAME est une variable d’environnement!

Comment lire le $JOB_NAME dans un script DSL d'un travail de pipeline? J'essaie un travail de pipeline, et quand je le ferai, ce sera un pipeline multibranches avec une Jenkinsfile.

20
David W.

Toutes les variables d'environnement sont accessibles à l'aide de env, par exemple. ${env.JOB_NAME}.

41
Krzysztof Krasoń

D'accord, cela m'a vraiment contrarié pendant un moment aujourd'hui. En fin de compte, je me suis fait avoir par deux choses:

  • Les chaînes à guillemets simples dans Groovy signifient "ne pas évaluer les variables", tout comme dans bash
  • L'utilisation de $ interpolation est totalement inutile si vous ne faites que référencer la variable, vous pouvez donc simplement faire env.JOB_NAME.

Cette question SO s’est avérée être celle qui m’a aidé à déchiffrer le code: Jenkins Workflow Checkout Accès à BRANCH_NAME et à GIT_COMMIT

6
Tim Keating

En effet, utilisez simplement ${env.JOB_NAME} pour accéder à une variable connue.

Toutefois, si vous devez accéder à la variable d'environnement où le nom est donné par une autre variable (accès dynamique), utilisez simplement env["your-env-variable"].

J'ai eu le problème où j'ai configuré 3 variables d'environnement (dans Jenkins -> Administer -> Configure System -> Environment variables), nommons-les ENV_VAR_1, ENV_VAR_2, ENV_VAR_3. Maintenant, je veux y accéder de manière dynamique, je peux le faire comme suit:

def envVarName = "ENV_VAR_" + count  // Suppose count is initialized in a loop somewhere above...

def value = env[envVarName]  // Will be resolved to env["ENV_VAR_1"] depending on count value

Mes variables d'environnement dans la configuration Jenkins ressemblent à ceci:

 enter image description here

2
Pom12

J'ai eu un problème avec cela ne fonctionne pas. Les propriétés/variables d'environnement définies globalement n'étaient disponibles qu'à l'intérieur d'une étape node. C'est un bug de la version 2.4 du plugin Pipeline. Passez à la version 2.5 si vous rencontrez ce problème et que vos propriétés globales seront disponibles n'importe où dans le script. J'ai posté ceci sur le wiki Jenkins ici avec le script de test que j'ai utilisé.

1
Mig82