En el desarrollo ágil de proyectos de software, la calidad del resultado, la velocidad de entrega del producto y la tolerancia a fallos son aspectos fundamentales para el éxito de los mismos. En este contexto, DevOps (Development – Operations) ha surgido como un enfoque integral que busca mejorar la colaboración entre los equipos de desarrollo y de operaciones. Su principal objetivo es permitir entregas ágiles de software sin perder la estabilidad de las operaciones de la organización.
DevOps complementa los principios ágiles extendiéndolos hasta la operación del software. Particularmente, el principio que enfatiza la entrega temprana y continua de software con valor para satisfacer al cliente se alinea perfectamente con la filosofía de DevOps de ofrecer cambios de manera rápida y confiable.
Dentro de DevOps, surge un término importante “pipelines” que se define como una serie de pasos automatizados que permiten la integración continua de software (CI) y la entrega o despliegue continuo del mismo (CD). Esto asegura que el código se incorpore, pruebe y despliegue de forma ininterrumpida, facilitando a los equipos de desarrollo la entrega ágil y fiable de cambios.
DevOps no se trata simplemente de adoptar nuevas herramientas tecnológicas y acelerar procesos, sino de un cambio cultural en el cual se busca promover la comunicación y la colaboración entre los equipos. Los procesos de DevOps no son estáticos, sino más bien orgánicos y evolutivos. Cada equipo de desarrollo tiene sus propias necesidades y desafíos únicos, por lo que no existe una receta mágica o un enfoque único que funcione para todos.
El resultado de aplicar DevOps en una organización será una mayor agilidad, resiliencia y capacidad de innovación.
Integración Continua (CI)
La Integración Continua fue popularizada por Extreme Programming (XP) y posteriormente adoptada por muchas otras metodologías. CI busca integrar el trabajo de cada uno de los desarrolladores constantemente. Cada integración debe estar respaldada por pruebas automatizadas que permitirán detectar errores para corregirlos lo antes posible.
El objetivo principal de CI es reducir el riesgo de errores y conflictos de integración que dificulten el progreso de un proyecto. Una de las razones para adoptar Integración Continua (CI) es evitar el temido “Big Bang Integration”, es decir, a la práctica de integrar grandes volúmenes de código de diferentes desarrolladores o equipos al final del ciclo de desarrollo, en lugar de integrarlo de manera continua a lo largo del proceso.
Trunk Based Development (TBD) es una estrategia de desarrollo de software que fomenta la integración continua al reducir la complejidad de fusionar cambios y alentar a los equipos a integrar su trabajo con frecuencia en la rama principal, por lo que el CI está estrechamente relacionado a TBD. Esto de debe a que las ramas de vida corta reducen los conflictos de integración y permiten integrar cambios varias veces al día.
Entrega Continua (CD)
Cuando el código pasó por el CI, todos los miembros del equipo de desarrollo tendrán disponible los últimos cambios del código, lo cual es muy útil. Pero el desarrollo de software tiene que seguir su ciclo de vida, y precisamente esa es la ayuda que nos va a dar esta primera variante del CD, que se define como una serie de pasos automatizados a seguirse para que el código se encuentre en un estado listo para desplegar, es decir, todos sus artefactos (.jar, .war, imagen de contenedor) listos para que alguien tome la decisión y los despliegue en un servidor.
Despliegue Continuo (CD)
Esta segunda variante de CD es el complemento de la primera, con la gran diferencia que en este caso, no solo se busca dejar los artefactos listos para que alguien los despliegue, sino que el despliegue en el servidor es automático.
Para lograr esto, es fundamental contar con las herramientas y/o infraestructura adecuadas que permitan realizar cambios sin afectar los servicios en producción, lo que se conoce como despliegue sin tiempo de inactividad (Zero-Downtime Deployment).
La idea detrás del Zero-Downtime Deployment es asegurar que los usuarios finales puedan continuar utilizando la aplicación sin experimentar ningún tiempo de inactividad, esto se logra mediante la implementación de estrategias y técnicas específicas que permiten desplegar las nuevas versiones de la aplicación. El objetivo es minimizar o eliminar el tiempo de indisponibilidad cuando la arquitectura lo permite. Entre las estrategias más comunes se encuentran:
- Blue-green deployment: Despliega dos entornos de producción, donde uno está activo y otro se actualiza. Una vez probada la nueva versión, el tráfico se redirige al nuevo entorno.
- Canary deployment: Implementa una nueva versión inicialmente para un pequeño grupo de usuarios o servidores, permitiendo probarla antes de implementarla completamente.
- Rolling deployment: Despliega nuevas versiones de la aplicación en etapas o secuencialmente en diferentes partes de la infraestructura, manteniendo la aplicación en línea durante todo el proceso.
- GitOps: En años recientes ha surgido un enfoque moderno conocido como GitOps, la cual se base en utilizar los repositorios de Git como la “única fuente de verdad” para la infraestructura y aplicaciones. A tráves de herramientas como “ArgoCD o Flux”, se compara constantemente lo definido en Git con lo que se encuentra corriendo en el servidor para sincronizarse automáticamente.
Herramientas de CI/CD
Volviendo a CI y CD, contamos con varias herramientas en el mercado que nos pueden ayudar a correr pipelines en nuestros proyectos: Jenkins, GitLab, Travis CI, CircleCI, Spinnaker, AWS CodeDeploy, Azure DevOps, entre otras.
Particularmente “GitLab” es una herramienta que para la empresa Software Evolutivo es una de las mejores no solo para DevOps, sino también para la gestión y planificación de proyectos de software. Seguramente, pronto estaremos profundizando sobre esta herramienta en otro blog que te dejaremos en las lecturas recomendadas.
¿Cómo diseñar un pipeline de CI/CD para un proyecto?
- Identifica el flujo de trabajo y el ciclo de vida completo de tu proyecto desde el momento cero hasta el momento en que este sale a un ambiente de producción o cualquiera que sea el ambiente objetivo.
- Determina los pasos que tu pipeline debería seguir para que el ciclo de vida que identificaste pueda ser automatizado.
En este punto deberías tenerlo todo sentado en papel, sigamos:
- Considera el estado y las características tecnológicas de tu proyecto.
- Investiga las herramientas que te permitirán implementar tu pipeline (valida que los recursos tecnológicos y económicos requeridos estén a tu alcance).
- Define las herramientas a utilizar.
Es momento de desarrollar, y para esto se sugiere lo siguiente:
- Incluye un paso a la vez a tu pipeline, pruébalo y valida que cada paso logro su objetivo.
- Empieza por implementar el CI desde lo más simple y fundamental para que puedas continuar (compilación, tests).
- Continúa por un CD de delivery. Lograr que tu aplicación genere y suba su artefacto en el repositorio que deseas, será un gran hito.
- Cuando tengas el artefacto en el repositorio deberás buscar la manera adecuada de que tu repositorio se conecte a tu servidor donde harás el despliegue.
Y por último, busca siempre la retroalimentación de tu equipo con el objetivo de mejora continua.
Desafíos al implementar DevOps
- Superar la resistencia a los cambios y fomentar una cultura de colaboración y responsabilidad compartida.
- Lograr la automatización completa de los procesos de desarrollo, pruebas y despliegue.
- Comunicar efectivamente los beneficios de DevOps y proporcionar capacitación y apoyo para la transición.
- Integrar prácticas de seguridad y cumplimiento sin comprometer la velocidad de entrega.
- Establecer una estrategia de monitoreo y retroalimentación continua para mejorar el rendimiento y la calidad del software.
- Diseñar una infraestructura y procesos que puedan crecer y adaptarse a medida que los proyectos y equipos evolucionan.
Evaluando la madurez y eficiencia de DevOps: Métricas DORA
Adoptar la cultura DevOps y automatizar procesos no es un esfuerzo de una sola vez, sino un ciclo de constante evolución. Para medir el impacto y eficiencia, la industria se respalda en las métricas DORA (desarrolladas por el equipo de DevOps Research and Assessment de Google). Tras su investigación identificaron cuatro indicadores clave que diferencian a los equipos de alto rendimiento, logrando un equilibrio entre velocidad y estabilidad.
- Frecuencia de despliegue (Deployment Frequency): Mide qué tan seguido se libera código a producción con éxito. Realizar múltiples despliegues al día en lotes pequeños, reduce el riesgo y acelera la retroalimentación de los usuarios.
- Tiempo de espera para cambios (Lead Time for Changes): Es el tiempo que transcurre desde que un código se confirmaa (commit) hasta que corre con éxito en producción. Un lead time corto demuestra un pipeline eficiente.
- Tasa de Fallos en Cambios (Change Failure Rate-CFR): Representa el porcentaje de despliegues en producción que provocan una degradación del servicio o requieren revertir el cambio. El intervalo ideal es mantenerlo del 0% al 15%.
- Tiempo Medio de Recuperación (Mean Time to Restore-MTTR): Mide cuánto tarde el equipo en restaurar el servicio cuando ocurre un fallo en producción.
Las métricas DORA deben utilizarse para mejorar el sistema de desarrollo, no para evaluar el desempeño individual de los desarrolladores.
¿Cómo empezar a implementar DORA en tu organización?
Si quieres llevar estas métricas a la práctica con tu equipo, se recomienda seguir una ruta progresiva:
- Establece una línea base: Evalúa cómo está rindiendo el equipo hoy en día reuniendo datos históricos de estos cuatros puntos.
- Define el enfoque de medición: Automatiza la recolección de datos integrando herramientas de analítica directamente en tu pipeline CI/CD.
- Ponte metas realistas: Apunta a mejoras graduales basándote en tu línea base.
- Fomenta la transparencia: Asegúrate de que todos entiendan qué se está midiendo y por qué. DORA se debe usar como una herramienta de apoyo, no de penalización.
- Empieza pequeño y escala: Prueba la medición con un proyecto piloto antes de desplegar este marco de evaluación.
Inteligencia Artificial en el Pipeline: Maximizando la Eficiencia Operativa
El futuro de los pipelines está siendo transformado por la Inteligencia Artificial (IA). La IA se está integrando directamente en el ciclo de vida del software como un copiloto para los equipos de desarrollo y operaciones (un enfoque conocido como AIOps). AIOps, o inteligencia artificial para operaciones de TI, usa tecnologías como el aprendizaje automático y el procesamiento de lenguaje natural (PLN) para automatizar y mejorar la gestión de los sistemas de TI, analizando grandes cantidades de datos, encontrando patrones y ayudando a los equipos a entender qué está pasando.
Conclusión
En conclusión, DevOps y CI/CD son dos conceptos solamente relacionados que se basan en los principios de colaboración, automatización y entrega continua para impulsar la excelencia en el desarrollo y entrega de software en entornos ágiles.