steps - jenkinsfile
¿Es posible capturar el stdout del comando sh DSL en la tubería? (5)
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 resultado?
Nota: El problema vinculado de Jenkins ya se ha resuelto.
Como se menciona en JENKINS-26133 no fue posible obtener la salida del shell como una variable. Como solución alternativa sugirió el uso de escritura-lectura desde un archivo temporal. Entonces, su ejemplo se habría visto así:
sh "echo foo > result";
def output=readFile(''result'').trim()
echo "output=$output";
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
También puede intentar usar estas funciones para capturar StdErr StdOut y el código de retorno.
def runShell(String command){
def responseCode = sh returnStatus: true, script: "${command} &> tmp.txt"
def output = readFile(file: "tmp.txt")
if (responseCode != 0){
println "[ERROR] ${output}"
throw new Exception("${output}")
}else{
return "${output}"
}
}
Aviso:
&>name means 1>name 2>name -- redirect stdout and stderr to the file name
Una versión corta sería:
echo sh(script: ''ls -al'', returnStdout: true).result
JENKINS-26133
, el
paso
sh
admite la devolución de
stdout
al proporcionar 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)
Ver este ejemplo .