# G## Integración Contínua de manera correcta
## Tabla de contenidos
* [Objetivos](#objetivos)
* [¿Qué es integración contínua?](#-qu--es-integraci-n-cont-nua-)
+ [Definición](#definici-n)
* [¿Qué **NO** es CI?](#-qu----no---es-ci-)
* [Buenas prácticas de CI](#buenas-pr-cticas-de-ci)
* [Recursos extras](#recursos-extras)
## Objetivos
* Guiar a los ingenieros de Solify a integrar sus productos de trabajo con la línea base (main, master, trunk, etc.) de la manera correcta.
## ¿Qué es integración contínua?
### Definición
Una de las definiciones más completas es [la de Atlassian](https://www.atlassian.com/continuous-delivery/continuous-integration#:~:text=Continuous%20integration%20(CI)%20is%20the,builds%20and%20tests%20then%20run.):
> Integración Contínua (CI) es la práctica de automatizar la **integración** de cambios al código de múltiples contribuidores en un solo proyecto de software.
Podemos complementar con que CI es una de las buenas prácticas de [DevOps](https://www.atlassian.com/devops), ya que permite a los desarrolladores mezclar sus cambios a un repositorio central en donde las construcciones (builds) y pruebas (tests) son ejecutadas.
## ¿Qué **NO** es CI?
Existen muchos modelos de ramas para los sistemas de versiones (ejemplo: Git) que recomiendan la implementación de [_Feature Branches_](https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow) o _Ramas de Características_ en las que se implementan _features_ o _características_ completas del sistema. En este modelo, el tiempo de vida de una rama (código separado de la "realidad") va desde un par de días hasta semanas o meses. Este extenso tiempo de vida impide que se integren los cambios a la base de código (code base) de manera contínua. Por lo tanto, Feature Branches **no son** Integración Contínua.
## Buenas prácticas de CI
Para verdaderamente realizar entrega contínua, las ramas en nuestros repositorios deben tener una vida de máximo un día, y realizar merges (integraciones a la lína base, main, master, trunk, etc.) periódicamente.
Una de las preocupaciones más usuales con la verdadera integración contínua es tener características y funcionalidades incompletas en el producto en producción, pero esto puede ser resuelto de muchas maneras. Una de estas soluciones (además de las más sencillas) es implementar el uso de [_Feature Toggles_](https://martinfowler.com/articles/feature-toggles.html) o _Feature Flags_. Si hacemos integración de una funcionalidad parcial, podemos ocultarla de manera muy sencilla con una simple condición, y así se evita el mal funcionamento al usuario final de nuestros sistemas.
## Recursos extras
[Video - Continuous Integration vs Feature Branch Workflow • Dave Farley • GOTO 2021](https://www.youtube.com/watch?v=pXovk-5J0Lg)