tutorial travis significado jenkins

travis - No falle la compilación de jenkins si el shell de ejecución falla



jenkins tutorial (10)

En 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:

bash -c "ping 1.2.3.9999 -c 1; exit 0"

Y ahora puedes, por ejemplo, obtener la salida de ping:

output=`bash -c "ping 1.2.3.9999 -c 1; exit 0"`

Por supuesto, en lugar de hacer ping ... Puede usar cualquier comando, incluido el git commit .

Como parte de mi proceso de compilación, estoy ejecutando un commit de git como un paso de shell de ejecución. Sin embargo, si no hay cambios en el espacio de trabajo, Jenkins está fallando en la compilación. Esto es porque 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?


Hay otra manera suave 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:

set +e git commit -m "Bla." set -e


Jenkins determina el éxito / fracaso de un paso por el valor de retorno del paso. Para el caso de un shell, debería ser la devolución del último valor. Para Windows CMD y (POSIX) Bash shells, debe poder establecer el valor de retorno manualmente utilizando exit 0 como último comando.


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 falló.

Así que creo que lo que sucedió en su caso es su salida de comando git con 1, y debido al parámetro -e predeterminado, el shell selecciona 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 secuencia de comandos de compilación aquí.

Si ese es el caso, puede tratar de poner #!/bin/sh para que el script se ejecute sin opción; o haga un set +e o algo similar en la parte superior del 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 creación seguirá marcado como fallido incluso con esta configuración. En este caso, simplemente puede poner un comando de echo al final para evitar eso.

Otra pregunta relacionada


Lo siguiente funciona para mercurial al solo comprometerse si hay cambios. Entonces la compilación solo falla si la confirmación falla.

hg id | grep "+" || exit 0 hg commit -m "scheduled commit"


Para detener la ejecución adicional cuando falla el comando :

command || exit 0

Para continuar la ejecución cuando el comando falla:

command || true



Puede usar el complemento Text-Finder . Le permitirá verificar la consola de salida para una expresión de su elección y marcar la construcción como Unstable .


Si no hay nada que presionar, git devuelve el estado de salida 1. El paso de ejecución del shell de ejecución se marca como fallido, respectivamente. Puedes usar la declaración OR || (doble tubería).

git commit -m ''some messasge'' || echo ''Commit failed. There is probably nothing to commit.''

Eso significa, ejecutar el segundo argumento si primero falló (devolvió el estado de salida> 0). El segundo comando siempre devuelve 0. Cuando no hay nada que presionar (estado de salida 1 -> ejecutar segundo comando) echo devolverá 0 y el paso de construcción continuará.

Para marcar la creación como inestable, puede utilizar el paso de creación posterior Jenkins Text Finder. Puede pasar por la salida de la consola, el patrón de coincidencia (su eco) y marcar la compilación como inestable.


Si pones estos comandos en el shell block:

false true

su construcción se marcará como fallida (al menos 1 código de salida distinto de cero), por lo que puede agregar (establecer + e) ​​para ignorarlo:

set +e false true

no fallará Sin embargo, esto fallará incluso con el (conjunto + e) ​​en su lugar:

set +e false

porque el último comando de shell debe salir con 0.