traduccion royal precios oil logo historia dutch company argentina shell unix jenkins build hudson

royal - ¿Cómo/Cuándo se ejecuta Shell marca una construcción como una falla en Jenkins?



shell traduccion (5)

Las historias de terror que encontré mientras buscaba una respuesta para esta ...

OK, tengo un script .sh que hace todo lo que Jenkins se supone que debe hacer:

  • verifica fuentes de SVN
  • construir el proyecto
  • despliega el proyecto
  • limpia después de sí mismo

Entonces en Jenkins solo tengo que ''compilar'' el proyecto ejecutando el script en un comando Ejecutar Shell. El script se ejecuta (las fuentes se descargan, el proyecto es compilación / implementación) pero luego marca la compilación como un error: el paso de compilación ''Ejecutar shell'' marcó la compilación como error ¡Incluso si el script se ejecutó correctamente! Traté de cerrar el script con:

  • exit 0 (aún lo marca como falla)
  • exit 1 (lo marca como una falla, como se esperaba)
  • sin comando de salida (lo marca como error)

¿Cuándo, cómo y por qué el Shell de ejecución marca mi compilación como un error?


En mi opinión, desactivar la opción -e de tu caparazón es una muy mala idea. Eventualmente, uno de los comandos en su secuencia de comandos fallará debido a condiciones transitorias como falta de espacio en el disco o errores de red. Sin -e Jenkins no se dará cuenta y continuará felizmente. Si tienes configurado a Jenkins para la implementación, eso puede hacer que se malgaste el código y derrumbes tu sitio.

Si tiene una línea en su script donde se espera una falla, como un grep o un hallazgo, solo agregue || true || true hasta el final de esa línea. Eso asegura que la línea siempre devolverá el éxito.

Si necesita usar ese código de salida, puede alzar el comando a su declaración if:

grep foo bar; if [ $? == 0 ]; then ... --> if grep foo bar; then ...

O puede capturar el código de retorno en su || cláusula:

grep foo bar || ret=$?


Entonces al agregar #!/bin/sh le permitirá ejecutar sin opción.

También me ayudó a solucionar un problema donde estaba ejecutando el script bash del maestro Jenkins en mi esclavo Linux. Simplemente agregando #!/bin/bash sobre mi secuencia de comandos real en el bloque "Ejecutar Shell", solucionó mi problema, ya que de lo contrario estaba ejecutando Windows git proporcionaba la versión de bash shell que estaba dando un error.


La respuesta simple y breve a su pregunta es

Agregue la siguiente línea en su paso de compilación "Ejecutar shell".

#!/bin/sh

Ahora déjame explicarte el motivo por el que necesitamos esta línea para el trabajo de compilación "Ejecutar Shell".

Por defecto, Jenkins toma /bin/sh -xe y esto significa que -x imprimirá todos y cada uno de los comandos. Y la otra opción -e , que hace que el shell deje de ejecutar un script inmediatamente cuando cualquier comando sale con un valor distinto de cero (cuando cualquier comando falla) código de salida.

Entonces al agregar #!/bin/sh le permitirá ejecutar sin opción.


Lo primero es lo primero, pase el mouse sobre el área gris a continuación. No es parte de la respuesta, pero absolutamente tiene que decirse:

Si tiene un script de shell que hace "checkout, build, deploy" por sí mismo, ¿por qué está usando Jenkins? Estás renunciando a todas las características de Jenkins que lo hacen ser lo que es. También podría tener un cron o un enlace SVN post-commit llamar directamente a la secuencia de comandos . Jenkins realizar el pago de SVN en sí mismo es crucial. Permite que las construcciones se activen solo cuando hay cambios (o en el temporizador, o manual, si lo prefiere). Realiza un seguimiento de los cambios entre compilaciones. Muestra esos cambios, por lo que puede ver qué compilación fue para cada conjunto de cambios. Envía correos electrónicos a los committers cuando sus cambios causaron una compilación exitosa o fallida (de nuevo, según lo configurado como usted prefiera). Enviará correos electrónicos a los committers cuando sus arreglos arreglen la versión fallada. Y más y más. Jenkins archivando los artefactos también los pone a disposición, por construcción, directamente de Jenkins. Aunque no es tan crucial como el pago de SVN, esto es una vez más una parte integral de lo que lo convierte en Jenkins. Lo mismo con la implementación. A menos que tenga un solo entorno, la implementación generalmente ocurre en múltiples entornos. Jenkins puede realizar un seguimiento de qué entorno se implementa una compilación específica (con un conjunto específico de cambios SVN), a través del uso de Promociones. Usted está renunciando a todo esto. Parece que le dicen "tiene que usar Jenkins", pero realmente no quiere hacerlo, y lo hace solo para sacar a sus jefes de su espalda, solo para poner una marca de verificación "sí, he usado Jenkins"

La respuesta corta es: el código de salida del último comando del paso de compilación de Shell de Ejecución de Jenkin es lo que determina el éxito / fracaso del Paso de compilación . 0 - éxito, anything else - fracaso. Tenga en cuenta que esto es determinar el éxito / fracaso del paso de compilación , no el trabajo completo. El éxito / fracaso de toda la ejecución del trabajo puede verse afectado por varios pasos de compilación y acciones y complementos posteriores a la compilación.

Ha mencionado el Build step ''Execute shell'' marked build as failure , por lo que nos centraremos solo en un único paso de compilación. Si el paso de creación del shell Execute solo tiene una línea que llama a su script de shell, entonces el código de salida de su script de shell determinará el éxito / fracaso del paso de compilación. Si tiene más líneas, después de ejecutar el script de shell, entonces revíselas cuidadosamente, ya que son las que podrían estar causando el error.

Finalmente, lea aquí las ediciones de Jenkins Build Script después de la ejecución de Google Test . No está directamente relacionado con su pregunta, pero tenga en cuenta esa parte sobre Jenkins al iniciar el paso de compilación Ejecutar Shell , como un script de shell con /bin/sh -xe

El -e significa que la secuencia de comandos del shell se cerrará con un error, incluso si solo falla 1 comando, incluso si realiza una comprobación de errores para ese comando (porque el script se cierra antes de que llegue a la comprobación de errores). Esto es contrario a la ejecución normal de los scripts de shell, que generalmente imprimen el mensaje de error del comando fallido (o lo redireccionan a nulo y lo manejan por otros medios), y continúan.

Para evitar esto, agregue set +e a la parte superior de su script de shell.

Como dices que tu script hace todo lo que se supone que debe hacer, es probable que el comando que falla esté en algún lugar al final del script. Tal vez un eco final? ¿O copia de artefactos en algún lugar? Sin ver la salida de la consola completa, solo estamos adivinando.

Por favor, publique el resultado de la consola de la ejecución del trabajo, y preferiblemente el script del shell también, y luego podríamos decirle exactamente qué línea está fallando.


Simple y simple:

Si Jenkins ve que el paso de compilación (que también es un guión) sale con un código que no es cero, la compilación está marcada con una bola roja (= error).

Por qué exactamente eso sucede depende de tu script de compilación.

Escribí algo similar desde otro punto de vista, pero tal vez ayude a leerlo de todos modos: ¿Por qué piensa Jenkins que mi construcción tuvo éxito?