Integración Continua, Entrega Continua y Despliegue Continuo, ¿Qué, cuándo y cómo?

En la actualidad, estas palabras suenan y se ven mucho cuando lees artículos, conoces alguna herramienta, concepto o en una que otra conferencia. Pero, ¿qué son? La verdad puede ser un poco confuso porque las diferencias son en realidad un toque mínimas.

Intentaré explicar un poco cada una, apoyándome en los textos donde se explican un poco mejor.

Integración Continua o Continuous Integration

Para ponerlo de la forma más sencilla, la integración continua es cuando un desarrollador puede integrar sus cambios, de manera continua (diferente a frecuente), en el repositorio de código. Y con integrar quiere decir que los cambios introducidos no dañen ni afecten el código existente ni que el mismo programador tenga que intervenir sustancialmente en el proceso.

La integración continua es una práctica de desarrollo de software mediante la cual los desarrolladores combinan los cambios en el código en un repositorio central de forma periódica, tras lo cual se ejecutan versiones y pruebas automáticas. La integración continua se refiere en su mayoría a la fase de creación o integración del proceso de publicación de software y conlleva un componente de automatización (p. ej., CI o servicio de versiones) y un componente cultural (p. ej., aprender a integrar con frecuencia). Los objetivos clave de la integración continua consisten en encontrar y arreglar errores con mayor rapidez, mejorar la calidad del software y reducir el tiempo que se tarda en validar y publicar nuevas actualizaciones de software.

Fuente AWS

Un ejemplo claro de esto se da en algunos proyectos open source hospedados en Github. Hay algunos donde la integración de código la hacen servicios como TravisCI o CircleCI, y lo que hacen es tomar la base del código + los cambios agregados, correr los tests y determinar si todo está en orden o no. Esto ayuda a que quienes hacen mantenimiento de los proyectos puedan enfocarse en los pull requests que pasen los casos de prueba.

integracion continua

Entrega Continua o Continuous Delivery

Esta vendría siendo el siguiente paso luego de la integración continua. De una forma sencilla implica que todo cambio subido al repositorio y cuyos tests sean exitosos, pasarán a un servidor donde el conjunto de todos los cambios (pueden ser 1 o más, de diferentes desarrolladores), sean compilados, probados y verificados. Al final, el servidor de pruebas indica si las pruebas fueron buenas o no en cuyo caso el mismo sistema debe notificar del resultado a una integradora.

En palabras de AWS:

La entrega continua es una práctica de desarrollo de software mediante la cual se crean, prueban y preparan automáticamente los cambios en el código y se entregan para la fase de producción. Amplía la integración continua al implementar todos los cambios en el código en un entorno de pruebas y/o de producción después de la fase de creación. Cuando se la entrega continua se implementa de manera adecuada, los desarrolladores dispondrán siempre de un artefacto listo para su implementación que se ha sometido a un proceso de pruebas estandarizado.

Despliegue Continuo o Continuous Deployment

Aquí la diferencia básica(de acuerdo a AWS) es que el paso final, de pasar a producción, se da de manera automática. Ningún miembro del equipo intervendrá.

Con la entrega continua, todos los cambios en el código se crean, se prueban y se envían a un entorno de almacenamiento o pruebas de no producción. Pueden efectuarse varias pruebas al mismo tiempo antes de la implementación en producción. En el último paso, el desarrollador aprueba la actualización para su envío a producción cuando está listo. El proceso se diferencia de la implementación continua en que en el segundo caso el envío a producción se efectúa automáticamente, sin aprobación explícita.

Sin embargo, en una respuesta en StackOverflow, el despliegue continuo está más dado por la envergadura del sistema donde deben introducirse los cambios.

De dicha respuesta sale una muy buena frase:

Continuous deployment is simply the discipline of continuously being able to move the result of a development process to a production-like environment where functional testing can be executed in full scale. Despliegue continuo es la disciplina de continuamente poder mover los resultados de un proceso de desarrollo a un entorno similar a producción donde las pruebas funcionales puedan darse a escala completa.

--

Espero poder dejado todo más claro que antes. Incluso yo he entendido un poco más estos conceptos ahora que escribo sobre ellos.