webentwicklung-frage-antwort-db.com.de

Jenkins Pipeline greift auf Umgebungsvariablen zu

Ich versuche, DSL-Pipelines in Jenkins zu verwenden. Ich dachte, es wäre schön, wenn ich den Projektnamen als Teil meines Skripts verwenden könnte.

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

Ich bekomme den Fehler: 

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

Ich dachte, ich habe diese Anweisungen befolgt, und sie erwähnen JOB_NAME als eine der Variablen.

Ich entschied mich zu versuchen:

sh 'env'

in meinem DSL und dies druckt aus:

JOB_NAME = foo-bar

das ist was ich erwarte.

Ein weiterer Blog erwähnt :

Verwendung von Umgebungsvariablen
Wir haben zwei Möglichkeiten, ihren Wert zu ermitteln. Die Eigenschaften, die während des Startvorgangs von -D= übergeben wurden, konnten wir dank der starken Beziehung von Groovy zu Java als System.getProperty("key") lesen.

Das Lesen normaler Umgebungsvariablen auf Java-Weise ist die System.getenv("VARIABLE") ...

Lass uns das versuchen:

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

Jetzt bekomme ich:

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

Nullobjekt? Aber ich kann sehen, dass JOB_NAME eine Umgebungsvariable ist!

Wie lese ich den $JOB_NAME in ein DSL-Skript in einem Pipeline-Job ein? Ich versuche einen Pipeline-Job, und wenn ich damit fertig bin, wird dies eine Multibranch-Pipeline mit einer Jenkinsfile.

20
David W.

Auf alle Umgebungsvariablen kann mit env zugegriffen werden, z. ${env.JOB_NAME}.

41

Okay, das ärgert mich heute für eine Weile. Letztendlich wurde ich mit ein paar Dingen beschäftigt:

  • Strings mit einfachen Anführungszeichen in Groovy bedeuten "Variablen nicht auswerten", genau wie in bash
  • Die $ -Interpolation ist völlig unnötig, wenn Sie nur auf die Variable verweisen. Sie können also nur env.JOB_NAME verwenden.

Diese SO - Frage hat mir geholfen, den Code zu knacken: Jenkins Workflow Checkout Zugriff auf BRANCH_NAME und GIT_COMMIT

6
Tim Keating

Verwenden Sie einfach ${env.JOB_NAME}, um auf eine bekannte Variable zuzugreifen.

Wenn Sie jedoch auf eine Umgebungsvariable zugreifen müssen, deren Name von einer anderen Variablen angegeben wird (dynamischer Zugriff), verwenden Sie einfach env["your-env-variable"].

Ich hatte das Problem, dass ich 3 Umgebungsvariablen (in Jenkins -> Administer -> Configure System -> Environment variables) konfiguriert habe, nennen wir sie ENV_VAR_1, ENV_VAR_2, ENV_VAR_3. Nun möchte ich dynamisch auf sie zugreifen, ich kann dies als solche tun:

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

Meine Umgebungsvariablen in der Jenkins-Konfiguration sehen folgendermaßen aus:

 enter image description here

2
Pom12

Ich hatte ein Problem damit, dass es nicht funktioniert. Die global festgelegten Eigenschaften/Umgebungsvariablen waren nur in einem Schritt node verfügbar. Es ist ein Fehler in Version 2.4 des Pipeline-Plugins. Aktualisieren Sie auf 2.5, wenn Sie dieses Problem haben und Ihre globalen Eigenschaften an einer beliebigen Stelle im Skript verfügbar sind. Ich habe dies im Jenkins-Wiki hier mit dem von mir verwendeten Testskript gepostet.

1
Mig82