# 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)