tutorial scripted scm plugin examples example jenkins groovy jenkins-pipeline

scripted - jenkins pipeline tutorial



¿Cómo acceder a los parámetros en una compilación parametrizada? (10)

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

¿Cómo accede a los parameters establecidos en la sección "Esta compilación está parametrizada" de un trabajo de Jenkins "Flujo de trabajo"?

CASO DE PRUEBA

  1. Cree un trabajo de FLUJO DE TRABAJO.
  2. Habilite "Esta compilación está parametrizada".
  3. Agregue un parámetro de STRING PARAMETER con bar text valor predeterminado.
  4. Agregue el siguiente código a la Workflow Script de Workflow Script :

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

  5. Ejecutar trabajo.

RESULTADO

DEBUG: parameter foo = null


Cuando agrega un parámetro de compilación, foo, se convierte en algo que actúa como una "variable básica", por lo que en su script haría:

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 compilación transmitidos 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í que intenta imprimir los parámetros de compilació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 se configuró un parámetro de compilación 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" } }


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

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


Espero que el siguiente código funcione para usted:

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


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

params.myParam

No olvide: si utiliza algún método de myParam, puede aprobarlo en "Aprobación de script".


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

jenkinsfile usar parámetros en el maravilloso jenkinsfile usando la siguiente sintaxis: 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 el tutorial engañoso de la tubería # cita de parámetros de construcción que dice "son accesibles como variables Groovy del mismo nombre". . ;)

Editar: como señaló Jesse Glick: las notas de la versión entran en más detalles

También debe actualizar el complemento de trabajo de canalización a 2.7 o posterior, de modo que los parámetros de compilación se definan como variables de entorno y, por lo tanto, sean accesibles como si fueran variables globales Groovy.


Según el tutorial del complemento Pipeline :

Si ha configurado su canalización para aceptar parámetros cuando se construye - Construir con parámetros - son accesibles como variables Groovy del mismo nombre .

Así que intente acceder a la variable directamente, por ejemplo:

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


También puede intentar usar la directiva de parámetros para hacer que su compilación se parametrice y acceder a los parámetros:

Doc: sintaxis de canalización: parámetros

Ejemplo:

pipeline{ agent { node { label ''test'' } } options { skipDefaultCheckout() } parameters { string(name: ''suiteFile'', defaultValue: '''', description: ''Suite File'') } stages{ stage(''Initialize''){ steps{ echo "${params.suiteFile}" } } }


Tenga en cuenta que la forma en que se accede a los parámetros de compilación dentro de los scripts de canalización (plugin de canalización) 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


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 Construir con parámetros, se puede acceder a esos parámetros como variables Groovy del mismo nombre. Mira Here

Puede colocar el punto y coma ( ; ), colocar los paréntesis ( ( and ) ) y usar comillas simples ( '' ) en lugar de dobles ( " ) si no necesita realizar sustituciones variables . Vea Here . Esto me dio pistas sobre mi problema , aunque descubrí que solo se requiere el doble ( " ) para que funcione.