
La integración continua ( IC ) es la práctica de integrar cambios en el código fuente con frecuencia y asegurar que la base de código integrada se encuentre en un estado funcional. Normalmente, los desarrolladores fusionan los cambios en una rama de integración , y un sistema automatizado compila y prueba el sistema de software . [ 1 ] A menudo, el proceso automatizado se ejecuta con cada confirmación o según un cronograma, como una vez al día. Grady Booch propuso por primera vez el término IC en 1991 , [ 2 ] aunque no abogaba por la integración varias veces al día, pero posteriormente, la IC llegó a incluir ese aspecto. [ 3 ]
Historia
El primer trabajo conocido (1989) sobre integración continua fue el entorno Infuse desarrollado por GE Kaiser, DE Perry y WM Schell. [ 4 ]
En 1994, Grady Booch utilizó la frase integración continua en Análisis y diseño orientado a objetos con aplicaciones (2.ª edición) [ 5 ] para explicar cómo, al desarrollar utilizando microprocesos, "las versiones internas representan una especie de integración continua del sistema y existen para forzar el cierre del microproceso".
En 1997, Kent Beck y Ron Jeffries inventaron la programación extrema (XP) mientras trabajaban en el proyecto del Sistema Integral de Compensación de Chrysler , que incluía la integración continua. [ 1 ] Beck publicó sobre integración continua en 1998, haciendo hincapié en la importancia de la comunicación cara a cara sobre el soporte tecnológico. [ 6 ] En 1999, Beck profundizó en el tema en su primer libro completo sobre Programación Extrema. [ 7 ] CruiseControl , una de las primeras herramientas de CI de código abierto, [ 8 ] se lanzó en 2001.
En 2010, Timothy Fitz publicó un artículo que detallaba cómo el equipo de ingeniería de IMVU había construido y estado utilizando el primer sistema práctico de CD . Si bien su publicación fue recibida inicialmente con escepticismo, rápidamente se popularizó y se adoptó ampliamente [ 9 ] como parte de la metodología de desarrollo de software lean , también basada en IMVU.
Prácticas
Las actividades principales de la integración continua (CI) consisten en que los desarrolladores coloquen con frecuencia los cambios de código en un área de integración compartida y que el código fuente resultante se verifique para comprobar su corrección. La primera parte generalmente implica la fusión de los cambios en una rama común de control de versiones. La segunda parte generalmente implica procesos automatizados, como la compilación, las pruebas y muchos otros.
Normalmente, un servidor realiza compilaciones desde el área de integración con frecuencia, es decir, después de cada confirmación o periódicamente, como una vez al día. El servidor puede realizar comprobaciones de control de calidad , como ejecutar pruebas unitarias [ 10 ] , y recopilar métricas de calidad del software mediante procesos como el análisis estático y las pruebas de rendimiento.
Automatización de compilaciones
La automatización de compilaciones es una buena práctica. [ 11 ] [ 12 ] Las herramientas de automatización de compilaciones automatizan la compilación.
Los defensores de la integración continua recomiendan que un solo comando tenga la capacidad de construir el sistema.
La automatización suele incluir la automatización de la integración, que a menudo comprende el despliegue en un entorno similar al de producción . En muchos casos, el script de compilación no solo compila binarios, sino que también genera documentación, páginas web, estadísticas y medios de distribución (como archivos DEB de Debian , RPM de Red Hat o MSI de Windows).
Confirmaciones atómicas
La integración continua (CI) requiere que el sistema de control de versiones admita confirmaciones atómicas ; en otras palabras, todos los cambios de un desarrollador se gestionan como una única confirmación.
Comprometer cambios
Al realizar un cambio en el código, un desarrollador crea una rama que es una copia del código base actual . A medida que se confirman otros cambios en el repositorio , esta copia diverge de la última versión.
Cuanto más tiempo se prolongue el desarrollo en una rama sin fusionarla con la rama de integración, mayor será el riesgo de múltiples conflictos de integración [ 13 ] y fallos cuando finalmente se fusione la rama del desarrollador. Cuando los desarrolladores envían código al repositorio, primero deben actualizarlo para reflejar los cambios realizados en el repositorio desde que obtuvieron su copia. Cuantos más cambios contenga el repositorio, más trabajo deberán realizar los desarrolladores antes de enviar sus propios cambios.
Con el tiempo, el repositorio puede volverse tan diferente de las líneas base de los desarrolladores que entran en lo que a veces se denomina "infierno de fusión" o "infierno de integración" [ 14 ] , donde el tiempo que lleva integrar excede el tiempo que les llevó realizar sus cambios originales. [ 15 ]
Realizando pruebas localmente
Los defensores de la integración continua sugieren que los desarrolladores utilicen el desarrollo guiado por pruebas y se aseguren de que todas las pruebas unitarias se ejecuten correctamente de forma local antes de confirmar los cambios en la rama de integración, para que el trabajo de un desarrollador no dañe la copia de otro.
Las funciones incompletas se pueden deshabilitar antes de confirmar los cambios, utilizando interruptores de funciones .
Entrega continua y despliegue continuo
La entrega continua garantiza que el software registrado en una rama de integración esté siempre en un estado que permita su despliegue a los usuarios, y el despliegue continuo automatiza el proceso de despliegue.
La entrega continua y el despliegue continuo a menudo se realizan junto con la integración continua (CI) y, en conjunto, forman una canalización de CI/CD.
Control de versiones
Los defensores de la integración continua recomiendan almacenar todos los archivos e información necesarios para la compilación en un sistema de control de versiones (en el caso de Git , un repositorio ), y que el sistema se pueda compilar desde una copia nueva sin necesidad de dependencias adicionales.
Martin Fowler recomienda que todos los desarrolladores se comprometan con la misma rama de integración. [ 16 ]
Comprométete con frecuencia
Los desarrolladores pueden reducir el esfuerzo de resolver cambios conflictivos sincronizándolos entre sí con frecuencia, al menos diariamente. Registrar el trabajo de una semana conlleva el riesgo de conflictos, tanto por la probabilidad de que ocurran como por la complejidad de su resolución. Los conflictos relativamente pequeños son significativamente más fáciles de resolver que los grandes. Integrar (confirmar) los cambios al menos una vez al día se considera una buena práctica, y con mayor frecuencia, mejor. [ 17 ]
compilación diaria
Generalmente se recomienda construir a diario , o incluso con mayor frecuencia. [ 18 ]
Cada confirmación debe ser construida
El sistema debe generar confirmaciones en la versión de trabajo actual para verificar que se integren correctamente. Una práctica común es usar la integración continua automatizada, aunque también se puede hacer manualmente. La integración continua automatizada emplea un servidor o demonio de integración continua para monitorear el sistema de control de versiones en busca de cambios y luego ejecutar automáticamente el proceso de compilación.
Cada confirmación de corrección de errores debe venir acompañada de un caso de prueba.
Al corregir un error, es recomendable implementar un caso de prueba que lo reproduzca. Esto evita que la corrección se revierta y que el error reaparezca, lo que se conoce como regresión.
Mantén la construcción rápida
Es necesario que la compilación finalice rápidamente para que, si surge algún problema de integración, se identifique con prontitud.
Realizar pruebas en un clon del entorno de producción.
Disponer de un entorno de pruebas puede provocar fallos en los sistemas probados al implementarlos en el entorno de producción, ya que este último puede diferir significativamente del de pruebas. Sin embargo, crear una réplica del entorno de producción resulta prohibitivo en términos de costes. En su lugar, el entorno de pruebas o un entorno de preproducción independiente ("staging") debería diseñarse como una versión escalable del entorno de producción para reducir costes, manteniendo al mismo tiempo la composición y las particularidades de la pila tecnológica . En estos entornos de pruebas, se suele utilizar la virtualización de servicios para obtener acceso bajo demanda a dependencias (por ejemplo, API, aplicaciones de terceros, servicios, mainframes , etc.) que están fuera del control del equipo, aún en desarrollo o son demasiado complejas para configurarlas en un laboratorio de pruebas virtual.
Facilita la obtención de los últimos resultados.
Facilitar el acceso a las versiones compiladas a las partes interesadas y a los evaluadores puede reducir la cantidad de trabajo adicional necesario al reconstruir una función que no cumple con los requisitos. Además, las pruebas tempranas disminuyen las probabilidades de que los defectos persistan hasta el despliegue. Detectar los errores con anticipación reduce el trabajo necesario para resolverlos.
Todos los programadores deberían comenzar el día actualizando el proyecto desde el repositorio. De esa forma, todos estarán al día.
Todos pueden ver los resultados de la última compilación.
Debería ser fácil averiguar si la compilación falla y, en caso afirmativo, quién realizó el cambio pertinente y cuál fue ese cambio.
Automatice la implementación
La mayoría de los sistemas de integración continua (CI) permiten ejecutar scripts una vez finalizada la compilación. En la mayoría de los casos, es posible escribir un script para desplegar la aplicación en un servidor de prueba en vivo que todos puedan consultar. Un avance adicional en este enfoque es el despliegue continuo , que requiere que el software se despliegue directamente en producción, a menudo con automatización adicional para prevenir defectos o regresiones. [ 19 ] [ 20 ]
Beneficios
Los beneficios de CI incluyen:
- Facilita la detección temprana de errores
- Reduce el esfuerzo para encontrar la causa de los errores; si una prueba de CI falla, entonces los cambios desde la última compilación correcta deben haber causado la falla, y si se compila después de cada cambio, entonces exactamente un cambio es la causa [ 1 ].
- Evita el caos que supone integrar muchos cambios.
- Cuando una prueba falla o se encuentra un error, revertir el código a un estado correcto resulta en menos cambios perdidos.
- Disponibilidad frecuente de una versión de prueba fiable para realizar pruebas, demostraciones y lanzamientos.
- Las confirmaciones de código frecuentes fomentan un código modular y menos complejo [ 21 ].
- Comentarios rápidos sobre el impacto de los cambios en el código en todo el sistema.
- Admite la recopilación de métricas de software como la cobertura de código y la complejidad del código .
Riesgos
Los riesgos de la insuficiencia cardíaca incluyen:
- La configuración del sistema de compilación requiere esfuerzo [ 22 ]
- Escribir y mantener un conjunto de pruebas automatizadas requiere esfuerzo.
- El valor añadido depende de la calidad de las pruebas [ 23 ].
- La alta latencia de compilación (estar en cola) limita el valor [ 23 ]
- Implica que el código incompleto no debe integrarse, lo cual es contrario a la práctica preferida de algunos desarrolladores [ 23 ].
- La garantía de seguridad y desarrollo de misión crítica (por ejemplo, DO-178C , ISO 26262 ) requiere documentación y revisión que puede ser difícil de lograr.
Mejores prácticas para sistemas en la nube
Las siguientes prácticas pueden mejorar la productividad de las canalizaciones , especialmente en sistemas alojados en la nube : [ 24 ] [ 25 ] [ 26 ]
- Número de pipelines : Los equipos pequeños pueden ser más productivos al tener un único repositorio y un único pipeline. En cambio, las organizaciones más grandes pueden tener repositorios y pipelines separados para cada equipo, o incluso repositorios y pipelines separados para cada servicio dentro de un equipo.
- Permisos : En el contexto de los permisos relacionados con las canalizaciones , cumplir con el principio de mínimo privilegio puede resultar complicado debido a la naturaleza dinámica de la arquitectura . Los administradores pueden optar por permisos más permisivos, implementando al mismo tiempo controles de seguridad compensatorios para minimizar el impacto.
Véase también
- Automatización de la publicación de aplicaciones : proceso de empaquetado e implementación. Páginas que muestran breves descripciones de los destinos de redireccionamiento.
- Indicador luminoso de construcción
- Comparación de software de integración continua
- Diseño continuo – Proceso de diseño
- Pruebas continuas : proceso de pruebas automatizadas en el desarrollo de software.
- Integración continua multietapa : técnica de desarrollo de software
- Desarrollo rápido de aplicaciones : concepto de desarrollo de software
Referencias
- 1 2 3 Fowler, Martin (1 de mayo de 2006). "Integración continua" . Recuperado el 9 de enero de 2014 .
- ↑ Booch, Grady (1991). Diseño orientado a objetos: con aplicaciones . Benjamin Cummings . pág. 209. ISBN 9780805300918Consultado el 18 de agosto de 2014 .
- ↑ Beck, K. (1999). "Aceptando el cambio con programación extrema". Computer . 32 (10): 70– 77. doi : 10.1109/2.796139 . ISSN 0018-9162 .
- ↑ Kaiser, GE; Perry, DE; Schell, WM (1989). Infuse: fusionando la gestión de pruebas de integración con la gestión de cambios . Actas de la Decimotercera Conferencia Internacional Anual sobre Software y Aplicaciones Informáticas. Orlando, Florida. págs. 552–558 . CiteSeerX 10.1.1.101.3770 . doi : 10.1109/CMPSAC.1989.65147 .
- ↑ Booch, Grady (diciembre de 1998). Análisis y diseño orientado a objetos con aplicaciones (PDF) (2.ª ed.). Archivado del original (PDF) el 19 de agosto de 2019. Recuperado el 2 de diciembre de 2014 .
- ↑ Beck, Kent (28 de marzo de 1998). «Programación extrema: una disciplina humanística del desarrollo de software» . Enfoques fundamentales de la ingeniería de software: Primera Conferencia Internacional . Vol. 1. Lisboa, Portugal: Springer . pág. 4. ISBN 9783540643036.
- ↑ Beck, Kent (1999). Programación extrema explicada . Addison-Wesley Professional. pág . 97. ISBN 978-0-201-61641-5.
- ↑ "Una breve historia de DevOps, Parte III: Pruebas automatizadas e integración continua" . CircleCI . 1 de febrero de 2018. Consultado el 19 de mayo de 2018 .
- ↑ Sane, Parth (2021), "Una breve reseña de las prácticas actuales de ingeniería de software en integración continua y pruebas automatizadas de accesibilidad", Sexta Conferencia Internacional de 2021 sobre Comunicaciones Inalámbricas, Procesamiento de Señales y Redes (WiSPNET) , págs. 130–134 , arXiv : 2103.00097 , doi : 10.1109/WiSPNET51692.2021.9419464 , ISBN 978-1-6654-4086-8, S2CID 232076320
- ↑ Radigan, Dan. "Integración continua" . Atlassian Agile Coach .
- ↑ Brauneis, David (1 de enero de 2010). " [ OSLC ] Posible nuevo grupo de trabajo – Automatización" . Comunidad open-services.net (lista de correo). Archivado del original el 1 de septiembre de 2018. Recuperado el 16 de febrero de 2010 .
- ↑ Taylor, Bradley. "Despliegue y automatización de Rails con ShadowPuppet y Capistrano" . Rails machine ( blog ) . Consultado el 16 de febrero de 2010 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ Duvall, Paul M. (2007). Integración continua. Mejora de la calidad del software y reducción de riesgos . Addison-Wesley. ISBN 978-0-321-33638-5.
- ↑ Cunningham, Ward (5 de agosto de 2009). "Integration Hell" . WikiWikiWeb . Consultado el 19 de septiembre de 2009 .
- ↑ "¿Qué es la integración continua?" . Amazon Web Services .
- ↑ Fowler, Martin . "Prácticas" . Integración continua (artículo) . Consultado el 29 de noviembre de 2015 .
- ↑ Paul M. Duvall; Steve Matyas; Andrew Glover (2007). Integración continua: Mejora de la calidad del software y reducción de riesgos . Addison-Wesley Professional . ISBN 978-0-321-33638-5.
- ↑ Memon, AM; Xie, Q. (2005). "Estudio de la efectividad de la detección de fallas de los casos de prueba de GUI para software en rápida evolución". IEEE Transactions on Software Engineering . 31 (10): 884– 896. doi : 10.1109/TSE.2005.117 . ISSN 0098-5589 .
- ↑ Ries, Eric (30 de marzo de 2009). "Despliegue continuo en 5 sencillos pasos" . Radar . O'Reilly . Consultado el 10 de enero de 2013 .
- ↑ Fitz, Timothy (10 de febrero de 2009). "Despliegue continuo en IMVU: Hacer lo imposible cincuenta veces al día" . Wordpress . Recuperado el 10 de enero de 2013 .
- ↑ Junpeng, Jiang; Zhu, Can; Zhang, Xiaofang (julio de 2020). "Un estudio empírico sobre el impacto del colaborador de código en el olor del código" (PDF) . Revista Internacional de Ingeniería de Rendimiento . 16 (7): 1067– 1077. doi : 10.23940/ijpe.20.07.p9.10671077 . S2CID 222588815 .
- ↑ Laukkanen, Eero (2016). "Problemas, causas y soluciones al adoptar la entrega continua: una revisión sistemática de la literatura" . Information and Software Technology . 82 : 55–79 . doi : 10.1016/j.infsof.2016.10.001 .
- 1 2 3 Debbiche, Adam. "Evaluación de los desafíos de la integración continua en el contexto de la ruptura de los requisitos de software: un estudio de caso" (PDF) .
- ↑ Arquitecturas sin servidor en AWS . Manning. 29 de marzo de 2022. ISBN 978-1617295423.
- ↑ Pipeline como código: Entrega continua con Jenkins, Kubernetes y Terraform . Manning. 23 de noviembre de 2021. ISBN 9781638350378.
- ↑ Humble, Jez; Farley, David (27 de julio de 2010). Entrega continua: Lanzamientos de software confiables mediante la automatización de compilación, prueba e implementación . Pearson Education. ISBN 9780321670229.
Enlaces externos
- "Integración Continua" (wiki) (una discusión entre colegas). C2.
{{cite journal}}: Para citar una revista se requiere|journal=( ayuda ) - Richardson, Jared. "Integración continua: la piedra angular de un gran taller" (introducción).
- Flowers, Jay. "Una receta para la mantenibilidad y reutilización de la construcción" . Archivado del original el 25 de junio de 2020. Recuperado el 28 de mayo de 2006 .
- Duvall, Paul (4 de diciembre de 2007). "El desarrollador trabaja" . IBM .
- Ciclo de vida de las versiones . MediaWiki. Junio de 2024.
- Integración continua
- Desarrollo ágil de software
- Programación extrema
- proceso de desarrollo de software