when try scripts catch actions groovy jenkins-workflow jenkins-pipeline jenkinsfile

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''



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.