Comment accéder à parameters
défini dans la section "Cette construction est paramétrée" d'un travail Jenkins "Workflow"?
CAS DE TEST
foo
avec la valeur par défaut bar text
.Ajoutez le code ci-dessous à Workflow Script
:
node()
{
print "DEBUG: parameter foo = ${env.foo}"
}
RÉSULTAT
DEBUG: parameter foo = null
Je pense que la variable est disponible directement, plutôt que via env, lorsque vous utilisez le plugin Workflow . Essayez:
node()
{
print "DEBUG: parameter foo = ${foo}"
}
J'ai essayé quelques-unes des solutions de ce fil. Cela semblait fonctionner, mais mes valeurs étaient toujours vraies et j'ai également rencontré le problème suivant: JENKINS-40235
J'ai réussi à utiliser des paramètres dans groovy jenkinsfile
en utilisant la syntaxe suivante: params.myVariable
Voici un exemple de travail:
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
J'ai envoyé un Requête Pull pour mettre à jour le trompeur tutoriel de pipeline # build-parameters quote qui indique "ils sont accessibles en tant que variables Groovy du même nom". ;)
Edit: Comme Jesse Glick l’a souligné: Notes de mise à jour aller dans plus de détails
Vous devez également mettre à jour le plug-in Pipeline Job Plugin vers la version 2.7 ou une version ultérieure, de sorte que les paramètres de construction soient définis en tant que variables d'environnement et donc accessibles comme s'il s'agissait de variables globales Groovy.
Lorsque vous ajoutez un paramètre de construction, foo, , Il est converti en quelque chose qui agit comme une "variable nue", Ainsi, dans votre script, vous feriez:
node {
echo foo
}
Si vous regardez l'implémentation du script de flux de travail, vous verrez que lorsqu'un script est exécuté, une classe appelée WorkflowScript est générée dynamiquement Toutes les instructions du script sont exécutées dans le contexte de cette classe. Tous les paramètres de construction transmis à ce script sont convertis en propriétés accessibles à partir de cette classe.
Par exemple, vous pouvez faire:
node {
getProperty("foo")
}
Si vous êtes curieux, voici un script de flux de travail que j'ai écrit et qui tente d’imprimer les paramètres de construction, les variables d’environnement et les méthodes de la classe WorkflowScript.
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}"
}
}
Voici un autre exemple de code que j'ai essayé, où je voulais tester pour voir Si un paramètre de construction était défini ou non.
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"
}
}
Pour paramétrer la variable, ajoutez le préfixe "params" Par exemple:
params.myParam
N'oubliez pas: si vous utilisez une méthode de myParam, vous devez peut-être l'approuver dans "Approbation du script".
Utilisez des guillemets doubles au lieu de guillemets simples
par exemple. echo "$foo"
par opposition à echo '$foo'
Si vous avez configuré votre pipeline pour accepter les paramètres à l'aide de l'option Construire avec les paramètres, ces paramètres sont accessibles en tant que variables Groovy du même nom. Voir Ici .
Vous pouvez supprimer le point-virgule (;
), les parenthèses (( and )
) et utiliser des guillemets simples ('
) au lieu de doubles ("
) si vous n'avez pas besoin de remplacer les variables. Voir Ici . Cela m’a fait comprendre mon problème, bien que j’ai constaté que seul le double ("
) est nécessaire pour que cela fonctionne.
L'extrait suivant vous donne accès à tous les paramètres du travail
def myparams = currentBuild.rawBuild.getAction(ParametersAction)
for( p in myparams ) {
pMap[p.name.toString()] = p.value.toString()
}
Veuillez noter que la manière dont les paramètres de construction sont utilisés dans les scripts de pipeline (plug-in de pipeline) a changé. Cette approche:
getBinding().hasVariable("MY_PARAM")
Ne fonctionne plus. S'il vous plaît essayez ceci à la place:
def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false
J'espère que le code suivant fonctionnera pour vous:
def item = hudson.model.Hudson.instance.getItem('MyJob')
def value = item.lastBuild.getEnvironment(null).get('foo')
Vous pouvez également essayer d’utiliser parameters directive pour paramétrer votre construction et accéder aux paramètres:
Doc: Syntaxe du pipeline: Paramètres
Exemple:
pipeline{
agent { node { label 'test' } }
options { skipDefaultCheckout() }
parameters {
string(name: 'suiteFile', defaultValue: '', description: 'Suite File')
}
stages{
stage('Initialize'){
steps{
echo "${params.suiteFile}"
}
}
}
Selon Tutoriel du plug-in Pipeline :
Si vous avez configuré votre pipeline pour accepter les paramètres lors de sa construction - Construire avec les paramètres - ils sont accessibles en tant que Groovy variables du même nom.
Essayez donc d’accéder directement à la variable, par exemple:
node()
{
print "DEBUG: parameter foo = " + foo
print "DEBUG: parameter bar = ${bar}"
}