¿Qué es CI/CD y cómo funciona?
Las siglas CI/CD se corresponden con Integración Continua (CI) y Despliegue Continuo (CD), una actividad de desarrollo de software que puede ayudarte en muchos aspectos del proceso de despliegue y el trabajo en equipo. Entiende estos procesos ágiles de desarrollo y aprende cómo integrarlos en tu día a día.
¿Qué es CI (Integración Continua)?
Tal como se puede entender a partir del término, la integración continua es una práctica que permite fusionar el código fuente de las aplicaciones, desarrollado recientemente, dentro del código que se utiliza en producción.
El hecho de ser un proceso continuo nos permite que los usuarios finales dispongan cuanto antes de las mejoras desarrolladas, facilitando la validación temprana de las funcionalidades. Esto representa una ventaja pero a la vez un desafío, ya que es necesario asegurarse que las nuevas aportaciones en la base de código funcionen correctamente y, para ello, se utilizan pruebas y procedimientos específicos.
¿Qué es CD (Despliegue Continuo)?
Por su parte, el Despliegue Continuo (CD) es la práctica que toma los cambios validados por la integración continua y los entrega de forma automatizada a entornos de producción, o cercanos a producción, como «staging».
De este modo, se automatizan tareas repetitivas, que pueden realizarse sin intervención manual, lo que permite mejorar la agilidad de las entregas.
¿Por qué CI/CD es importante en el desarrollo moderno?
CI/CD es uno de los pilares del desarrollo moderno, ya que aporta numerosas ventajas que vamos a detallar a continuación.
Aceleración del tiempo de entrega
Gracias a las prácticas de integración continua y despliegue continuo podemos acortar los procesos de entrega de software. De este modo los usuarios dispondrán de las mejoras del software cuanto antes.
Mejora de la calidad del software
Este proceso se realiza acompañado de pruebas automatizadas que permiten detectar los errores antes de que el software llegue a producción. De este modo creamos software más robusto y con mayor calidad.
Automatización como ventaja competitiva
La automatización de los procesos permite que se utilice menos tiempo en tareas repetitivas lo que reduce la carga de trabajo de los desarrolladores, que pueden concentrarse en otras tareas más productivas.
Reducción de errores humanos en el despliegue
Al no realizar de manera manual los despliegues es más difícil que se produzcan errores humanos, algo sobre todo importante cuando los procesos de despliegue son especialmente complejos e implican diversas etapas.
¿Cómo funciona CI/CD en el ciclo de vida del software?
El proceso de CI/CD se realiza mediante la definición de lo que se llama un «pipeline» que define las acciones que se deben realizar para la automatización, desde la integración del código hasta su despliegue en producción. Vamos a ver estas etapas en resumen para que puedas tener una idea más exacta de qué incluyen.
1. Integración del código en un repositorio compartido
El primer paso para poder implementar las prácticas de CI/CD es disponer de un repositorio Git que además esté alojado en una plataforma de hosting para repositorios como GitHub o GitLab. Aquí es importante mencionar que, aunque teóricamente podría valer otro sistema de control de versiones, en la práctica se usa comúnmente Git, ya que es un estándar en la industria del software.
Luego hay que establecer unas políticas de colaboración en el equipo, que pueden variar según el caso particular de cada proyecto. De todos modos, se usarán los hooks del sistema de control de versiones Git, para que que, cada vez que se hace una actualización de código en la rama principal, o incluso mejor a una rama de desarrollo, se disparen los procesos de CI.
2. Automatización de pruebas para validar cambios
Cuando se inicia el proceso de integración continua se ejecutan pruebas unitarias, de integración o cualquier otra prueba necesaria para verificar la validez del código que se acaba de publicar en esa rama.
3. Generación de compilaciones y artefactos listos para producción
Si las pruebas han podido ejecutarse sin fallos es que el software está preparado para despliegue. Sin embargo, dependiendo del flujo de cada proyecto, antes de subir al servidor es muy frecuente realizar un procedimiento de build de archivos para producción. Esto puede incluir por ejemplo la compilación del código, la transpilación o la creación de paquetes. También podría incluir la optimización de imágenes u otros assets como el CSS.
4. Despliegue automatizado en entornos de prueba o staging
Una vez compilado el software se puede desplegar. Si la aplicación lo requiere, por su complejidad o por requisitos dados por el cliente o por el dominio del software, se necesita hacer un paso previo que es la publicación en un entorno de prueba o staging.
En estos servidores de prueba se pueden probar las aplicaciones manualmente o evaluar por parte del cliente, para verificar que todo está correcto antes de desplegar en el entorno de producción.
5. Entrega continua o despliegue continuo en producción
El despliegue continuo se puede realizar de manera automatizada después de haber verificado que se pasan todas las pruebas y se compilan bien los assets, en el mismo script de CI/CD. A esto se le llama despliegue continuo.
También se puede decidir de manera manual el momento de comienzo del proceso de despliegue, después de las verificaciones en los entornos de staging. En este caso los pasos para el despliegue en producción también estarán automatizados, para que lanzarlos sea solo cuestión de ejecutar un comando o realizar alguna acción sencilla similar. Este proceso también se engloba dentro del paraguas de despliegue continuo pero muchas veces se utiliza más precisamente el término de entrega continua.
Beneficios de implementar CI/CD en tus proyectos
Los motivos por los que ya hemos explicado en el punto «por qué CI/CD es importante» pueden hacerte entender cuáles son los beneficios de aplicación de estas técnicas. No obstante vamos a repasar algunos aspectos interesantes que cabe resaltar.
Mejora de la colaboración entre equipos
Los pipelines de CI/CD son importantes para poder montar un buen sistema de colaboración entre los distintos departamentos que trabajan en el desarrollo de aplicaciones medianas o grandes, por ejemplo programadores, QA, clientes, etc.
Entregas más frecuentes y confiables
Gracias a CI/CD tendremos entregas más frecuentes, con lo cual los usuarios podrán beneficiarse de tener mejoras de manera constante. Esto no solo quiere decir que las funcionalidades se liberarán pronto y podrán ser aprovechadas rápidamente por los usuarios, también implica que ninguna de ellas provocará demasiadas fricciones, ya que generalmente no habrá grandes cambios que puedan causar confusión.
Además, incorporando los procesos de pruebas automáticas y verificaciones en staging conseguimos que las aplicaciones sean más confiables y no se introduzcan errores de manera accidental.
Mayor visibilidad y trazabilidad del código
Al usar un repositorio y hacer cambios pequeños pero frecuentes es más fácil poder localizar posibles problemas en el código y realizar una correcta trazabilidad, lo que colabora en las tareas de mantenimiento del software.
Escalabilidad en proyectos de software
También permite una mayor escalabilidad, ya que el crecimiento de las aplicaciones no implica una mayor carga de trabajo a la hora de mantener el software, consiguiendo que la velocidad del desarrollo sea siempre constante y sin perder el control.
Desafíos comunes al aplicar CI/CD
Mantener una buena estrategia de CI/CD también entraña sus retos y dificultades, sobre todo en los primeros flujos de despliegue, donde tenemos que montar todo el proceso. Vamos a verlos.
Curva de aprendizaje y cambios culturales
Obviamente, para poder realizar un buen flujo de CI/CD necesitamos que alguna de las personas del equipo tenga suficientes conocimientos en una disciplina que está a caballo entre el desarrollo y los sistemas. Este tipo de profesionales los conocemos generalmente con el nombre de «Devops».
Complejidad en entornos legacy
Si el proyecto es nuevo puede ser relativamente sencillo Integrar CI/CD desde el principio, ya que las herramientas y las costumbres de desarrollo estarán adaptadas a las necesidades de estas prácticas, o lo s devops pueden hacer su trabajo para guiar el proceso desde el inicio.
Sin embargo, en sistemas heredados o viejos (legacy) a veces se hace un poco complicado, ya que necesitaremos que el software tenga características que no siempre existirán: pruebas, servidores donde sea viable el despliegue automatizado o, en el peor de los casos, un repositorio donde todos los desarrolladores puedan aportar código.
Gestión de la infraestructura y los entornos
La automatización de todos estos procesos requiere una infraestructura adecuada que no siempre existe. Para las prácticas de CI/CD los servidores cloud suelen ser los más adecuados, dada la necesidad de crear muchas veces entornos sobre la marcha, así como herramientas que soporten los pipelines de manera fiable.
Herramientas populares para CI/CD
Ahora vamos a ver algunas de las herramientas más populares para implementar pipelines de CI/CD, que se adaptarán a todas las necesidades, según el tipo de proyecto.
Jenkins
Esta es la herramienta clásica en CI/CD y además una de las pioneras. Jenkins es de código abierto y tiene una comunidad muy amplia, que ha publicado numerosos complementos y extensiones por medio de plugins. Si necesitas diversidad de configuraciones y entornos puede ser ideal aunque a veces puede resultar algo más compleja que otras soluciones.
GitLab CI/CD
Otra de las herramientas clásicas y muy completa para CI/CD es GitLab, que inicialmente es un hosting de repositorios Git pero que ofrece desde hace mucho tiempo recursos ideales para empresas que buscan la automatización de los procesos de pruebas y despliegues.
CircleCI
Esta herramienta también es muy popular, enfocada en velocidad y simplicidad con la posibilidad de ejecutar pipelines en la nube o en entornos propios.
GitHub Actions
Desde hace menos tiempo GitHub también ofrece la posibilidad de crear pipelines con GitHub Actions. Estos pipelines se podrán correr solamente en proyectos alojados en GitHub, aunque eso no suele ser problema porque este servicio de hosting de repositorios Git es el más popular. Aunque tiene menos tiempo que otras alternativas se ha convertido rápidamente en una de las más usadas, gracias a la propia tracción de GitHub.
Azure Pipelines
También tenemos pipelines en otros proveedores cloud como Azure que nos ofrece ofrece CI/CD a través de Azure Pipelines. Recordando que Azure tiene soporte para cualquier lenguaje y plataforma de desarrollo, por lo que es una alternativa bastante usada.