¿En qué punto es interesante un servidor de integración continua?

9

He estado leyendo un poco sobre servidores CI como Jenkins y me pregunto: ¿en qué momento es útil?

Porque seguramente para un proyecto pequeño donde solo tendrías 5 clases y 10 pruebas unitarias, no hay necesidad real.

Aquí tenemos alrededor de 1500 pruebas unitarias y pasan (en estaciones de trabajo Core 2 Duo antiguas) en aproximadamente 90 segundos (porque realmente están probando "unidades" y, por lo tanto, son muy rápidas). La regla que tenemos es que no podemos confirmar el código cuando falla una prueba.

Entonces, cada desarrollador lanza todas sus pruebas para evitar la regresión.

Obviamente, debido a que todos los desarrolladores siempre inician todas las pruebas, detectamos errores debido a cambios conflictivos tan pronto como un desarrollador realiza el cambio de otro (cuando lo hay).

Todavía no me queda muy claro: ¿debería configurar un servidor de CI como Jenkins? ¿Qué traería?

¿Es solo útil para la ganancia de velocidad? (no es un problema en nuestro caso)

¿Es útil porque las versiones antiguas se pueden recrear? (pero podemos hacer esto con Mercurial, revisando las revisiones antiguas)

Básicamente entiendo que puede ser útil, pero no veo exactamente por qué.

Cualquier explicación teniendo en cuenta los puntos que planteé anteriormente sería muy bienvenida.

Cedric Martin
fuente

Respuestas:

9

¿Es solo útil para la ganancia de velocidad? (no es un problema en nuestro caso)

Cualquier tiempo que pase ciclando su proceso es tiempo que podría haber pasado entrando en el flujo del desarrollo.

También ahorrará tiempo en los hitos porque idealmente está construyendo bits completamente empaquetados y listos para enviar que pueden grabarse directamente en un CD, cargarse en la web, etc.

¿Es útil porque las versiones antiguas se pueden recrear? (pero podemos hacer esto con Mercurial, revisando las revisiones antiguas)

No, no recreas compilaciones. Utiliza la compilación que creó y la mantiene hasta que la configuración de retención la descarte.

Lo compila en el servidor de compilación, en lugar de en el cuadro de algunos desarrolladores.

Aquí tenemos alrededor de 1500 pruebas unitarias y pasan (en estaciones de trabajo Core 2 Duo antiguas) en aproximadamente 90 segundos (porque realmente están probando "unidades" y, por lo tanto, son muy rápidas). La regla que tenemos es que no podemos confirmar el código cuando falla una prueba.

Además, ¿no le gustaría poder ejecutar una integración automatizada o pruebas de extremo a extremo en su código y detectar problemas que las pruebas unitarias no detectarán?

No querrás ejecutarlos en cajas de desarrollo, porque sería un problema configurar y mantener ese entorno. Las pruebas de integración también tienden a ser muy lentas de ejecutar.

¿En qué punto es útil?

Es una inversión como cualquier otra.

Úselo una vez y podría quedarse atrás o solo alcanzar el equilibrio. Úselo en múltiples proyectos y probablemente saldrá adelante.

También depende del tipo de aplicaciones que realice.

Si crea aplicaciones web que deben implementarse en un servidor de aplicaciones Java, o IIS, CI se convierte en una obviedad. Lo mismo si tiene una base de datos como parte de su proyecto. La implementación es dolorosa de ejecutar manualmente, y su equipo de control de calidad (si tiene uno) la necesitará tan a menudo como a diario en algún momento.

Además, es posible que desee ver cómo se alinean sus necesidades y problemas con los 12 pasos para mejorar el código de Joel Spolsky . Particularmente 2, 3 y 10 (aunque todos son interesantes e importantes).

Merlyn Morgan-Graham
fuente
2
+1 ... OK ahora me estás hablando! El argumento de "no perder tiempo haciendo compilaciones" me gusta mucho. Nuestra compilación se realiza varias veces al día y solo requiere un clic, pero ... es más lento que ejecutar todas las pruebas (por lo que los desarrolladores pierden tiempo). Además, me gusta la idea de pruebas más complicadas: esto veo cómo podríamos beneficiarnos de un servidor CI. Con respecto a 2,3 y 10: sí, sí y sí (un solo clic en una tarea Ant) ... Pero hombre, estas 12 reglas deberían actualizarse: ¿utiliza el control de fuente? Prefiero tener no CVS, por ejemplo; ) (solo medio broma;)
Cedric Martin el
7

¿En qué punto es útil?

  • Su ciclo de compilación + prueba dura unos minutos. Con una prueba de 5 minutos, ya no querrá ejecutar todas las pruebas usted mismo, especialmente para pequeños cambios.
  • Empiezas a construir múltiples variantes. Si tiene un par de clientes con diferentes personalizaciones, debe ejecutar las pruebas para cada variante, por lo que la cantidad de trabajo comenzará a crecer bastante rápido. Luego ejecutaría el conjunto de pruebas para una variante en la máquina del desarrollador y dejaría que CI lo ejecutara en el resto.
  • Escribe pruebas de integración automatizadas que necesitan una configuración de entorno de prueba no trivial. De lo que desea probar en un entorno de prueba canónico, ya que los desarrolladores pueden modificar su entorno de varias maneras debido a los cambios de desarrollo. El CI es el lugar más adecuado para el entorno canónico.
  • Los probadores pueden simplemente extraer la última compilación de CI. Por lo tanto, no necesitan tener, aprender y usar las herramientas de desarrollo ni ningún desarrollador tiene que enviarles su compilación manualmente.
  • Cuando te estés preparando para el lanzamiento:
    • La prueba se vuelve más importante, por lo que tener un lugar con compilaciones preparadas para la prueba es aún más útil.
    • Está seguro de que todas las compilaciones se compilan con el mismo entorno de compilación, por lo que evita los problemas que pueden presentarse por diferencias sutiles entre las instalaciones del desarrollador.
    • Está seguro de que está creando exactamente lo que se verifica en el sistema de control de versiones. Durante el desarrollo, si alguien olvida registrar algo, lo encontrará con bastante rapidez, ya que fallará para el próximo desarrollador. Pero si dicha compilación se deslizara a QA o producción y reportaran un error, sería muy difícil de rastrear.

Probablemente todavía no necesite CI, pero creo que será útil cuando llegue a la fase de prueba. Jenkins se configura en pocas horas y simplificará sus pruebas y ayudará a evitar errores tontos (eso sucede especialmente cuando se apura una solución rápida a la producción).

Jan Hudec
fuente
+1, gracias. Pero el argumento de la construcción nunca lo entendí realmente: ¿no es la aplicación más robusta cuando todos los desarrolladores pueden verificar cualquier rev y construir exactamente la misma compilación, cada una en su máquina? ¿No estamos simplemente cambiando el problema de "compilaciones vinculadas a la cuenta de un desarrollador" a "compilaciones vinculadas al servidor de CI" ? Quiero decir: el servidor de CI en sí puede estar configurado incorrectamente y, por lo tanto, la construcción depende de la sutil diferencia de la instalación del servidor de CI. Dicho esto, me doy cuenta de que puede ser útil: creo que solo necesito "instalarlo y ver"
:)
@CedricMartin: el servidor de CI es solo uno, por lo que no tendrá errores introducidos por la diferencia entre los entornos en los que hizo esto y la compilación anterior y, dado que no realiza otro trabajo en el servidor de CI, es menos probable que lo rompa .
Jan Hudec
@CedricMartin: Obviamente, si el servidor CI está mal configurado, notará que las compilaciones se comportan de manera diferente a las que se realizan en los cuadros de desarrollador, ya que los desarrolladores compilarán por sí mismos todo el tiempo. Más fácilmente que cuando una caja de desarrollador en particular está mal configurada, ya que más personas pueden notarlo.
Jan Hudec
6

Para mí, un CI se vuelve interesante si su equipo tiene más de 1 miembro.

Tienes que dejar de pensar en CI como "otra PC que ejecuta las pruebas por mí". CI sobre tener un proceso de construcción y gestión de versiones definido y automatizado .

CI es la única entidad autorizada que crea su versión de software. Si no se basa en el CI, simplemente no sucedió.

Con un CI tiene restricciones para automatizar todo lo que le mostrará todos los ajustes manuales, hacks y accesos directos que tiene en su lugar y simplemente no funciona con un CI y debe evitarse en primer lugar.

Problemas que evita:

  • ¿Quién es responsable de construir el lanzamiento?
  • ¿Esta persona está disponible 24/7
  • Pero se basa en el síndrome de mi máquina
  • Elimina toda ambigüedad sobre la versión que lanzamos.

Ventajas (demasiadas para mencionar todas):

  • Numeración automatizada de versiones
  • Integración de seguimiento de problemas
  • Generación métrica automatizada
  • Análisis de código estático
  • Despliegue automatizado
  • Configuraciones de etapas múltiples
OliverS
fuente
5

Hay un problema fundamental acerca de la Integración Continua (CI) que se refleja perfectamente en su pregunta: las prácticas de CI son difíciles de implementar y defender porque el software del servidor de CI no es trivial de configurar, ni es trivial para que sus proyectos funcionen a través de un CI servidor. Con esto, se hace difícil ver dónde está la ganancia de adoptar CI en absoluto.

En primer lugar, CI se trata de una visión y calidad. Good CI lo acerca a su proyecto, le brinda retroalimentación adecuada sobre métricas de calidad, documentación, cumplimiento de estándares de codificación, etc. Debe proporcionarle las herramientas para visualizar fácilmente todo esto y permitirle reconocer de un vistazo y fácilmente asocie un conjunto de cambios con una instantánea específica de todas estas métricas del proyecto.

No se trata solo de ejecutar pruebas unitarias. ¡De ningún modo! Lo que me lleva a la calidad. CI acepta errores, no los evita ni los tira. Lo que hace es simplemente proporcionarle una herramienta para error desde el principio, en lugar de más adelante. Por lo tanto, realmente no confirma el código probado previamente en un servidor CI. Aunque debe esforzarse por confirmar un código limpio y no roto, en realidad usa el servidor CI para ejecutar automáticamente un generador de integración automáticamente a través de su código y hacer que evalúe si todo salió bien. Si es así, ordenado! Si no lo ha hecho, no hay problema: las buenas prácticas de CI establecen que su próxima prioridad debería ser solucionar lo que se ha roto. Lo cual, en un buen servidor de CI, debería ser fácil de señalar para usted.

A medida que aumenta el tamaño de un equipo, la integración del código de todos naturalmente se vuelve más difícil. Debería ser tarea de un servidor de CI centralizado probar todas las partes integradas y quitar esa carga de los miembros del equipo. Por lo tanto, debe hacer que todos se comprometan temprano (y de la manera más limpia posible) y luego monitoreen el estado de las compilaciones (generalmente hay notificaciones involucradas). Y de nuevo, si algo se rompe debido a la confirmación de algún desarrollador, inmediatamente se convierte en su responsabilidad corregirlo y hacer que esas compilaciones automatizadas vuelvan a estar en estado OK inmediatamente.

Entonces, en mi opinión, cada proyecto se beneficia de estar continuamente integrado. La cuestión es que, hasta ahora y debido a la complejidad alucinante de cada servidor de CI que conozco, la gente realmente rechazó las prácticas de CI en proyectos más pequeños / simples. Porque, vamos, las personas tienen mejores cosas que hacer que pasar días configurando un software feo, demasiado complejo, poco entregado e inflado.

Tuve exactamente el mismo problema, y ​​eso es lo que me hizo desarrollar Cintient en mi tiempo libre desde hace aproximadamente un año. Mi premisa era simplificar la instalación, la configuración y el uso, y hacer que cumpliera con las métricas de calidad que casi todos fallan o no cumplen. Entonces, después de esta larga respuesta viene mi descarado complemento de señalar el enlace de GitHub para el proyecto (que es gratuito y de código abierto, natch). También tiene algunas buenas capturas de pantalla, al parecer. :-) https://github.com/matamouros/cintient

Espero haberte ayudado.

(NOTA: Editado después del comentario de Bryan Oakley, sobre el hecho de que debería haber tomado más tiempo para elaborar una mejor respuesta. También creo que tenía razón).

matamouros
fuente
Voté en contra porque esto no responde la pregunta, es solo un anuncio. Nunca abordar los cuando parte de la pregunta que no sea de forma implícita implica "ahora, con mi función".
Bryan Oakley el
Me tomé un tiempo para editar la respuesta, como lo sugirió @ bryan-oakley.
matamouros
@matamouros: buen trabajo en la edición.
Bryan Oakley