¿Cómo acceder a los parámetros en una comstackción parametrizada?

¿Cómo se accede a los parameters establecidos en la sección “Esta versión está parametrizada” de un trabajo de “Workflow” Jenkins?

CASO DE PRUEBA

  1. Crea un trabajo WORKFLOW.
  2. Habilita “Esta comstackción está parametrizada”.
  3. Agregue un foo PARÁMETRO DE CADENA con el bar text predeterminado de la bar text valores.
  4. Agregue el siguiente código al Workflow Script de Workflow Script :

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

RESULTADO

DEBUG: parameter foo = null

Creo que la variable está disponible directamente, en lugar de a través de env, cuando se utiliza el complemento Workflow. Tratar:

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

Probé algunas de las soluciones de este hilo. Parecía funcionar, pero mis valores siempre eran ciertos y también me encontré con el siguiente problema: JENKINS-40235

jenkinsfile usar parámetros en groovy jenkinsfile usando la siguiente syntax: params.myVariable

Aquí hay un ejemplo de trabajo:

Solución

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

Un ejemplo más detallado (y funcional):

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

Salida

 [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 

Envié una Solicitud de extracción para actualizar la cita de tutorial # construcción-parámetros de canalización engañosa que dice “son accesibles como variables Groovy del mismo nombre”. . 😉

Editar: Como señaló Jesse Glick: las notas de lanzamiento entran en más detalles

También debe actualizar el plugin Pipeline Job a 2.7 o posterior, para que los parámetros de comstackción se definan como variables de entorno y, por lo tanto, accesibles como si fueran variables globales de Groovy.

Cuando agregas un parámetro de comstackción, foo, se convierte en algo que actúa como una “variable vacía”, por lo que en tu secuencia de comandos harías:

 node { echo foo } 

Si observa la implementación del script de flujo de trabajo, verá que cuando se ejecuta un script, se genera dinámicamente una clase llamada WorkflowScript. Todas las declaraciones en el script se ejecutan en el contexto de esta clase. Todos los parámetros de construcción transferidos a este script se convierten en propiedades a las que se puede acceder desde esta clase.

Por ejemplo, puedes hacer:

 node { getProperty("foo") } 

Si tiene curiosidad, aquí hay un script de flujo de trabajo que escribí e intenta imprimir los parámetros de comstackción, las variables de entorno y los métodos en la clase 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}" } } 

Aquí hay otro ejemplo de código que probé, donde quería probar para ver si un parámetro de comstackción se estableció o no.

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

Para la variable de parámetro, agregue el prefijo “params”. Por ejemplo:

 params.myParam 

No lo olvide: si utiliza algún método de myParam, puede ser que lo apruebe en “Aprobación del script”.

Use comillas dobles en lugar de comillas simples

por ejemplo, echo "$foo" en lugar de echo '$foo'

Si configuró su canalización para aceptar parámetros utilizando la opción Crear con parámetros, se puede acceder a esos parámetros como variables Groovy del mismo nombre. Ver aquí .

Puede soltar el punto y coma ( ; ), soltar el paréntesis ( ( and ) ) y usar comillas simples ( ' ) en lugar de dobles ( " ) si no necesita realizar sustituciones de variables . Consulte Aquí . Esto me ayudó a comprender mi problema , aunque descubrí que solo se requiere el doble ( " ) para que funcione.

Tenga en cuenta que la forma en que se accede a los parámetros de comstackción dentro de las secuencias de comandos de tubería (complemento de tubería) ha cambiado. Este enfoque:

 getBinding().hasVariable("MY_PARAM") 

Ya no funciona. Por favor intente esto en su lugar:

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

Espero que la siguiente pieza de código funcione para usted:

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

El siguiente fragmento le da acceso a todos los parámetros de Job

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

Según el tutorial del plugin Pipeline :

Si ha configurado su canalización para aceptar parámetros cuando está construido – Construir con parámetros – se puede acceder a ellos como variables Groovy del mismo nombre .

Intente acceder a la variable directamente, por ejemplo:

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