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
- Cree un trabajo de FLUJO DE TRABAJO.
- Habilite "Esta compilación está parametrizada".
-
Agregue un parámetro de STRING PARAMETER con
bar text
valor predeterminado. -
Agregue el siguiente código a la
Workflow Script
deWorkflow Script
:node() { print "DEBUG: parameter foo = ${env.foo}" }
- 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.