groovy - try - post build actions in jenkins pipeline
¿Cómo hago para que se ejecute la salida de un comando de shell utilizando una variable de Jenkinsfile(groovy)? (6)
Tengo algo como esto en un Jenkinsfile (Groovy) y quiero registrar la salida estándar 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
?
¡Este es un caso de muestra, lo cual tendrá sentido, creo!
node(''master''){
stage(''stage1''){
def commit = sh (returnStdout: true, script: ''''''echo hi
echo bye | grep -o "e"
date
echo lol'''''').split()
echo "${commit[-1]} "
}
}
La última versión del paso
sh
canalización le permite hacer lo siguiente;
// Git committer email
GIT_COMMIT_EMAIL = sh (
script: ''git --no-pager show -s --format=/'%ae/''',
returnStdout: true
).trim()
echo "Git committer email: ${GIT_COMMIT_EMAIL}"
Otra característica es la opción
returnStatus
.
// Test commit message for flags
BUILD_FULL = sh (
script: "git log -1 --pretty=%B | grep ''//[jenkins-full]''",
returnStatus: true
) == 0
echo "Build full flag: ${BUILD_FULL}"
Estas opciones se agregaron en función de this problema.
Consulte la
documentation
oficial para el comando
sh
.
La manera más fácil es usarlo de esta manera
my_var=`echo 2` echo $my_var
salida: 2
tenga en cuenta que no es simple la comilla simple es la comilla inversa (`).
La respuesta rápida es esta:
sh "ls -l > commandResult"
result = readFile(''commandResult'').trim()
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: this
EDIT2: no estoy seguro desde qué versión, pero los pasos sh / bat ahora pueden devolver la salida estándar, simplemente:
def output = sh returnStdout: true, script: ''ls -l''
La versión actual de Pipeline admite de forma nativa
returnStdout
y
returnStatus
, que permiten obtener resultados o
returnStatus
pasos
sh
/
bat
.
Un ejemplo:
def ret = sh(script: ''uname'', returnStdout: true)
println ret
Una jenkins.io/doc/pipeline/steps/workflow-durable-task-step/… oficial.
Si desea obtener el stdout Y saber si el comando tuvo éxito o no, simplemente use
returnStdout
y envuélvalo en un controlador de excepciones:
tubería guionizada
try {
// Fails with non-zero exit if dir1 does not exist
def dir1 = sh(script:''ls -la dir1'', returnStdout:true).trim()
} catch (Exception ex) {
println("Unable to read dir1: ${ex}")
}
salida :
[Pipeline] sh
[Test-Pipeline] Running shell script
+ ls -la dir1
ls: cannot access dir1: No such file or directory
[Pipeline] echo
unable to read dir1: hudson.AbortException: script returned exit code 2
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. ¡Falla cuando no es atrapado!
Actualización: si también desea la salida STDERR del comando de shell, podría haber un par de enfoques posibles:
a) Redirigir STDERR a STDOUT
2>&1
, pero entonces depende de usted analizar eso de la salida principal, y no obtendrá la salida si el comando falló, porque está en el controlador de excepciones.
b) redirija STDERR a un archivo temporal (el nombre del cual preparó anteriormente)
2>filename
(pero recuerde limpiar el archivo después), es decir.
el código principal se convierte en:
def stderrfile = ''stderr.out''
try {
def dir1 = sh(script:"ls -la dir1 2>${stderrfile}", returnStdout:true).trim()
} catch (Exception ex) {
def errmsg = readFile(stderrfile)
println("Unable to read dir1: ${ex} - ${errmsg}")
}
c) Vaya hacia el otro lado, establezca
returnStatus=true
lugar, prescinda del controlador de excepciones y siempre capture la salida en un archivo, es decir:
def outfile = ''stdout.out''
def status = sh(script:"ls -la dir1 >${outfile} 2>&1", returnStatus:true)
def output = readFile(outfile).trim()
if (status == 0) {
// output is directory listing from stdout
} else {
// output is error message from stderr
}
Advertencia: el código anterior es específico de Unix / Linux: Windows requiere comandos de shell completamente diferentes.