2011-08-18 10 views
11

Recientemente hemos tenido problemas donde los desarrolladores ingresan código en SVN que no pasa las pruebas unitarias, no se compila en todas las plataformas o incluso no puede compilar en su propia plataforma. Si bien todo esto lo recogió nuestro servidor de CI (Cruise Control), y hemos implementado procesos para tratar de evitar que suceda, realmente nos gustaría poder evitar que los commits fraudulentos sucedan en primer lugar.¿Cómo puedo garantizar que todas las pruebas de unidad pasen antes de comprometer?

En base a algunas otras preguntas por aquí, parece ser una mala idea ™ forzar esto como un gancho precomprometido en el lado del servidor principalmente debido al tiempo requerido para construir + ejecutar las pruebas. Hice un poco de búsqueda en Google y encontré esto (todos los desarrolladores utilizar TortoiseSVN):

http://cf-bill.blogspot.com/2010/03/pre-commit-force-unit-tests-without.html

que resolvería al menos dos de los problemas (que no se basaría en Unix), pero no rechazar la confirmación si falla Entonces mis preguntas:

  • ¿Hay alguna manera de hacer un enlace precomprometido en TortoiseSVN porque el compromiso falla?
  • ¿Hay una manera mejor de hacer lo que estoy tratando de hacer en general?

Respuesta

21

¡No hay absolutamente ninguna razón por la que su gancho precompromiso no pueda ejecutar las pruebas de la Unidad! Toda su gancho pre-commit tiene que hacer es:

  • descargar el código a un directorio de trabajo
  • compilar todo
  • ejecutar todas las pruebas unitarias
  • Luego dejar el gancho si las pruebas unitarias fallan.

Es completamente posible hacer. Y, palabras posteriores, todos en su tienda de desarrollo odiarán sus agallas.

Hay que recordar que en un gancho pre-commit, todo el gancho tiene que completar antes de que pueda permitir al comprometerse a tener lugar y control puede ser devuelto al usuario.

¿Cuánto tiempo lleva hacer una compilación y ejecutar las pruebas unitarias? ¿10 minutos? Imagine hacer un compromiso y sentarse allí durante 10 minutos esperando a que se realice su compromiso. Esa es la razón por la que le piden que no lo haga.

Su servidor de integración continua es un excelente lugar para realizar las pruebas unitarias. Prefiero Hudson o Jenkins sobre CruiseControl. Son más fáciles de configurar y su página web es más fácil de usar. Aún mejor, tienen una variedad de complementos que pueden ayudar.

A los desarrolladores no les gusta que se sepa que rompió la compilación.Imagínese si todos en su grupo recibieran un correo electrónico indicando que cometió un código incorrecto. ¿No se aseguraría de que su código fuera bueno antes de comprometerlo?

Hudson/Jenkins tiene algunos gráficos bonitos que muestran los resultados de la prueba de la unidad, por lo que se puede ver en la página web lo que pasó y no pruebas, por lo que es muy claro exactamente lo que sucedió. (La página web de CruiseControl es más difícil para el ojo medio para analizar, por lo que estas cosas no son tan obvias).

Uno de mis plugins favoritos de Hudson/Jenkins es el juego de integración continua. En este complemento, a los usuarios se les asignan puntos para obtener buenas compilaciones, corregir las pruebas unitarias y crear más pruebas de unidades pasadas. Pierden puntos por construcciones malas y pruebas de unidades de ruptura. Hay un marcador que muestra todos los puntos del desarrollador.

Me sorprendió lo seriamente que los desarrolladores se lo tomaron. Una vez que se dieron cuenta de que los puntajes de sus juegos de CI eran públicos, se volvieron muy competitivos. Se quejaban cuando el servidor de compilación fallaba por algún motivo extraño y perdían 10 puntos por una compilación de. Sin embargo, la cantidad de pruebas unitarias fallidas disminuyó mucho, y el número de pruebas unitarias que se escribieron se disparó.

+1

Aceptando esta respuesta simplemente por el juego de integración continua. Envié esto a los otros gerentes y la gente estaba muy entusiasmada con esa idea. Hay una buena posibilidad de que cambiemos a Jenkins después de nuestro próximo lanzamiento. Mientras tanto, en su mayoría solo intentaremos cambiar la cultura. ¡Gracias a todos por sus comentarios! – Morinar

+0

Vine aquí para obtener una ayuda antes del compromiso, pero me encantaron los párrafos sobre CIG, esa es una buena idea, la enviaré a mi administrador de CI ^^ – Ethenyl

1

Lo mejor que se puede hacer es trabajar para mejorar la cultura de su equipo, para que cada desarrollador sienta suficiente compromiso con el proceso que les daría vergüenza comprobar sin asegurarse de que funciona correctamente, de la forma en que todos hayan estado de acuerdo.

2

Hay dos enfoques:

  1. disciplina
  2. Herramientas

En mi experiencia, # 1 sólo puede llegar tan lejos.

Así que la solución es probablemente herramientas. En tu caso, el obstáculo es la Subversión. Reemplácelo con un DVCS como Mercurial o Git. Eso permitirá que cada desarrollador trabaje en su propia rama sin las pesadillas de fusión de Subversion.

De vez en cuando, un desarrollador marcará una función o rama como "completa". Ese es el momento de fusionar la rama de características en la rama principal. Introdúzcalo en un depósito de "etapas" que su servidor de CI vigila. El servidor de CI puede extraer los últimos commit (s), compilarlos y probarlos y solo si esto pasa, empújelos al repositorio principal.

Así que el bucle es: repo principal -> desarrollador -> puesta en escena -> principal.

Hay muchas respuestas aquí que le dan los detalles. Haga clic aquí: Mercurial workflow for ~15 developers - Should we use named branches?

[EDIT] Así que decir que no tiene el tiempo para resolver los grandes problemas en su proceso de desarrollo ... Te dejaré adivinar la forma que suena a cualquiera ...; -)

De todos modos ... Usa hg convert para obtener un repo Mercurial de tu árbol Subversion. Si tiene una configuración estándar, no debería tomar mucho tiempo (solo necesitará mucho tiempo en su computadora, pero es automática).

clon que repositorios para conseguir un acuerdo de recompra de trabajo.El proceso funciona así:

  • Desarrolla en tu segundo clon. Crea ramas de características para eso.
  • Si necesita cambios de alguien, conviértelos en el primer clon. Pasa de eso a tu segundo clon (de esa manera, siempre tienes una copia "limpia" de subversión por si te equivocas).
  • Ahora combine la rama Subversion (default) y su rama de características. Eso debería funcionar mucho mejor que con Subversion.
  • Cuando la fusión es correcta (todas las pruebas se ejecutan para usted), cree un parche desde un diff entre las dos ramas.
  • Aplique el parche a una caja local de Subversion. Debería aplicarse sin problemas. Si no lo hace, puede limpiar su pago local y repetir. No hay posibilidad de perder trabajo aquí.
  • Confirme los cambios en subversión, conviértelos de nuevo en el repositorio n. ° 1 y acceda al repositorio n. ° 2.

Esto suena como un montón de trabajo, pero dentro de una semana, se le ocurrirá un guión o dos para hacer la mayor parte del trabajo.

Cuando se da cuenta de que alguien rompió la compilación (las pruebas ya no se ejecutan), deshaga la combinación (hg clean -C) y continúe trabajando en la rama de la característica operativa.

Cuando sus colegas se quejan de que alguien rompió la construcción, dígales que no tiene ningún problema. Cuando la gente comienza a notar que tu productividad es mucho mejor a pesar de todos los obstáculos que tienes que saltar, menciona "sería mucho más simple si rasguñáramos el SVN".

+0

Esa es una gran idea. Hay un puñado de nosotros aquí que han estado tratando de presionar a Mercurial por un tiempo, pero ahora no tenemos el tiempo para hacer el cambio. – Morinar

+0

@Aaron +2: primero para sugerir repositorio provisional, segundo para descartar SVN a favor de VCS más productivo. En aras de la completitud (no complacer a SVN), parece posible utilizar el enfoque de estadificación sobre SVN, ¿no es así? Estoy pensando en tener algo así como una ramificación provisional, etiquetarla para su ejecución en el servidor de CI y fusionarla con la troncal si pasan las pruebas. – gnat

+0

@Morinar: consulte a su gerente y pregunte: "Señor, ¿realmente no tenemos tiempo para resolver su problema más apremiante?" Ver mis ediciones para una explicación más larga. –

Cuestiones relacionadas