¿Cómo obtengo la salida de un comando de shell ejecutado usando una variable desde Jenkinsfile (groovy)?


Tengo algo como esto en un Jenkinsfile (Groovy) y quiero grabar el stdout y el código de salida en una variable para usar la información más tarde.

sh "ls -l"

¿Cómo puedo hacer esto, especialmente porque parece que realmente no se puede ejecutar ningún tipo de código groovy dentro de la Jenkinsfile?

Author: sorin, 2016-04-11

4 answers

La última versión del paso pipeline sh 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 indocumentada (por ahora) 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 este problema.

 199
Author: G. Roggemans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-06 13:09:12

La respuesta rápida es esta:

sh "ls -l > commandResult"
result = readFile('commandResult').trim()

Creo que existe una solicitud de característica para poder obtener el resultado del paso sh, pero por lo que sé, actualmente no hay otra opción.

EDITAR: JENKINS-26133

EDIT2: No estoy muy seguro desde qué versión, pero sh / bat steps ahora puede devolver la salida std, simplemente:

def output = sh returnStdout: true, script: 'ls -l'
 32
Author: vehovmar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-23 12:33:42

La versión actual de la canalización admite de forma nativa returnStdout y returnStatus, lo que permite obtener la salida o el estado de sh/bat pasos.

Un ejemplo:

def ret = sh(script: 'uname', returnStdout: true)
println ret

Una documentación oficial .

 25
Author: luka5z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-12 20:30:31

Este es un caso de ejemplo, que 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]} "

    }
}
 7
Author: Bibek Mantree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-20 11:48:50