Come accedere ai parametri in una configurazione parametrizzata?

Come si accede ai parameters impostati nella sezione “Questa build è parametrizzata” di un lavoro Jenkins “Flusso di lavoro”?

CASO DI PROVA

  1. Crea un lavoro WORKFLOW.
  2. Abilita “Questa build è parametrizzata”.
  3. Aggiungi un PARAMETRO STRING foo con il bar text valori di default.
  4. Aggiungi il codice qui sotto allo Workflow Script di Workflow Script :

     node() { print "DEBUG: parameter foo = ${env.foo}" } 
  5. Esegui lavoro.

RISULTATO

DEBUG: parameter foo = null

    Penso che la variabile sia disponibile direttamente, piuttosto che tramite env, quando si usa il plugin Workflow. Provare:

     node() { print "DEBUG: parameter foo = ${foo}" } 

    Ho provato alcune delle soluzioni di questo thread. Sembrava funzionare, ma i miei valori erano sempre vere e ho anche riscontrato il seguente problema: JENKINS-40235

    Sono riuscito a usare i parametri in groovy jenkinsfile usando la seguente syntax: params.myVariable

    Ecco un esempio funzionante:

    Soluzione

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

    Un esempio più dettagliato (e funzionante):

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

    Produzione

     [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 

    Ho inviato una richiesta di pull per aggiornare la citazione #build-parameters del tutorial sulla pipeline fuorviante che dice “sono accessibili come variabili Groovy con lo stesso nome”. . 😉

    Modifica: come ha fatto notare Jesse Glick: le note di rilascio vanno più nel dettaglio

    È inoltre necessario aggiornare il plug-in di lavoro della pipeline su 2.7 o successive, in modo che i parametri di costruzione siano definiti come variabili di ambiente e quindi accessibili come se fossero variabili globali di Groovy.

    Quando aggiungi un parametro di build, foo, viene convertito in qualcosa che si comporta come una “variabile nuda”, quindi nel tuo script dovresti fare:

     node { echo foo } 

    Se si esamina l’implementazione dello script del stream di lavoro, si noterà che quando viene eseguito uno script, viene generata dynamicmente una class chiamata WorkflowScript. Tutte le istruzioni nello script sono eseguite nel contesto di questa class. Tutti i parametri di costruzione passati a questo script vengono convertiti in proprietà accessibili da questa class.

    Ad esempio, puoi fare:

     node { getProperty("foo") } 

    Se sei curioso, ecco uno script del stream di lavoro che ho scritto che tenta di stampare i parametri di costruzione, le variabili di ambiente e i metodi nella class 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}" } } 

    Ecco un altro esempio di codice che ho provato, in cui volevo testare per verificare se un parametro build fosse impostato o meno.

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

    Alla variabile parametro aggiungere prefisso “params”. Per esempio:

     params.myParam 

    Non dimenticare: se si utilizza un metodo di myParam, potrebbe essere necessario approvarlo in “Approvazione script”.

    Usa le virgolette anziché le virgolette singole

    eg echo "$foo" al contrario di echo '$foo'

    Se la pipeline è stata configurata per accettare parametri utilizzando l’opzione Build with Parameters, tali parametri sono accessibili come variabili Groovy con lo stesso nome. Vedi qui

    È ansible rilasciare il punto e virgola ( ; ), rilasciare le parentesi ( ( and ) ) e utilizzare le virgolette singole ( ' ) anziché il doppio ( " ) se non è necessario eseguire sostituzioni variabili . Vedere qui . Questo mi ha incluso nel mio problema , anche se ho scoperto che solo il doppio ( " ) è necessario per farlo funzionare.

    Si noti che il modo in cui i parametri di costruzione sono accessibili all’interno degli script della pipeline (plug-in pipeline) è cambiato. Questo approccio:

     getBinding().hasVariable("MY_PARAM") 

    Non funziona più Per favore prova questo invece:

     def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false 

    Spero che il seguente pezzo di codice funzioni per te:

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

    Il seguente frammento ti dà accesso a tutti i parametri di lavoro

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

    Come tutorial per il plug-in Pipeline :

    Se la pipeline è stata configurata in modo che accetti i parametri quando è costruita – Build with Parameters – sono accessibili come variabili Groovy con lo stesso nome .

    Quindi prova ad accedere direttamente alla variabile, ad esempio:

     node() { print "DEBUG: parameter foo = " + foo print "DEBUG: parameter bar = ${bar}" }