Tengo algo como esto en un Jenkinsfile (Groovy) y quiero grabar la stdout y el código de salida en una variable para poder usar la información más adelante.
sh "ls -l"
¿Cómo puedo hacer esto, especialmente porque parece que realmente no puedes ejecutar ningún tipo de código maravilloso dentro del Jenkinsfile
?
Respuestas:
La última versión del
sh
paso de canalización le permite hacer lo siguiente;Otra característica es la
returnStatus
opción.Estas opciones se agregaron en función de este problema.
Consulte la documentación oficial para el
sh
comando.fuente
WorkflowScript: 97: Expected a step @ line 97, column 17.
script
bloque de pasos. jenkins.io/doc/book/pipeline/syntax/#declarative-stepsLa versión actual de Pipeline admite de forma nativa
returnStdout
yreturnStatus
, lo que permite obtener resultados o estados desh
/bat
steps.Un ejemplo:
Una documentación oficial .
fuente
script { }
paso.La respuesta rápida es esta:
Creo que existe una solicitud de función para poder obtener el resultado del paso sh, pero que yo sepa, actualmente no hay otra opción.
EDITAR: JENKINS-26133
EDIT2: No estoy seguro desde qué versión, pero los pasos sh / bat ahora pueden devolver la salida estándar, simplemente:
fuente
Si desea obtener el stdout Y saber si el comando tuvo éxito o no, simplemente utilícelo
returnStdout
y envuélvalo en un controlador de excepciones:tubería guionizada
salida :
Desafortunadamente, a hudson.AbortException le falta algún método útil para obtener ese estado de salida, por lo que si se requiere el valor real, deberá analizarlo en el mensaje (¡uf!)
Contrariamente al Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html, la compilación no falla cuando se detecta esta excepción. Se produce un error cuando se no atrapado!
Actualización: si también desea la salida STDERR del comando de shell, Jenkins desafortunadamente no admite adecuadamente ese caso de uso común. Un boleto 2017 JENKINS-44930 está atrapado en un estado de ping-pong obstinado mientras no avanza hacia una solución, considere agregar su voto positivo.
En cuanto a una solución ahora , podría haber un par de enfoques posibles:
a) Redirige STDERR a STDOUT
2>&1
, pero depende de ti analizar eso de la salida principal, y no obtendrás la salida si el comando falló, porque estás en el controlador de excepciones.b) redirija STDERR a un archivo temporal (el nombre del cual preparó antes)
2>filename
(pero recuerde limpiar el archivo después), es decir. el código principal se convierte en:c) Vaya hacia el otro lado, configure en su
returnStatus=true
lugar, prescinda del controlador de excepciones y siempre capture la salida en un archivo, es decir:Advertencia: el código anterior es específico de Unix / Linux: Windows requiere comandos de shell completamente diferentes.
fuente
¡Este es un caso de muestra, lo cual tendrá sentido, creo!
fuente
Para aquellos que necesitan usar la salida en comandos de shell posteriores, en lugar de groovy, se podría hacer algo como este ejemplo:
Encontré que los ejemplos en Code Maven son bastante útiles.
fuente
La manera más fácil es usarlo de esta manera
my_var=`echo 2` echo $my_var
salida: 2tenga en cuenta que no es simple comilla simple es comilla inversa (`).
fuente
sh
contrario, la gente podría pensar que es maravilloso, especialmente si no están familiarizados con las secuencias de comandos bash. Acabo de probarlo en Jenkins, usando enls -l
lugar deecho 2
y funciona. En realidad, había usado este enfoque antes, pero he estado buscando una alternativa porque no es muy confiable. Tengo la salida de un comando más complejo capturado en un shell estándar de esta manera, pero cuando se transfiere a Jenkins,sh
la variable no contiene nada, por alguna razón desconocida.