# Entrega continua

Entrega continua (continuous delivery en inglés o CD) es un enfoque de la ingeniería del software en que los equipos de desarrollo producen software en ciclos cortos, asegurando que el software puede ser liberado de forma confiable en cualquier momento. Apunta a la construcción, prueba, y liberación del software de forma más rápida y más frecuente. Este enfoque ayuda en la reducción del costo, tiempo, y riesgo de la liberación de versiones a través de la liberación de versiones más incrementales a aplicaciones en producción. Un proceso directo y repetible de liberación es importante para una entrega continua.
En ocasiones se relaciona con Despliegue continuo, con la diferencia que en la entrega continua, el producto final no tiene por qué siempre ser desplegada en un entorno real.

## Principios

La entrega continua consiste en tratar el flujo de despliegue como un sistema a prueba de errores: hay un conjunto de validaciones que cada pieza de software debe pasar en su camino hacia la liberación. El código es compilado, si es necesario, y empaquetado por un servidor de compilación cada vez que se realiza un cambio en un repositorio de control de versiones, y luego es probado por una serie de técnicas diferentes (posiblemente incluyendo pruebas manuales) antes de que pueda ser marcado como liberable.
Los desarrolladores acostumbrados a un ciclo de tiempo largo pueden tener que cambiar su mentalidad cuando trabajan en un entorno de CD. Es importante entender que cualquier cambio de código puede ser liberado a los clientes en cualquier momento. Patrones como los "feature toggles" o cambio dinámico de la aplicación vía configuración, pueden ser muy útiles para confirmar el código antes de tiempo que todavía no está listo para ser utilizado por los usuarios finales.
Otras técnicas útiles para el desarrollo de código de forma aislada, como la ramificación de código, no son obsoletas en un mundo de CD, pero deben ser adaptadas para ajustarse a los principios de CD.
La entrega continua se habilita a través del flujo de despliegue. El propósito del flujo de despliegue tiene tres componentes: visibilidad, retroalimentación y despliegue continuo.
* Visibilidad: Todos los aspectos del sistema de entrega, incluyendo la construcción, el despliegue, las pruebas y la liberación son visibles para todos los miembros del equipo para promover la colaboración.
* Feedback: Los miembros del equipo se enteran de los problemas lo antes posible cuando se producen para poder solucionarlos lo antes posible.
* Despliegue continuo: Mediante un proceso totalmente automatizado, se puede desplegar y liberar cualquier versión del software en cualquier entorno.

## Etapas

Normalmente está compuesta de 3 etapas:
* Automatización de la compilación e integración continua
* Automatización de pruebas
* Automatización de implementación
Automatización de la compilación e integración continua:
Esta etapa consta de la creación de archivos binarios a partir del código fuente. A medida que los desarrolladores implementan nuevas funciones, estas son integradas al código central, compiladas, y probadas.
Automatización de pruebas:
En esta etapa se prueba rigurosamente la nueva versión de aplicación, para asegurar que cumple con todos los requerimientos de calidad del sistema.
Automatización de implementación:
Después de que las etapas anteriores sean verificadas, se puede implementar la nueva versión en el ambiente de producción. Esta implementación se realiza de forma automática, dejando disponibles las nuevas funcionalidades al usuario, en solo unos minutos.

## Relación con DevOps

La entrega continua y DevOps son similares en sus significados y a menudo se confunden, pero son dos conceptos diferentes. DevOps tiene un alcance más amplio, y se centra en el cambio cultural, específicamente en la colaboración de los diversos equipos involucrados en la entrega de software (desarrolladores, operaciones, control de calidad, gestión, etc.), así como en la automatización de los procesos en la entrega de software.
La entrega continua, por su parte, es un enfoque para automatizar la entrega del software, y se centra en reunir los diferentes procesos y ejecutarlos con mayor rapidez y frecuencia. Así, DevOps puede ser un producto de la entrega continua, y esta fluye directamente hacia DevOps.