Comprender la integración continua

La integración continua, o CI, es la práctica de compilar y probar su base de código automáticamente después de cada fusión.

¿Qué es la integración continua?

La integración continua (CI) is una práctica de DevOps diseñada para ayudar a los equipos de desarrollo a trabajar de forma más eficiente y a entregar software de forma más fiable. Con la CI, cada vez que se fusionan sus cambios, un servidor de CI compila y prueba su código automáticamente, y le ofrece una retroalimentación rápida sobre su trabajo. Este ciclo de retroalimentación rápida y fiable le ayuda a publicar los cambios con más frecuencia y a reducir el número de errores que llegan a producción.

Desarrollo sin la CI

Para comprender por qué es necesaria la integración continua, resulta útil pensar cómo sería el desarrollo de software sin ella. Supongamos que está trabajando con un sistema de control de versiones como Git. Usted y sus colegas tienen cada uno su propia copia del repositorio, que utilizan para desarrollar localmente antes de enviar su trabajo a un repositorio compartido.

Si está desarrollando una nueva funcionalidad, es posible que trabaje en ella durante varios días antes de compartir sus cambios. Durante ese tiempo, sus compañeros también han estado desarrollando funcionalidades en sus copias locales del repositorio. Una vez que hayan terminado, cada uno hace push de sus cambios al repositorio compartido y empieza a fusionarlos a una rama designada para que pueda probar que cada funcionalidad funciona como se espera cuando se combina con todo lo demás.

Lamentablemente, al combinar grandes cambios de varios desarrolladores, existe un alto riesgo de que no consiga compilar el código. Usted y sus compañeros dedican tiempo a identificar qué conjunto de cambios ha provocado el problema antes de deshacer esas confirmaciones para seguir adelante con el lanzamiento de otros cambios más urgentes o realizar más cambios para solucionar los problemas.

Una vez que consigue compilar su código, es posible que descubra que la combinación de cambios ha introducido varios errores. Una vez más, hay que revisar los cambios en el código de cada colaborador para encontrar el origen de los problemas, solucionarlos y volver a iniciar el proceso de compilación.

La necesidad de la CI

La integración continua acelera este proceso realizando los pasos de compilación y prueba de forma automática cada vez que se fusionan sus cambios a una rama designada. Una vez que haya automatizado estos pasos, es posible realizarlos con más frecuencia: en lugar de compilar y probar su base de código cada pocas semanas, puede hacerlo cada pocas horas.

Trabajar en estos pequeños incrementos significa que puede detectar y solucionar más rápidamente cualquier problema introducido por los cambios en el código. En lugar de examinar cientos o miles de líneas de cambios para encontrar el origen del problema, su búsqueda se limita a un conjunto mucho más reducido de cambios. Además, esos cambios aún están frescos en la mente, por lo que no tiene la carga añadida de cambiar de contexto.

Al confirmar que su software se sigue compilando y comportando como se espera después de cada cambio, la CI le ayuda mantener el código en un estado implementable. De este modo, la puesta en producción de los cambios resulta menos ardua, y puede comenzar a añadir funcionalidades y correcciones con más frecuencia.

Aunque la integración continua se ha diseñado para solucionar problemas a los que se enfrentan los grandes proyectos de desarrollo de software con varios colaboradores, nunca es demasiado pronto para añadir la CI a su proceso de desarrollo. Incluso si es un desarrollador independiente, trabajar en pequeños incrementos y validar sus cambios con pruebas automatizadas sobre la marcha le puede ayudar a trabajar de forma más eficiente y mejorar la calidad de su código.

integración continua

Práticas de la CI

Un flujo de trabajo de CI eficaz requiere una combinación de herramientas, procesos y prácticas de equipo. Veámoslas una tras otra.

Utilice un sistema de control de versiones

La integración continua depende del almacenamiento de toda su base de código en un sistema de control de versiones o código fuente. Esto debe incluir todos los archivos de código fuente, bibliotecas, archivos de configuración y scripts. El uso del control de versiones facilita considerablemente que varios desarrolladores trabajen en paralelo y compartan sus cambios entre ellos. Los servidores de CI se integran con los sistemas de control de versiones para compilar y probar los cambios en su código.

Confirme los cambios regularmente

Para que todos construyan sobre la misma base, es necesario que trabajen desde el mismo repositorio y que compartan sus cambios con frecuencia. Una buena regla general es que todo el mundo fusione sus cambios en la rama de la CI de su repositorio compartido cada día, aunque puede hacerlo más a menudo. Al mismo tiempo, mantenga actualizada su copia local con el repositorio compartido para reducir el riesgo de conflictos de fusión cada vez que haga push.

Compilaciones y pruebas automatizadas

Después de fusionar los cambios de código, el siguiente paso es compilar la solución y someterla a una serie de comprobaciones, como análisis lint, pruebas de unidad y análisis estático. Compilar y probar manualmente conlleva tiempo y está sujeto a errores, lo que hace que el objetivo de integrar los cambios diariamente sea poco práctico, por lo que la automatización resulta esencial. Las herramientas de compilación y los marcos de trabajo de pruebas automatizadas están disponibles para los principales lenguajes de programación, y puede utilizar un servidor de CI para iniciar el proceso de forma automática y coordinar los distintos pasos.

Solucione los fallos inmediatamente

Para disfrutar de las ventajas de la integración continua, todos los que contribuyen al proyecto deben responder rápidamente cuando falla una compilación o prueba automatizada. De este modo se garantiza que todo el mundo contribuye a una base sólida en lugar de intentar añadir nuevas funcionalidades a un código que no funciona. Aunque pueda parecer que está pidiendo a los miembros del equipo que interrumpan su trabajo para solucionar una compilación o prueba defectuosa, un proceso de CI automatizado puede ofrecer resultados iniciales en cuestión de minutos, lo que le permite resolver cualquier problema mientras los cambios en el código aún están frescos en su mente.

Mantenga el proceso

Una vez que haya automatizado sus compilaciones y pruebas, debe mantener su flujo de CI. Esto incluye añadir las pruebas de unidad a medida que escribe código nuevo y mantener la velocidad de sus ciclos de retroalimentación.

Añadir un servidor de CI que se encargue de supervisar el repositorio, desencadenar las compilaciones, ejecutar las pruebas automatizadas y cotejar los resultados ayuda a unir todas estas piezas, lo que le ahorra tiempo en la escritura de la lógica de automatización personalizada. Un servidor de CI bueno también puede proporcionar información adicional, como las métricas de cobertura de código y el historial de compilaciones.

Ventajas de la CI

Comprender los beneficios que puede esperar de la integración continua puede ayudar a motivar a los miembros del equipo para que prueben nuevas prácticas y convencer a sus grupos de interés para que apoyen los nuevos procesos.

Para cada persona y para el equipo de desarrollo en su conjunto, la CI ofrece lo siguiente:

  • Fusiones más fluidas: una vez que comience trabajar en incrementos más pequeños, el número de conflictos de fusión se reduce. Para eso, es fundamental actualizar regularmente su repositorio local con los cambios introducidos por otros usuarios.
  • Flujo de trabajo más eficiente: la retroalimentación rápida de un proceso de compilación y pruebas automatizadas le avisa de problemas en el código unos minutos después de haber enviado el cambio. En cambio, si confía en una compilación o un proceso de pruebas manuales, es posible que no descubra un error introducido por su cambio hasta que hayan pasado varios días o semanas.
  • Base de código más fácil de mantener: añadir la cobertura de las pruebas automatizadas para asegurarse de que su proceso de CI funciona bien hace que su base de código sea más fácil de comprender y mantener.
  • Mejora de la comunicación y la colaboración: trabajar en incrementos más pequeños y compartir los cambios con más regularidad significa que también puede ver en que están trabajando los demás. Esto crea más oportunidades para debatir el diseño de una funcionalidad con los compañeros, mostrar el progreso a los directores de producto y a los expertos en usabilidad, y ajustar el curso según sea necesario.

La integración continua también beneficia a la empresa en general, por ejemplo:

  • Menos errores: aunque la integración continua no evita que se introduzcan errores, facilita mucho a los desarrolladores su identificación y corrección. Como resultado, es mucho menos probable que los errores lleguen a la fase de producción, donde pueden afectar a sus usuarios.
  • Lanzamientos más rápidos y frecuentes: automatizar un proceso de compilación y pruebas automatizadas ahorra tiempo y garantiza que los pasos se realicen de forma coherente, lo que reduce el esfuerzo en la preparación del software para su lanzamiento. A medida que los equipos adquieren más confianza en su proceso de CI, pueden lanzar los cambios con más frecuencia.

Para obtener más información acerca de los beneficios de la integración, entrega e implementación continuas, consulte nuestra guía sobre los 12 beneficios de la CI/CD.

Desafíos de la CI

Aunque la integración continua ofrece beneficios tanto a los desarrolladores como la empresa en general, no siempre se recibe con los brazos abiertos.

Para muchos departamentos de desarrollo, DevOps representa un gran cambio en la forma de trabajar y desafía los procesos existentes. Se necesita una buena comunicación para coordinar los esfuerzos entre los equipos e inculcar una cultura de colaboración.

Si ya se siguen metodologías Agile, el cambio suele ser más fácil, ya que la importancia de escuchar la retroalimentación y la noción de los equipos autoorganizados ya deberían haber ganado terreno.

Si no es el caso, reconocer que la CI es un cambio importante, implicar a los empleados, empezar poco a poco y demostrar los beneficios a medida que se avanza puede ayudarle a convencer a sus compañeros de los beneficios que aporta la CI.

La integración continua también se enfrenta a retos más prácticos. Si trabaja en una aplicación grande y monolítica, los tiempos de compilación pueden ser lentos, y si los entornos de prueba son escasos, puede ser un reto paralelizar las ejecuciones de prueba.

Visualizar su flujo de trabajo de integración continua y utilizar métricas para identificar los cuellos de botella puede ayudar a cuantificar los costes y beneficios de invertir en cambios de arquitectura, infraestructura adicional y cobertura de pruebas automatizadas.

Cómo comenzar con la integración continua

Configurar un flujo de trabajo de CI puede parecer abrumador. Hay muchas opciones que considerar y muchas cosas que puede automatizar. Afortunadamente, es un proceso que se presta bien a ser dividido en partes más pequeñas, ya que cada paso aportará algunos beneficios.

Las siguientes áreas son buenos lugares para empezar:

  1. Comience a trabajar en incrementos más pequeños: siempre que tenga su código en control de versiones, puede comenzar a trabajar en lotes más pequeños y compartir los cambios con más frecuencia, reduciendo así los conflictos de fusión. Es posible que desee comenzar a dividir las tareas de desarrollo durante el refinamiento del trabajo pendiente para facilitar esto.
  2. Acuerde una estrategia de ramificación: esto determina qué rama o ramas seguirán el proceso de CI y cómo se lanzan los cambios. Las opciones comunes incluyen el desarrollo basado en tronco y GitFlow (sobre todo para el software versionado).
  3. Añada pruebas de unidad a medida que programa: tanto si ya tiene pruebas de unidad como si empieza de cero, hacer que las pruebas de unidad forme parte de la definición de «hecho» de su equipo garantizará que la cobertura de su código mejore constantemente. Unas pocas pruebas automatizadas siempre son mejor que ninguna, y puede empezar a practicar la CI con solo unas pocas pruebas automatizadas.
  4. Automatice gradualmente: en lugar de intentar programar todas las fases de su flujo de CI a la vez, céntrese en lo que lleve más tiempo o le proporcione más información. Cuando esté listo, puede utilizar un servidor de CI para empezar a encadenar los pasos en un proceso de CI automatizado.

Puede obtener más información sobre la configuración tanto de la CI como de la CD con nuestra guía sobre las buenas prácticas de CI/CD.

Conclusión

Adoptar la integración continua ayuda a acelerar el proceso de desarrollo al tiempo que mejora la calidad del código. La automatización de estos pasos le permite trabajar de forma más eficiente y centrarse en añadir valor a los usuarios. Pero la integración continua es solo el principio del proceso de CI/CD. La siguiente etapa, la entrega continua, aplica los principios de DevOps a la siguiente parte del proceso de lanzamiento.

Cómo puede ayudarle TeamCity

TeamCity es una plataforma de CI/CD flexible que puede personalizar según sus necesidades. Es compatible con los principales sistemas de control de versiones, como Git, Perforce, Mercurial y Subversion, y ofrece herramientas de compilación y prueba para los principales lenguajes de programación. La amplia variedad de desencadenantes de la CI significa que puede iniciar el proceso de compilar y probar después de cada confirmación en una rama designada, ejecutar un subgrupo de comprobaciones en ramas de funcionalidades, programar compilaciones nocturnas y dar a los miembros del equipo la opción de ejecutar comprobaciones de CI de forma local.

Para asegurarse de que obtenga la información lo más rápido posible, TeamCity puede paralelizar las pruebas y otras tareas de compilación. Las integraciones con Slack y los IDE proporcionan información dondequiera que esté trabajando, mientras que los informes detallados de las pruebas le ayudan a identificar rápidamente la causa del fallo. TeamCity también ofrece una gama de métricas para ayudarle a optimizar su proceso de CI y evaluar la cobertura de pruebas de unidad.

Si decide ampliar su proceso de CI para incluir la entrega o implementación continuas, TeamCity puede ofrecer todo lo que necesita para gestionar entornos y automatizar las implementaciones.