Comment accéder aux parameters dans une construction paramétrée?

Comment accéder aux parameters définis dans la section “Cette version est paramétrée” d’un travail Jenkins “Workflow”?

CAS DE TEST

  1. Créez un travail WORKFLOW.
  2. Activer “Cette version est paramétrée”.
  3. Ajoutez un foo STRING PARAMETER avec le bar text valeur par défaut.
  4. Ajoutez le code ci-dessous au Workflow Script :

     node() { print "DEBUG: parameter foo = ${env.foo}" } 
  5. Exécuter le travail.

RÉSULTAT

DEBUG: parameter foo = null

Je pense que la variable est disponible directement, plutôt que par env, lorsque vous utilisez le plug-in Workflow. Essayer:

 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 parameters dans groovy jenkinsfile utilisant la syntaxe suivante: params.myVariable

Voici un exemple de travail:

Solution

 print 'DEBUG: parameter isFoo = ' + params.isFoo print "DEBUG: parameter isFoo = ${params.isFoo}" 

Un exemple plus détaillé (et fonctionnel):

 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" } } 

Sortie

 [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 sortingggers. WARNING: Removing existing job property 'This project is parameterized' WARNING: Removing existing job property 'Build sortingggers' [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é une requête Pull pour mettre à jour le tutoriel de pipeline trompeur # quote -parameters de construction qui dit “ils sont accessibles en tant que variables Groovy du même nom.” . 😉

Edit: Comme Jesse Glick l’a souligné: les notes de version entrent dans plus de détails

Vous devez également mettre à jour le Pipeline Job Plugin vers la version 2.7 ou ultérieure afin que les parameters de construction soient définis en tant que variables d’environnement et donc accessibles comme s’il s’agissait de variables Groovy globales.

Lorsque vous ajoutez un paramètre de construction, foo, il est converti en quelque chose qui agit comme une “variable nue”, donc dans votre script, vous feriez:

 node { echo foo } 

Si vous regardez l’implémentation du script de workflow, vous verrez que lorsqu’un script est exécuté, une classe appelée WorkflowScript est générée dynamicment. Toutes les instructions du script sont exécutées dans le contexte de cette classe. Tous les parameters de génération 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 workflow que j’ai écrit et qui tente d’imprimer les parameters 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.toSsortingng() 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, peut-être devriez-vous l’approuver dans “Approbation de script”.

Utilisez des guillemets doubles plutôt que des guillemets simples

par exemple echo "$foo" par opposition à echo '$foo'

Si vous avez configuré votre pipeline pour accepter les parameters à l’aide de l’option Build with Parameters, ces parameters sont accessibles en tant que variables Groovy du même nom. Voir ici

Vous pouvez déposer le point-virgule ( ; ), déposer 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 . , bien que je trouve que seul le double ( " ) est nécessaire pour le faire fonctionner.

Veuillez noter que la façon dont les parameters de construction sont accédés dans les scripts de pipeline (plug-in de pipeline) a été modifiée. 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 morceau de code suivant fonctionne pour vous:

 def item = hudson.model.Hudson.instance.getItem('MyJob') def value = item.lastBuild.getEnvironment(null).get('foo') 

L’extrait suivant vous donne access à tous les parameters du Job

  def myparams = currentBuild.rawBuild.getAction(ParametersAction) for( p in myparams ) { pMap[p.name.toSsortingng()] = p.value.toSsortingng() } 

Selon le tutoriel du plugin Pipeline :

Si vous avez configuré votre pipeline pour accepter les parameters lors de sa construction – Build with Parameters – ils sont accessibles en tant que variables Groovy 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}" }