Pregunta

¿Qué constituye un buen proceso de construcción de CI?

Usamos CI, pero la implementación en producción es incluso un objetivo de CI realista cuando hay dependencias de varios servicios que también deben implementarse y otras aplicaciones pueden depender de estos también.

¿Es un buen proceso de construcción de CI lo suficientemente bueno cuando se automatiza el control de calidad y se realiza manualmente desde allí?

¿Fue útil?

Solución

Bueno, eso depende" :)

Usamos nuestro sistema CI para:

  1. construcción y prueba unitaria
  2. implementar en una sola caja, ejecutar pruebas de integración y análisis de código
  3. implementar en el entorno del laboratorio
  4. ejecutar pruebas de aceptación en un sistema similar a un producto
  5. soltar compilaciones que pasan al código soltar para la implementación de productos

Esto es para un proyecto totalmente nuevo de aproximadamente una docena de servicios y bases de datos implementados en más de 20 servidores, que también dependían de media docena de otros servicios "externos".

¿Utilizar una herramienta de CI para implementar su producto en un entorno de producción es un objetivo realista?de nuevo..."Eso depende"

Por qué querrías hacer esto?

  • Si tiene el proceso, puede revertir los cambios (y revertirlos) más rápido y con más frecuencia.
  • menos posibilidades de error humano
  • puede probar la misma estrategia de implementación en un entorno de prueba antes de pasar a producción y detectar problemas antes

Algunas cosas técnicas que debes abordar antes de poder responder esto:

  • ¿Cuáles son los requisitos de tiempo de actividad para su sistema? ¿Se le permite tener tiempo de inactividad o debe estar activo las 24 horas del día, los 7 días de la semana?
  • ¿Tiene implementados procesos de control de cambios que requieran intervención/aprobación humana?
  • ¿Su implementación es lo suficientemente sólida como para que cualquier componente vuelva a un estado correcto conocido si falla una implementación?
  • ¿Su sistema está diseñado para manejar diferentes versiones de servicios o clientes en caso de que falle una o varias implementaciones de componentes (y tiene la reversión anterior al último estado bueno conocido)?
  • ¿Tiene el proceso la inteligencia para manejar una implementación parcial donde un componente no puede manejar versiones mixtas de sus dependencias/clientes?
  • ¿Cómo está manejando la implementación/actualizaciones de la base de datos?
  • ¿Tiene un sistema de monitoreo para saber cuando algo sale mal?

Aquí hay un par de enlaces recientes relacionados sobre automatización y construyendo las herramientas que necesitas.

A fin de cuentas, cuanto más complejo sea su sistema, más difícil será automatizar todo, pero eso no significa que no sea un objetivo que valga la pena, simplemente requiere mucho más esfuerzo y fuerza de voluntad para lograrlo: todo, desde saber las dificultades que vas a afrontar, los problemas que tienes que afrontar (fracaso voluntad suceder), los desafíos políticos de la construcción de infraestructura (vs.más características del producto).

Ahora aquí está el gran secreto...Los desafíos técnicos son desafiantes pero no imposibles...el político Los desafíos pueden ser insuperables.Todo lo relacionado con esto cuesta dinero, ya sea tiempo de desarrollo o compra de soluciones de terceros.Entonces, ¿realmente puedes construir la solución de $1,000, $10,000, $100,000 o $1 millón?

Cualquiera que sea la solución que elija, asegúrese de que la automatización sea sólida en primer lugar y, en segundo lugar, completa...es decir.asegúrese de tener una solución lo más sólida posible para implementar la implementación en un entorno de prueba en lugar de una solución frágil que se implemente en producción.

Otros consejos

La CI no pretende ser un mecanismo de implementación.Él es Es bueno que su CI ejecute cualquier implementación automatizada en un servidor de prueba/control de calidad, para garantizar que esos aspectos de su compilación funcionen, pero no usaría un sistema de CI como Cruise Control o Bamboo como medio de implementación.

CI sirve para construir el código base periódicamente para automatizar la ejecución de pruebas automatizadas, la verificación del código base mediante análisis estático y otras comprobaciones de esa naturaleza.

Asegúrese de comprender la idea detrás de una compilación de CI.CI significa Integración Continua y las compilaciones de CI en realidad están destinadas a ser compilaciones desechables que se realizan cuando un desarrollador ingresa el código en el sistema de control de fuente (o en algún intervalo específico) para garantizar que los cambios más recientes no rompan la base del código. (de ahí la idea de integrar continuamente los cambios en el código base).

Con ese fin, la tecnología utilizada para el proceso de construcción del servidor real es en gran medida irrelevante en comparación con lo que realmente sucede durante la construcción.Como mencionó @pdavis, la compilación de CI debe compilar la base del código, ejecutar algunos análisis de código (FxCop, StyleCop, Lint, etc.), ejecutar pruebas unitarias y cobertura de código, y ejecutar cualquier otro análisis personalizado que desee realizar y que deba afectar el concepto. de una construcción "exitosa" o "fallida".

Hacer que una compilación de CI se implemente automáticamente en un entorno realmente no está bajo el control de un servidor de compilación.Dicho esto, siempre puedes crear un proyecto separado que se ejecute en el servidor de compilación que maneja la implementación cuando detecta ciertas condiciones (como que una compilación se complete exitosamente), pero eso siempre debe hacerse como algo completamente independiente.

Estoy empezando un nuevo proyecto en el trabajo que tengo muchas ganas.Todavía estamos en la etapa de diseño inicial y recientemente completamos la arquitectura del sistema lógico.Hemos ordenado nuevos servidores para los entornos de prueba y preparación y estamos configurando un sistema de compilación de integración continua (CI) basado en control de crucero (http://cruisecontrol.sourceforge.net/) y MSBuild (http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx) que es básicamente una versión mejorada de ANT.Parece que los archivos de proyecto y solución de Visual Studio 2005 ahora están todos en formato MSBuild.Cruise Control extraerá automáticamente la fuente de Visual Source Safe (vale, no es Subversion pero podemos manejarlo), la compilará y luego la ejecutará a través de fxCop (http://www.gotdotnet.com/Team/FxCop/), nUnidad (http://www.nunit.org/), nCubrir (http://ncover.org/site/), y por último, pero no arrendamiento, Simian (http://www.redhillconsulting.com.au/products/simian/).Cruise Control tiene una interfaz de sitio web bastante buena para mostrar todos los resultados compilados de las distintas herramientas e incluso puede mostrar cambios de código de una compilación a la siguiente.También realiza un seguimiento de todas las compilaciones en un historial de compilaciones.Espero con ansias el desarrollo basado en pruebas y creo que este tipo de enfoque combinado con nUnit/nCover debería darnos una idea bastante clara antes de implementar cambios de que no hemos roto nada.También hay planes para incorporar algún tipo de prueba automatizada de interfaz de usuario una vez que estemos lo suficientemente avanzados en el proyecto.Dependiendo de la herramienta, esto debería ser solo una cuestión de instalar la herramienta en el servidor de compilación y llamarla desde Cruise Control.Dulce.

Un buen proceso de CI tendrá una cobertura de pruebas unitarias total o casi completa.Pruebas unitarias, clases y métodos de prueba, vs.pruebas de integración, que prueban múltiples partes del sistema.Cuando configure sus compilaciones de CI, pídales que automaticen las pruebas unitarias.De esa manera, las compilaciones de CI pueden ejecutarse varias veces al día.Tenemos el nuestro configurado para funcionar cada 2 horas.

Puede tener compilaciones de ejecución más larga que se ejecutan una vez al día.Estos pueden utilizar otros servicios y ejecutar pruebas de integración.

Estaba viendo una presentación de ThoughtWorks (creadores de Cruise Control) y de hecho abordaron este tema.Su respuesta es que NINGUNA implementación es demasiado compleja para probarla.¿Por qué?Porque de lo contrario, tus clientes se convertirán en tus evaluadores, que es exactamente donde no quieres estar.

Si tiene una estructura de implementación compleja, configure un servidor de visualización.Haga que pretenda ser todos los sistemas con los que necesita hablar.Siempre pueden comenzar en un buen estado conocido, porque puedes restablecerlos a una imagen limpia.

Para responder a su pregunta inicial, un buen proceso es aquel que permite la comunicación entre el repositorio y los desarrolladores.Si el repositorio está en mal estado (código no compilado, pruebas fallidas, etc.), los desarrolladores lo saben lo antes posible para poder corregirlo.

Cuanto más tarde se descubre un error, más costoso será solucionarlo.Por lo tanto, los errores deben descubrirse lo antes posible.Ésta es la motivación detrás de la CI.

Un buen CI debería garantizar la detección de tantos errores como sea posible.Toda la aplicación se compone de código (a menudo en varios idiomas), esquema de base de datos, archivos de implementación, etc.Los errores en cualquiera de estos pueden causar errores, por lo que el CI debe intentar ejecutar tantos como sea posible.

La CI no reemplaza una disciplina de control de calidad adecuada.Además, la CI no necesita ser muy completa el primer día del proyecto.Se puede comenzar con un proceso de CI simple que inicialmente realice pruebas unitarias y de compilación básicas.A medida que descubra más clases de errores en el control de calidad, deberá adaptar el proceso de CI para intentar detectar futuras apariciones de esos errores.También puede implicar comprobaciones de análisis de código estático, de modo que pueda implementar ideales de codificación y diseño consistentes en todo el código base.

¿Es un buen proceso de construcción de CI lo suficientemente bueno cuando se automatiza el control de calidad y se realiza manualmente desde allí?

Creo que esa implementación "manual" se utiliza cuando la persona con rol de ingeniero de implementación tiene miedo de que algo después de la implementación pueda salir mal.No tiene confianza en la confiabilidad y estabilidad de las herramientas de implementación.

Esta hazaña puede desaparecer con las pruebas del proceso de implementación automatizado en un entorno similar a un producto. También debe probar un mecanismo de reversión después de la implementación.

Cuando estas funciones se prueben lo suficiente, obtendrá confianza en este proceso y en la herramienta que utiliza.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top