Como parte de mi proceso de compilación, estoy ejecutando un git commit como un paso de ejecución de shell. Sin embargo, si no hay cambios en el espacio de trabajo, Jenkins está fallando la compilación. Esto se debe a que git está devolviendo un código de error cuando no hay cambios para confirmar. Me gustaría abortar la compilación o simplemente marcarla como inestable si este es el caso. ¿Algunas ideas?
132
Respuestas:
Para detener la ejecución adicional cuando falla el comando :
command || exit 0
Para continuar la ejecución cuando el comando falla:
command || true
fuente
|| exit 0
en el primer caso, sicommand
devuelve falso la ejecución se detendrá. Dicho esto, la segunda opción es muy útil.exit 0
porque cualquier código de salida distinto de cero fallará la compilación.Jenkins está ejecutando pasos de compilación de shell utilizando
/bin/sh -xe
de forma predeterminada.-x
significa imprimir cada comando ejecutado.-e
significa salir con falla si alguno de los comandos en el script falla.Entonces, creo que lo que sucedió en su caso es que su comando git sale con 1, y debido al
-e
parámetro predeterminado , el shell recoge el código de salida que no es 0, ignora el resto del script y marca el paso como un error. Podemos confirmar esto si puede publicar su script de paso de compilación aquí.Si ese es el caso, puede intentar ponerlo
#!/bin/sh
para que el script se ejecute sin opción; o hacerset +e
algo similar al paso de compilación para anular este comportamiento.Editado: Otra cosa a tener en cuenta es que, si el último comando en su script de shell devuelve código que no es 0 , todo el paso de compilación seguirá marcado como fallido, incluso con esta configuración. En este caso, simplemente puede poner un
echo
comando al final para evitar eso.Otra pregunta relacionada
fuente
Si no hay nada que empujar, git devuelve el estado de salida 1. Ejecutar el paso de compilación de shell se marca como fallido respectivamente. Puede usar la instrucción OR || (doble tubo).
Eso significa, ejecute el segundo argumento si primero falla (estado de salida devuelto> 0). El segundo comando siempre devuelve 0. Cuando no hay nada que empujar (estado de salida 1 -> ejecutar el segundo comando) echo devolverá 0 y el paso de compilación continúa.
Para marcar la compilación como inestable, puede utilizar el paso posterior a la compilación Jenkins Text Finder. Puede pasar por la salida de la consola, hacer coincidir el patrón (su eco) y marcar la construcción como inestable.
fuente
Hay otra manera fácil de decirle a Jenkins que no falle. Puede aislar su confirmación en un paso de compilación y configurar el shell para que no falle:
fuente
set -e
después del comando que desea ejecutar independientemente del código de salida. De lo contrario, puede terminar ejecutando comandos que no desea. Quería manejar el error yo mismo, así que hice algo como: `set + e commit -m" bla "EXIT_CODE =" $ {?} "Set -e # maneja la lógica del código deJenkins determina el éxito / fracaso de un paso por el valor de retorno del paso. Para el caso de un shell, debería ser el retorno del último valor. Tanto para los shells CMD de Windows como para Bash (POSIX), debe poder establecer el valor de retorno manualmente mediante
exit 0
el último comando.fuente
exit 0
con "ejecutar el comando por lotes de Windows" en varias compilaciones en mi instalación de Windows Jenkins, y funciona como se esperaba. Algo más debe estar sucediendo. ¿Podría publicar la parte relevante del registro de la consola?#!/bin/sh -xv
que se detiene el script si se encuentra algún error.Pude hacer que esto funcione usando la respuesta que se encuentra aquí:
¿Cómo git cometer nada sin un error?
fuente
git diff
comando, y si eso falla, hacergit commit
comando. Básicamente, solo hace la confirmación, sigit diff
encuentra algo para confirmar. Sin embargo, la respuesta de @jwernerny fue correcta que debería poder agregarexit 0
como la última declaración a cualquier script para que Jenkins lo trate como un éxito. Puedo pensar en un escenario en el que esto fallaría si estuvieras haciendo un paso de shell de Linux, pero en Batch esto siempre debería funcionar./bin/sh -xe
de forma predeterminada como se menciona aquí (en el medio). Por lo tanto, puede intentar colocar#!/bin/bash
o hacer unaset +e
parte superior del paso de compilación para anular este comportamiento, que continuará el resto del paso, incluso un comando dentro de la salida con un código que no sea 0En la pregunta (más general) en el título: para evitar que Jenkins falle, puede evitar que vea el código de salida 1. Ejemplo para ping:
Y ahora puede, por ejemplo, obtener salida de ping:
Por supuesto, en lugar de
ping ...
Puede usar cualquier comando, incluidosgit commit
.fuente
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
si incluye una propiedad returnStatus: true, se ignora el retorno del shell.
fuente
Puede usar el complemento Buscador de texto . Le permitirá verificar la consola de salida para una expresión de su elección y luego marcar la compilación como
Unstable
.fuente
Para múltiples comandos de shell, ignoro las fallas agregando:
set +e commands true
fuente
Si coloca estos comandos en el bloque de shell:
su compilación se marcará como fallida (al menos 1 código de salida distinto de cero), por lo que puede agregar (establecer + e) para ignorarla:
No fallará. Sin embargo, esto fallará incluso con (set + e) en su lugar:
porque el último comando de shell debe salir con 0.
fuente
Lo siguiente funciona para mercurial al comprometerse solo si hay cambios. Por lo tanto, la compilación solo falla si falla la confirmación.
fuente
Otra respuesta con algunos consejos, puede ser útil para alguien:
recuerde separar sus comandos con la siguiente regla :
command1 && command2: significa que ese comando2 se ejecutará, solo si el comando1 es correcto
comando1 ; comando2: significa que el comando 2 se ejecutará a pesar del resultado del comando1
por ejemplo:
se ejecutará con éxito con
set -e
yecho 0
comandos sigmake test
falla (sus pruebas fallaron), mientras que el siguiente código recortado:un poco mal y los comandos
set -e
yecho 0
en&& gmake test && set -e && echo 0
se omitirán, con laprintln run_tests
declaración, porque fallógmake test
abortará la compilación de jenkins. Como solución alternativa puede cambiarreturnStatus:true
, pero perderá el resultado de su comando.fuente
Esta respuesta es correcta, pero no especifica
|| exit 0
o|| true
va dentro del comando de shell . Aquí hay un ejemplo más completo:Lo anterior funcionará, pero lo siguiente fallará:
Tal vez sea obvio para los demás, pero perdí mucho tiempo antes de darme cuenta de esto.
fuente