tutorial - Cómo ejecutar un comando en un trabajo Jenkins 2.0 Pipeline y luego devolver la salida estándar
jenkins pipeline tutorial español (2)
¿Hay una mejor manera de ejecutar una tarea de shell en una canalización de Jenkins 2.0 y luego devolver la stdout
del comando. La única forma en que puedo hacer que esto funcione es canalizar la salida del comando a un archivo y luego leer el archivo en una variable.
sh(''git config --get remote.origin.url > GIT_URL'')
def stdout = readFile(''GIT_URL'').trim()
Esto parece una forma realmente mala de devolver la salida. Esperaba poder hacer algo como:
def stdout = sh(''git config --get remote.origin.url'').stdout
o
def exitcode = sh(''git config --get remote.origin.url'').exitcode
es posible?
Actualizar
Desde 6/2016, JENKINS-26133 está oficialmente marcado como Resuelto. Por lo tanto, antes de probar las soluciones alternativas, primero intente la here compatible para sh
/ bat
que hace posible utilizar los parámetros returnStdout
y returnStatus
.
Soluciones
Desafortunadamente, esta característica aún no está soportada y falta. Para obtener más información, consulte el JENKINS-26133 oficial:
JENKINS-26133 Shell toma / devuelve salida / estado Estado: Asignado: Prioridad: Resolución: Abrir Jesse Glick Major Sin resolver
Descripción
Actualmente sh no tiene un valor de retorno significativo, y lanza una excepción si el estado de salida no es cero. Sería bueno tener una opción para que devuelva el código de salida (cero o no) como un valor entero:
def r = sh script: ''someCommand'', returnStatus: true
Solución actual:
sh ''someCommand; echo $? > status'' def r = readFile(''status'').trim()
O para que devuelva su salida estándar (similar a los backticks de shell):
def lines = sh(script: ''dumpStuff.sh'', returnStdout: true).split("/r?/n")
Solución:
sh ''dumpStuff.sh > result'' def lines = readFile(''result'').split("/r?/n")
O para que tome algo en la entrada estándar:
sh script: ''loadStuff.sh'', stdin: someText
Solución:
writeFile file: ''input'', text: someText > sh ''loadStuff.sh < input''
Probablemente requiere algunos cambios de API en tareas duraderas.
Sí, como se mencionó en luka5z , la versión 2.4 del complemento de procesos y nodos de tuberías ahora admite este tipo de cosas:
def stdout = sh(script: ''git config --get remote.origin.url'', returnStdout: true)
println stdout
def retstat = sh(script: ''git config --get remote.origin.url'', returnStatus: true)
println retstat
Parece que si intentas devolver ambos en el mismo script, returnStatus sobrescribirá returnStdout, lo cual es un poco desafortunado.
Puedes leer más en la documentación oficial here
Edición: Además, también le permite un control más preciso sobre los estados de compilación inestables o fallidos. Puedes ver un ejemplo en mi comentario here