Wie kann auf parameters
im Abschnitt "Dieser Build wird parametrisiert" eines Jenkins-Jobs "Workflow" zugegriffen werden?
TESTFALL
foo
mit dem Standardwert bar text
hinzu.Fügen Sie den Code unten zu Workflow Script
hinzu:
node()
{
print "DEBUG: parameter foo = ${env.foo}"
}
ERGEBNIS
DEBUG: parameter foo = null
Ich denke, dass die Variable direkt verfügbar ist und nicht über env, wenn Sie das Workflow-Plugin verwenden.
node()
{
print "DEBUG: parameter foo = ${foo}"
}
Ich habe einige Lösungen aus diesem Thread ausprobiert. Es schien zu funktionieren, aber meine Werte waren immer wahr und ich bin auch auf das folgende Problem gestoßen: JENKINS-40235
Es gelang mir, Parameter in groovy jenkinsfile
mit der folgenden Syntax zu verwenden: params.myVariable
Hier ist ein Arbeitsbeispiel:
print 'DEBUG: parameter isFoo = ' + params.isFoo
print "DEBUG: parameter isFoo = ${params.isFoo}"
node() {
// adds job parameters within jenkinsfile
properties([
parameters([
booleanParam(
defaultValue: false,
description: 'isFoo should be false',
name: 'isFoo'
),
booleanParam(
defaultValue: true,
description: 'isBar should be true',
name: 'isBar'
),
])
])
// test the false value
print 'DEBUG: parameter isFoo = ' + params.isFoo
print "DEBUG: parameter isFoo = ${params.isFoo}"
sh "echo sh isFoo is ${params.isFoo}"
if (params.isFoo) { print "THIS SHOULD NOT DISPLAY" }
// test the true value
print 'DEBUG: parameter isBar = ' + params.isBar
print "DEBUG: parameter isBar = ${params.isBar}"
sh "echo sh isBar is ${params.isBar}"
if (params.isBar) { print "this should display" }
}
[Pipeline] {
[Pipeline] properties
WARNING: The properties step will remove all JobPropertys currently configured in this job, either from the UI or from an earlier properties step.
This includes configuration for discarding old builds, parameters, concurrent builds and build triggers.
WARNING: Removing existing job property 'This project is parameterized'
WARNING: Removing existing job property 'Build triggers'
[Pipeline] echo
DEBUG: parameter isFoo = false
[Pipeline] echo
DEBUG: parameter isFoo = false
[Pipeline] sh
[wegotrade-test-job] Running Shell script
+ echo sh isFoo is false
sh isFoo is false
[Pipeline] echo
DEBUG: parameter isBar = true
[Pipeline] echo
DEBUG: parameter isBar = true
[Pipeline] sh
[wegotrade-test-job] Running Shell script
+ echo sh isBar is true
sh isBar is true
[Pipeline] echo
this should display
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Ich habe ein Pull Request gesendet, um das irreführende Pipeline-Tutorial # build-parameters zu aktualisieren, das besagt, dass "sie als Groovy-Variablen mit demselben Namen zugänglich sind". ;)
Bearbeiten: Wie Jesse Glick darauf hinwies: Versionshinweise gehe auf weitere Details ein
Sie sollten auch das Pipeline-Job-Plugin auf Version 2.7 oder höher aktualisieren, damit die Build-Parameter als Umgebungsvariablen definiert werden und somit als globale Groovy-Variablen zugänglich sind.
Wenn Sie einen Build-Parameter hinzufügen, foo, Wird er in etwas konvertiert, das wie eine "bloße Variable" Fungiert.
node {
echo foo
}
Wenn Sie sich die Implementierung des Workflow-Skripts anschauen, werden Sie feststellen, dass bei der Ausführung eines Skripts eine Klasse namens WorkflowScript dynamisch generiert wird. Alle Anweisungen im Skript werden im Kontext dieser Klasse ausgeführt. Alle Build-Parameter, die an dieses Skript übergeben werden, werden in Eigenschaften konvertiert, auf die von dieser Klasse aus zugegriffen werden kann.
Zum Beispiel können Sie Folgendes tun:
node {
getProperty("foo")
}
Wenn Sie neugierig sind, haben Sie hier ein Workflow-Skript geschrieben, das versucht, die Build-Parameter, Umgebungsvariablen und Methoden der WorkflowScript-Klasse auszudrucken.
node {
echo "I am a "+getClass().getName()
echo "PARAMETERS"
echo "=========="
echo getBinding().getVariables().getClass().getName()
def myvariables = getBinding().getVariables()
for (v in myvariables) {
echo "${v} " + myvariables.get(v)
}
echo STRING_PARAM1.getClass().getName()
echo "METHODS"
echo "======="
def methods = getMetaClass().getMethods()
for (method in methods) {
echo method.getName()
}
echo "PROPERTIES"
echo "=========="
properties.each{ k, v ->
println "${k} ${v}"
}
echo properties
echo properties["class"].getName()
echo "ENVIRONMENT VARIABLES"
echo "======================"
echo "env is " + env.getClass().getName()
def envvars = env.getEnvironment()
envvars.each{ k, v ->
println "${k} ${v}"
}
}
Hier ist ein weiteres Codebeispiel, das ich ausprobiert habe, wo ich testen wollte, ob Ein Build-Parameter gesetzt war oder nicht.
node {
groovy.lang.Binding myBinding = getBinding()
boolean mybool = myBinding.hasVariable("STRING_PARAM1")
echo mybool.toString()
if (mybool) {
echo STRING_PARAM1
echo getProperty("STRING_PARAM1")
} else {
echo "STRING_PARAM1 is not defined"
}
mybool = myBinding.hasVariable("DID_NOT_DEFINE_THIS")
if (mybool) {
echo DID_NOT_DEFINE_THIS
echo getProperty("DID_NOT_DEFINE_THIS")
} else {
echo "DID_NOT_DEFINE_THIS is not defined"
}
}
Fügen Sie der Parametervariable das Präfix "params." .__ hinzu. Beispiel:
params.myParam
Vergessen Sie nicht: Wenn Sie eine Methode von myParam verwenden, sollten Sie sie unter "Skriptgenehmigung" genehmigen.
Verwenden Sie doppelte Anführungszeichen anstelle von einfachen Anführungszeichen
z.B. echo "$foo"
im Gegensatz zu echo '$foo'
Wenn Sie Ihre Pipeline so konfiguriert haben, dass Parameter mit der Option Mit Parametern erstellen akzeptiert werden, sind diese Parameter als Groovy-Variablen mit demselben Namen verfügbar. Siehe Here .
Sie können das Semikolon (;
), die Klammern (( and )
) löschen und einfache Anführungszeichen ('
) anstelle von double ("
) verwenden, wenn Sie keine Variablenersetzungen durchführen müssen. Siehe Here . Dies hat mich auf mein Problem aufmerksam gemacht, obwohl ich herausgefunden habe, dass nur das Doppelte ("
) erforderlich ist, damit es funktioniert.
Das folgende Snippet gibt Ihnen Zugriff auf alle Job-Parameter
def myparams = currentBuild.rawBuild.getAction(ParametersAction)
for( p in myparams ) {
pMap[p.name.toString()] = p.value.toString()
}
Bitte beachten Sie, dass sich die Art und Weise geändert hat, in der auf Build-Parameter innerhalb von Pipeline-Skripts (Pipeline-Plugin) zugegriffen wird. Dieser Ansatz:
getBinding().hasVariable("MY_PARAM")
Funktioniert nicht mehr. Bitte versuchen Sie es stattdessen:
def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false
Hoffe, der folgende Code funktioniert für Sie:
def item = hudson.model.Hudson.instance.getItem('MyJob')
def value = item.lastBuild.getEnvironment(null).get('foo')
Sie können auch die Anweisung parameters verwenden, um Ihren Build zu parametrisieren und auf Parameter zuzugreifen:
Doc: Pipeline-Syntax: Parameter
Beispiel:
pipeline{
agent { node { label 'test' } }
options { skipDefaultCheckout() }
parameters {
string(name: 'suiteFile', defaultValue: '', description: 'Suite File')
}
stages{
stage('Initialize'){
steps{
echo "${params.suiteFile}"
}
}
}
Wie pro Pipeline Plugin Tutorial :
Wenn Sie Ihre Pipeline so konfiguriert haben, dass sie Parameter akzeptiert, wenn sie erstellt wird - Build with Parameters -, können Sie auf sie als Groovy variables mit demselben Namen zugreifen.
Versuchen Sie also, direkt auf die Variable zuzugreifen, z.
node()
{
print "DEBUG: parameter foo = " + foo
print "DEBUG: parameter bar = ${bar}"
}