Las historias de horror que he encontrado mientras buscaba una respuesta para esto…

OK, tengo una .sh script que prácticamente lo hace todo Jenkins supone que debe hacer:

  • cheques fuentes de SVN
  • construir el proyecto
  • implementa el proyecto
  • limpia después de sí mismo

Así que en Jenkins sólo tengo para ‘construir’ el proyecto mediante la ejecución del script en Ejecución de comandos de Shell.
El script es ejecutado (las fuentes son descargados, el proyecto es crear/implementar), pero luego se marca el construir como un fracaso:
Construir paso ‘Ejecutar el shell’ marcó construir como fracaso
Incluso si la secuencia de comandos se ejecutó correctamente! Traté de cierre de la secuencia de comandos con:

  • salida 0 (todavía lo marca como error)
  • la salida 1 (lo marca como error, como era de esperar)
  • sin salir de comando (lo marca como error)

Cuándo, cómo y por qué Ejecutar el Shell de la marca de mi generación como un fracaso?

InformationsquelleAutor tester | 2014-04-02

6 Comentarios

  1. 121

    Lo primero es lo primero, coloca el cursor del ratón sobre el área gris de abajo. No forma parte de la respuesta, pero en absoluto hay que decir:

    Si usted tiene un shell script que hace «comprar, construir, implementar» todo por sí mismo, entonces ¿por qué estás usando Jenkins? Usted es anterior a todas las características de Jenkins, que es lo que es. Puedes tener un cron o un SVN post-commit gancho de llamar a la secuencia de comandos directamente. Jenkins, de la realización de la SVN checkout en sí, es crucial. Permite que las generaciones se activa sólo cuando hay cambios (o en el temporizador, o manual, si prefiere). Realiza un seguimiento de los cambios entre versiones. Se muestran los cambios, así que usted puede ver que construir era para el conjunto de cambios. Que los correos electrónicos «committers» cuando sus cambios causados éxito o error de compilación (de nuevo, como se ha configurado como usted prefiera). Se enviará por correo electrónico «committers» cuando sus correcciones corregido el error de compilación. Y más y más. Jenkins archivado de los artefactos también pone a disposición de, por construir, directamente de Jenkins. Aunque no es tan crucial como el SVN checkout, esto es una vez más una parte integral de lo que lo hace Jenkins. Mismo con la implementación. A menos que usted tenga un único entorno de despliegue, por lo general sucede a múltiples entornos. Jenkins puede seguir la pista de que el entorno de una generación específica (con conjunto específico de SVN cambios) es implementado, a través del uso de las Promociones. Usted es anterior todo esto. Suena como usted dice «usted tiene que utilizar Jenkins» pero usted realmente no quiere, y lo están haciendo sólo para obtener sus jefes en la espalda, sólo para poner una marca de verificación «sí, he usado Jenkins»

    La respuesta corta es: el código de salida de última comando de la Jenkin del Ejecutar Shell construir paso es lo que determina el éxito o el fracaso de la Construir Paso. 0 – éxito, anything else el fracaso.
    Nota, este es el que determina el éxito o el fracaso de la construir paso, no todo el de ejecución de trabajo de. El éxito/fracaso de la totalidad de la ejecución de la tarea puede ser, además, se ve afectado por múltiples pasos de compilación, y posterior a la generación de acciones y plugins.

    Usted ha mencionado Build step 'Execute shell' marked build as failure, por lo que nos centraremos sólo en un único paso de compilación. Si su Ejecutar shell construir paso sólo tiene una sola línea que se llama a la secuencia de comandos de shell, a continuación, el código de salida de la secuencia de comandos de shell va a determinar el éxito o el fracaso de la construcción del paso. Si usted tiene más líneas, después de su secuencia de comandos de shell de ejecución, luego de revisar cuidadosamente ellos, ya que ellos son los que podrían estar causando el fracaso.

    Finalmente, lee aquí Jenkins Script de generación de las salidas después de la ejecución de Prueba de Google. No está directamente relacionado con tu pregunta, pero tenga en cuenta que parte de Jenkins lanzamiento de la Ejecutar Shell paso de generación, como un script de shell con /bin/sh -xe

    La -e significa que la secuencia de comandos de shell se salida con el fracaso, incluso si sólo 1 comando falla, incluso si haces la comprobación de errores para que el comando (debido a que la secuencia de comandos de salidas antes de que llegue a su comprobación de errores). Esto es contrario a la normal ejecución de los scripts de shell, que generalmente se imprime el mensaje de error para el error de comando (o redirigir a null y controlar por otros medios), y continuar.

    Para evitar esto, añadir set +e a la parte superior de la secuencia de comandos de shell.

    Ya que dicen su script no todo lo que se supone que debe hacer, las posibilidades son que el error de comando está en algún lugar al final de la secuencia de comandos. Tal vez una final de eco? O copia de artefactos en algún lugar? Sin ver la salida de la consola, estamos a sólo una suposición.

    Por favor, puesto que el trabajo se ejecute la salida de la consola, y preferentemente de la secuencia de comandos de shell en sí demasiado, y entonces podríamos decir exactamente lo que la línea de falla.

    • La razón por la que todavía uso Jenkins está claro para mí… parece que alguien no entendió muy bien que ya tenemos este script e insistió en que el uso de Jenkins. Me siento como que estoy en una tira de Dilbert. Gracias por la -e de la punta. Solucionado el problema
    • Todavía hay buenas razones para usar Jenkins: la pista de auditoría, estado de generación de visibilidad, etc. Si usted ya tiene un script de generación, pasando a Jenkins es un buen primer paso antes de refactorización para tomar ventaja de Jenkins características.
    • Cruz de la vinculación de esta respuesta serverfault.com/a/143576/186454 set +e y set-e se pueden especificar en cualquier lugar de tu script. Cualquier código entre no fallará la acumulación si se devuelve el valor no es 0.
    • muy bien dicho en la secuencia de comandos de shell vs jenkins conjunto
    • Gracias por la set +e truco!
    • utilizamos jenkins proporciona acceso autenticado y una interfaz de usuario para el trabajo. Un cron no lo cortaría. Jenkins no sólo tiene que ejecutar bóvedas.

  2. 80

    Simple y la respuesta corta a tu pregunta es

    Por favor agregar la siguiente línea en su «Ejecutar shell» Construir paso.

    #!/bin/sh

    Ahora me explico la razón por la que necesitamos esta línea para «Ejecutar Shell» construir empleo.

    Por defecto Jenkins tomar /bin/sh -xe y esto significa -x le imprime a cada uno y a cada comando.Y la otra opción -e, que hace que el shell para detener la ejecución de un script de inmediato cuando cualquiera de los comandos de salidas con los no-cero (cuando cualquier error de comando) código de salida.

    Agregar la #!/bin/sh permitirá ejecutar con ninguna opción.

    • Upvoted. No sabía acerca de la -xe predeterminado. Cuando mi grep comman fue no encontrar una cadena que toda mi script error porque grep devuelto no 0 valor de retorno 🙂
    • Funcionó muy bien! Usando en mi de la no-pasos cruciales, a un paso de limpieza que acaba de hacer algo como find . -name 'bower_components' -exec rm {} \; y en algunos casos, estaba fallando. Gracias!
    • esta aclarado todo – ‘Y la otra opción -e, que hace que el shell para detener la ejecución de un script de inmediato cuando cualquiera de los comandos de salidas con los no-cero (cuando cualquier error de comando) código de salida.’
  3. 2

    Simple y llano:

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

    Por qué exactamente lo que sucede depende de su secuencia de comandos de compilación.

    Escribí algo similar desde otro punto de vista, pero tal vez se le ayuda a leer de todos modos:
    ¿Por qué Jenkins creo que mi build éxito?

  4. 2

    En mi opinión, la desactivación de la -e opción para su shell es una idea realmente mala. Finalmente, uno de los comandos de la secuencia de comandos se producirá un error debido a las condiciones transitorias de espacio en disco o errores de red. Sin -e Jenkins no aviso y continuará a lo largo de toda felicidad. Si tienes Jenkins configurado para hacer de implementación, que puede resultar en la mala código de recibir un empujón y derribando a su sitio.

    Si usted tiene una línea en el script donde el fracaso se espera, como un grep o una búsqueda, basta añadir || true para el final de la línea. Que garantiza que siempre se puede volver éxito.

    Si usted necesita usar ese código de salida, usted puede levantar el comando en su declaración de si:

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

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

    grep foo bar || ret=$?
    • Gracias Bryan. Usted salvó mi día . También, creo que es buena idea activar ambos -x y -e . Para que usted vea en su jenkins registro.
  5. 0

    Agregar la #!/bin/sh permitirá ejecutar con ninguna opción.

    También me ayudó en la fijación de un problema donde yo estaba ejecutando un script de bash de Jenkins maestro en mi Linux esclavo. Simplemente añadiendo #!/bin/bash por encima de mi secuencia real en «Ejecutar Shell» bloque solucionado mi problema ya que de lo contrario se estaba ejecutando windows git siempre la versión de bash shell que estaba dando un error.

  6. 0

    En Jenkins ver. 1.635, es imposible demostrar un nativo de la variable de entorno como este:

    $BUILD_NUMBER o ${BUILD_NUMBER}

    En este caso, tienes que ponerlo en una variable.

    conjunto BUILDNO = $BUILD_NUMBER
    $BUILDNO

Dejar respuesta

Please enter your comment!
Please enter your name here