La implantación de un flujo de trabajo CI/CD para el desarrollo de aplicaciones es cada vez más popular. Sin embargo, al mismo tiempo, escalar y optimizar CI/CD supone un reto.
Hoy vamos a discutir en qué consiste este reto y explorar exactamente cómo podemos escalar y optimizar CI/CD. Así que, ¡siga con nosotros!
Hoy en día, el desarrollo de aplicaciones suele realizarse en equipos formados por varios desarrolladores. Cada persona o equipo tiene su papel en el proyecto avanzando en su parte dedicada.
Nos encontramos entonces al final del proyecto con varias piezas de código por compilar. Dependiendo de los métodos de trabajo de cada uno, se puede perder mucho tiempo gestionando esta integración.
CI/CD, Integración Continua y Entrega/Despliegue Continuo, es una solución a este problema y garantiza que las actualizaciones se publiquen sin retrasos ni conflictos innecesarios. Entendamos este proceso.
Integración continua
CI o integración continua agrupa los procesos destinados a publicar continuamente los cambios y adiciones de código en una rama compartida del proyecto. Permite probar el código y realizar mejoras y cambios en tiempo real. El objetivo es probar cada elemento mediante la creación de pruebas.
Esta medida permanente permite no comprobarlo todo al final en un solo bloque y evitar trabajar en demasiados elementos simultáneamente. La realización de pruebas unitarias es, por tanto, muy útil para garantizar esto. De este modo, es más fácil detectar errores asegurándose de que el código se compila bien y no crea regresiones.
Entrega continua
La entrega continua o CD reúne la integración y las pruebas continuas que pueden agruparse en contenedores y ponerse en producción. Es decir, reúne estos códigos y pruebas realizadas y los pone en producción mediante la automatización.
Aunque requiera la acción humana, se automatiza al poner todo lo que se ha hecho «en el aire» de forma integrada y completa. Concretamente, con la distribución continua, nuestra aplicación se desarrolla de forma que pueda ponerse en producción, sin importar cuándo.
Despliegue continuo
Aunque los conceptos de distribución continua y despliegue continuo son similares, existen diferencias. Si su objetivo es el mismo, es decir, el despliegue de la aplicación en producción, los medios para lograrlo difieren. Lo que separa la entrega continua del despliegue continuo es la liberación.
En efecto, el despliegue continuo permite desplegar directamente cada modificación que atraviesa las diferentes etapas de nuestro pipeline. Mientras que en la entrega continua, es necesaria una etapa de validación humana para que se produzca el despliegue.
Escalado de CI/CD
Cuando aumenta el número de microservicios, resulta casi inevitable escalar su CI/CD. El aumento del número de microservicios da lugar a diferentes pipelines conectados a un único repositorio git, lo que aumenta la carga del servidor de CI y disminuye el rendimiento.
Para escalar el CI/CD, es necesario crear un pipeline de desarrollo estandarizado y automatizado para todos los equipos y, a partir de ahí, garantizar la calidad de las entregas de los desarrolladores individuales y de los equipos. También facilita la gestión del pipeline.
El escalado puede lograrse definiendo un proceso de CI para ejecutar pruebas unitarias y validar la calidad del código entregado.
Seguido de un proceso de CD para construir las imágenes y desplegarlas en los entornos de forma continua y, por último, definiendo un proceso para construir las imágenes y desplegarlas en el entorno de producción.
Pasos para escalar CI/CD
El primer paso consiste en alinear el pipeline con los arquitectos, implicando a los jefes de equipo. Sigue el mapeo de las ramas Git a los entornos (develop -> desarrollo y master -> [homologación y producción]). Luego viene el disparo del CI Job en cada Pull Request y del CD Job en cada cambio en las ramas mapeadas.
Se puede crear un Flujo de Trabajos tanto para CI como para CD para que sean seguidos.
El Flujo de Trabajo CI se desarrolla en 7 pasos:
- Comprueba el origen del Pull Request y la rama de destino ;
- Comprueba si la fusión no tiene conflictos que necesiten resolución manual;
- Ejecuta pruebas unitarias;
- Construir el paquete para verificar la integridad y que el código es compilable;
- Activa la validación de la calidad del código;
- Incrementa y confirma la versión del proyecto en la rama fuente;
- Notificar el éxito o el fracaso al repositorio Git Pull Request mediante Webhook o llamada a la API Rest (repositorio Git).
El flujo del trabajo de CD sigue el siguiente camino:
- Se comprueba la rama notificada.
- El artefacto se construye utilizando la herramienta de construcción específica del proyecto en el que se está trabajando.
- Tras la llegada del artefacto, los proyectos de la biblioteca se envían al Nexus para el almacenamiento del artefacto, y el flujo finaliza.
Se llevan a cabo las siguientes acciones:
Paso1 : Se crea una imagen Docker para el artefacto generado, aplicando la versión del artefacto a la imagen Docker.
Paso 2: La imagen se carga en el registro Docker.
Paso 3: Despliegue mediante rollout de la imagen a través de Kubernetes.
Para los proyectos de aplicación que se encuentran en un entorno de aprobación/producción, siga los pasos 1 y 2 anteriores y, a continuación, los siguientes:
- Despliegue a través de image rollout vía Kubernetes en el entorno de aprobación;
- El trabajo hace una pausa para esperar a que el despliegue sea aprobado para producción;
- Si se aprueba, la imagen que se está aprobando se promociona para producción;
- En caso contrario, hace rollout de la imagen en aprobación.
Optimización CI/CD
CI/CD mejora el ciclo de desarrollo de la aplicación y resuelve el problema causado por la integración de código nuevo y el aumento de la frecuencia de entrega.
A continuación le indicamos cómo puede optimizar aún más el uso de CI/CD:
Dé prioridad a la reparación de una compilación averiada
Cuando una compilación se estropea, arreglarla debería ser la prioridad del equipo. Si la compilación no puede arreglarse en cuestión de minutos, el equipo debe decidir si elimina el código o desactiva la bandera de función.
La idea de arreglar una compilación estropeada es que la compilación produzca siempre código que funcione y que pueda liberarse.
Pequeños despliegues frecuentes
Generalmente, la estabilidad de la aplicación está en riesgo cada vez que se produce un despliegue. Así que tendemos a distanciar los despliegues entre sí. El problema de este enfoque es que acumulamos demasiados cambios. Uno de estos cambios podría salir mal, obligándonos a deshacer los demás que estaban funcionando.
Aplique el patrón estrangulador y divida los cambios complicados en otros pequeños y sencillos. Si despliega con más frecuencia y trabaja en lotes pequeños, el riesgo de despliegue será menor.
Automatice las pruebas de control de calidad para mitigar el riesgo
Probablemente todos nos hemos visto envueltos en el escenario de «trabajé en mi máquina local» porque los entornos de desarrollo locales a menudo difieren. Puede haber muchas cosas diferentes entre su entorno local y el de producción. Puede optimizar el CI/CD automatizando las tareas de control de calidad (QA), como las pruebas del navegador, mitigando el riesgo de que un error llegue a la aplicación en vivo.
Confíe en las pruebas automatizadas
Para validar cuándo un desarrollador integra código nuevo, CI se basa en un conjunto de pruebas automatizadas y fiables. Si necesita compilar código, la primera prueba es que se compile. Después puede añadir tantas pruebas como considere críticas.
¿Cuántas pruebas deben incluirse? Para determinarlo, recuerde que el objetivo de CI es proporcionar información lo antes posible. Si un desarrollador tiene que esperar una hora para recibir retroalimentación, no funcionará. Siempre se le escaparán cosas, pero cuando detecte un fallo en producción, cree un caso de prueba e inclúyalo en el bucle de CI.
Considere siempre la seguridad
Tenga en cuenta la seguridad de una herramienta de CI/CD cuando se integre en configuraciones o entornos existentes. CI/CD requiere que todas las herramientas de pruebas de seguridad se llamen mediante programación y que sus resultados se agreguen en un solo lugar. Busque herramientas que dispongan de API para auditorías de codificación automatizadas.
Beneficios de escalar y optimizar CI/CD
Aparte de aumentar la eficiencia de los equipos de desarrollo, el escalado y la optimización de CI/CD también tienen otros beneficios, algunos de los cuales son:
Reducción de los gastos generales
Las horas de desarrollo suelen ser facturables, pero ¿qué ocurre con el tiempo dedicado a desplegar manualmente el código o los archivos? Automatizar grandes partes de su flujo le ahorrará tiempo para el trabajo facturable, algo que todo el mundo puede apreciar. Las pruebas automatizadas también le permiten fallar antes que encontrar errores en el control de calidad o en producción o, peor aún, que los encuentre el cliente. Más errores solucionados en el mismo tiempo es una clara victoria.
Entrega con menos errores y menos riesgos
Usted detecta los errores mucho antes en el proceso de desarrollo al lanzar cambios menores con mayor frecuencia. Cuando implanta pruebas automatizadas en todas las fases del desarrollo, no se arriesga a pasar el código que falla a la siguiente fase, y es más fácil deshacer los cambios menores cuando es necesario.
Responda a las condiciones del mercado con mayor rapidez
Las condiciones del mercado cambian constantemente. Supongamos que descubre que un nuevo producto está perdiendo ingresos o que más clientes acceden a su sitio web desde teléfonos inteligentes que desde ordenadores portátiles. En ese caso, es mucho más fácil hacer un cambio rápido si ha optimizado la entrega continua.
Confianza
Si ha optimizado la entrega continua, lo que significa que dispone de un sólido conjunto de pruebas, su confianza en que no se produzca un error aumenta enormemente. Si es transparente con su proceso y educa al resto de su equipo y a los clientes, su confianza en usted como equipo de desarrollo también aumenta.
Palabras finales
CI/CD hace que sus integraciones y entregas sean más rápidas. Sin embargo, es importante escalarlo y optimizarlo para evitar que el proceso se vuelva contraproducente debido a la creciente complejidad.
También puede consultar algunas de las mejores herramientas de CI.