¿Es posible capturar el stdout del comando sh DSL en la tubería?

Por ejemplo:

var output=sh "echo foo"; echo "output=$output"; 

Obtendré:

 output=0 

Entonces, aparentemente obtengo el código de salida en lugar del stdout. ¿Es posible capturar el stdout en una variable de canalización, de modo que pueda obtener: output=foo como mi resultado?

Nota: El problema de Jenkins vinculado ha sido resuelto desde entonces.

Como se menciona en JENKINS-26133, no fue posible obtener la salida de shell como una variable. Como solución alternativa, sugirió usar writ-read desde un archivo temporal. Por lo tanto, su ejemplo se habría visto así:

 sh "echo foo > result"; def output=readFile('result').trim() echo "output=$output"; 

Ahora , el paso sh soporta returnStdout stdout suministrando el parámetro returnStdout .

 // These should all be performed at the point where you've // checked out your sources on the slave. A 'git' executable // must be available. // Most typical, if you're not cloning into a sub directory gitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim() // short SHA, possibly better for chat notifications, etc. shortCommit = gitCommit.take(6) 

Mira este ejemplo .

Prueba esto:

 def get_git_sha(git_dir='') { dir(git_dir) { return sh(returnStdout: true, script: 'git rev-parse HEAD').trim() } } node(BUILD_NODE) { ... repo_SHA = get_git_sha('src/FooBar.git') echo repo_SHA ... } 

Probado en:

  • Jenkins ver. 2.19.1
  • Pipeline 2.4

Una versión corta sería:

 echo sh(script: 'ls -al', returnStdout: true).result