Una de las muchas buenas prácticas que aplicamos para mejorar el desarrollo del software y su desempeño es la integración continua. Si no formas parte del mundo de la programación, es posible que hayas oído hablar de ella pero no sepas a qué se refiere exactamente. En este post, te explicamos en qué consiste, cuáles son sus ventajas y por qué es tan importante para nuestros equipos.
¿Por qué es útil la integración continua?
En el desarrollo de un producto de software, como puede ser una aplicación, trabaja un equipo de diversos desarrolladores. Se centran en determinados aspectos o funciones que les han sido asignados, pero lo hacen de forma simultánea a sus compañeros. De este modo, los fragmentos de código y los cambios que estos reciban deben integrarse posteriormente con los demás.
El proyecto va avanzando y el código que hay que integrar y revisar crece con él. Si dejamos esta integración para el final, la detección y corrección de errores será una tarea mucho más tediosa y complicada. Esto puede suponer una pérdida de tiempo importante, llegando en ciertos casos a consumir más horas que la propia programación planteada inicialmente.
Con el fin de evitar este tipo de contratiempos, surge la integración continua del software. Se busca que, en vez de integrar todo al final del desarrollo, se vaya completando esta tarea poco a poco y de forma continua y muy frecuente.
¿Qué es la integración continua?
La integración continua (a menudo denominada CI por las siglas en inglés de Continuous Integration) es una práctica de desarrollo de software, en la que los desarrolladores van integrando o registrando los fragmentos de código (o los cambios en el mismo) en un repositorio central de manera periódica.
Normalmente este registro se hace mínimo una vez al día y, tras hacer la integración, esta es verificada con un build automático, con la ejecución de pruebas o tests. Esto permite detectar cualquier tipo de fallo lo antes posible y poder remediarlo.
El objetivo en el que se sustenta esta práctica es ir integrando poco a poco en aras de un desarrollo más efectivo, un software de mayor calidad y una mayor flexibilidad frente a actualizaciones y modificaciones.
En la mayoría de ocasiones, este término se refiere a una automatización del proceso de integración, con acciones como compilaciones, pruebas o análisis del código. No obstante, la integración continua no se debe reducir únicamente al uso de una herramienta de CI que vaya compilando el código. En su lugar, debemos entender que va más allá, en forma de buenas prácticas de desarrollo.
¿Cómo funciona la integración continua?
Las personas que vayan a formar parte del proyecto descargan la línea principal de código y trabajan sobre una versión local o copia de trabajo. Cuando cada uno haya hecho los cambios o las aportaciones necesarias, puede ejecutar pruebas de unidad local previas a la integración si así lo desea. Si no, puede ya integrar el código en el repositorio compartido.
Con cada commit que haga un desarrollador sobre el control de versiones, se compila el proyecto y se crean y ejecutan las pruebas unitarias de forma automática para detectar posibles fallos. Una vez solucionados, se podrá cargar la versión actualizada en la main line para que el resto de programadores tengan acceso a ella.
Hay que considerar que, probablemente, mientras el desarrollador del que hablábamos realiza sus cambios, hay más compañeros trabajando otros fragmentos simultáneamente. Con ello, cada miembro tendría una versión distinta en su copia local, e incluso puede haberse actualizado ya la línea principal respecto a la versión que descargó. Por este motivo, antes de subirla se debería actualizar la copia local para revisar y solventar cualquier problema.
Algunos componentes básicos de la CI son:
- Integración diaria en la que todos los desarrolladores deben participar. De lo contrario, los demás involucrados trabajarían sobre una versión incompleta y no se detectarían determinados errores.
- Accesibilidad, en tanto que todos los miembros del equipo puedan acceder y descargar la última versión del proyecto. Esto se cumple gracias al repositorio compartido, en el que deben estar todos los archivos implicados, más allá del código fuente.
- Corrección de errores tan pronto como se detecten. No se puede permitir que estos lleguen a la línea principal, pues debe funcionar perfectamente para servir de base al resto del equipo.
- Comunicación para que los demás estén al tanto de qué se está haciendo (por ejemplo, cuándo se está compilando) y de quién ha hecho cada modificación.
- El código de la main line siempre debe ser funcional.
¿Qué aporta la integración continua a mi proyecto? Ventajas
Como hemos comentado ya, el principal objetivo de la integración continua es evitar una integración final compleja, derivada de que cada desarrollador trabaje de forma individual. No obstante, los beneficios que reporta van mucho más allá:
- La versión con la que trabaja el equipo se mantiene al día, con lo que siempre tienen una base corregida. Esto, además, supone que siempre hay disponible una versión funcional. De ser necesario, se pueden entregar al cliente actualizaciones más frecuentes y sin un gran esfuerzo adicional.
- Permite detectar los errores a tiempo y arreglarlos de forma temprana, antes de que evolucionen en fallos mayores o de que repercutan en más aspectos. Todo ello minimiza el riesgo de encontrar bugs.
- Mejora la productividad y las habilidades del equipo, pues se acostumbra a revisar parte por parte y de forma continua su trabajo. Se busca un software de mayor calidad y una programación más limpia y minuciosa, siguiendo un proceso.
- La comunicación entre el equipo es constante. Todos conocen el estado actual del código y datos adicionales (por ejemplo, cuándo se está compilando, qué fallos ha habido, quién hace cada modificación, etc.). Se puede hacer una previsión más acertada de su evolución.
Como inconvenientes, podemos mencionar la dificultad que supone en muchas empresas o equipos implementar cambios de este tipo, que afectan a los métodos de trabajo y a los procesos habituales. Si los miembros no se muestran favorables a este tipo de prácticas, será muy complicado que aprovechen su potencial e incluso puede generar descontento. Además, requiere crear un plan y, en muchos casos, entornos de prueba extra.
¿Cómo se elige una herramienta de CI?
Si bien es cierto que se puede aplicar integración continua sin emplear herramientas específicas, la automatización que lograremos con ellas simplifica enormemente el trabajo de compilación y control.
En la actualidad, existen muchas herramientas de este tipo: Jenkins, Bamboo, CircleCI, GitLab CI, CodeShip, Nevercode, GoCD, TeamCity, Travis CI, Buddy… Quien mejor sabrá cuál usar y cómo implementarla será el responsable del proyecto, que tendrá en cuenta aspectos como:
- Instalación y configuración rápida y sencilla y facilidad de uso.
- Integración con el entorno de desarrollo integrado (IDE) para que no sea necesario salir del entorno.
- Los complementos y funcionalidades extra.
- La integración con plataformas en la nube, como Amazon Web Services.
- La opinión del equipo: la decisión se debería consultar y valorar con ellos, de forma que estén al tanto de todas sus posibilidades y se encuentren cómodos con ella.
En resumen, la integración continua se presenta como una solución ideal para asegurar el desempeño de nuestro software. Cuando un proyecto de software parte de la base de la integración continua, el proceso está más supervisado y fluye mejor, con lo que terminará por elevarse la calidad del producto final.