¿Qué es el ciclo de CI/CD?

Un ciclo de integración continua y de distribución/implementación continua (CI/CD) es una serie de pasos que sigue la distribución de software desde que se crea el código hasta que se implementa. Los ciclos de CI/CD, un elemento clave para DevOps, optimizan el desarrollo de aplicaciones mediante la automatización de tareas repetitivas, lo cual permite detectar fallos en fases tempranas, reducir los errores manuales y acelerar la distribución del software.

Ciclo de CI/CD: explicación

El ciclo de CI/CD abarca una serie de procesos automatizados (desde el desarrollo del código hasta la implementación en el entorno de producción) que permiten distribuir cambios de código en el entorno de producción de manera frecuente y fiable. Constituye la piedra angular de DevOps, un cambio en el desarrollo de software que hace hincapié en la colaboración entre los equipos de desarrollo y de operaciones, con el objetivo final de acelerar el ciclo de vida del desarrollo sin poner en peligro la calidad del software.

El ciclo de CI/CD, que encarna los principios clave de DevOps, tiende un puente entre el desarrollo, las pruebas y las operaciones. En este entorno de colaboración, CI/CD fomenta una cultura empresarial de responsabilidad compartida por la calidad de un producto y la puntualidad en su distribución.

Various steps in the CI/CD pipeline

Figura 1: Pasos del ciclo de CI/CD

Integración continua (CI)

La integración continua (CI) es una práctica propia del desarrollo de software que consiste en fusionar periódicamente los cambios de código en un repositorio central. Con cada fusión, se ejecutan procesos automatizados de compilación y pruebas para garantizar la integración del nuevo código con la base de código existente sin que se introduzcan errores. De este modo, la CI reduce al mínimo las dificultades derivadas de fusionar los cambios al final del ciclo de desarrollo, como se hacía tradicionalmente.

Distribución e implementación continuas (CD)

La distribución y la implementación continuas (ambas denominadas «CD» por sus siglas en inglés) se ocupan de las fases sucesivas a la CI. La distribución continua automatiza el proceso de publicación, con lo que permite implementar en el entorno de producción cualquier versión del software en cualquier momento. Gracias a la CD, el software siempre está listo para implementarse, a pesar de los cambios constantes. La implementación continua va más allá, pues implementa automáticamente todos los cambios que superan las pruebas automatizadas para entrar en el entorno de producción, con lo que el ritmo de los cambios se acelera al máximo.

Tanto la distribución continua como la implementación continua pasan por implementar automáticamente la aplicación en varios entornos, como los de preproducción y producción, utilizando configuraciones predefinidas de la infraestructura. El ciclo de CD incorpora pruebas adicionales, como las evaluaciones de seguridad, rendimiento e integración, para garantizar la calidad y la fiabilidad de las aplicaciones.

Diferencias entre la distribución continua y la implementación continua

La diferencia principal entre la distribución y la implementación continua se encuentra en la fase final, cuando se trasladan los cambios al entorno de producción. En la distribución continua, el último paso de la implementación es un proceso manual, que brinda una red de seguridad para detectar posibles problemas que se hayan podido pasar por alto en las pruebas automatizadas. En cambio, la implementación continua automatiza todo el ciclo, incluida la implementación final en el entorno de producción, lo cual exige la configuración rigurosa de las pruebas y la supervisión para detectar y corregir problemas.

Dicho de otro modo, el término «CI/CD» se puede referir a dos estrategias distintas:

  1. Integración continua y distribución continua (CI/CD)
  2. Integración continua e implementación continua (CI/CD)

Al implementar un ciclo de CI/CD, las organizaciones aceleran los plazos de comercialización, disfrutan de circuitos de retroalimentación continua y mejoran la calidad del software. Los ciclos de CI/CD permiten a los equipos de desarrollo, operaciones y seguridad trabajar juntos y hace posible la distribución de aplicaciones seguras, estables y con un alto rendimiento.

Figura 2: Fases del ciclo de CI/CD

Figura 2: Fases del ciclo de CI/CD

Cómo es el día a día del ciclo de CI/CD

El día a día del ciclo de CI/CD empieza con el primer café del desarrollador. En cuanto llega, el desarrollador extrae el código más reciente del sistema de control de versiones, Git. Ahora que ya tiene los cambios más recientes, inicia la jornada laboral creando nuevas funciones y depurando los errores detectados.

Cuando termina, confirma los cambios en un repositorio compartido, una acción que pone en marcha el ciclo de CI/CD. El ciclo, configurado con webhooks, detecta la confirmación y activa la fase de compilación. Con una herramienta como Jenkins o CircleCI, el ciclo compila el código fuente en un archivo ejecutable. Si la base de código fuese una aplicación de Java, por ejemplo, habría que ejecutar una compilación Maven o Gradle.

A continuación, el ciclo empaqueta la aplicación en un artefacto implementable. Si se trata de una aplicación web, podría ser necesario crear una imagen de Docker. A continuación, el ciclo envía la imagen a un registro de Docker, como Docker Hub o un registro privado alojado en AWS ECR o Google Container Registry.

Una vez terminada la compilación, el ciclo pasa a la siguiente fase y se crea un entorno de pruebas, muchas veces con una herramienta de orquestación de contenedores como Kubernetes. En este entorno, implementa la aplicación y ejecuta una serie de pruebas automatizadas, como las pruebas unitarias ejecutadas por JUnit, las de integración realizadas con una herramienta como Postman y las pruebas exhaustivas que lleva a cabo Selenium.

Si se superan las pruebas, el ciclo pasa a la fase de implementación, donde desmantela el entorno de pruebas y se crea un entorno de producción. A continuación, la aplicación se implementa en este entorno, muchas veces siguiendo una estrategia de implementación azul/verde para reducir al mínimo el tiempo de inactividad y facilitar una reversión rápida cuando sea necesario.

Figura 3: La naturaleza circular del ciclo de integración continua y distribución/implementación continua

Figura 3: La naturaleza circular del ciclo de integración continua y distribución/implementación continua

A lo largo del día, el ciclo repite este proceso con cada nueva confirmación. Asimismo, se ocupa de tareas como gestionar las migraciones de bases de datos con herramientas como Flyway o Liquibase, ejecutar análisis estáticos de código con SonarQube e incluso redimensionar el entorno de producción según los patrones del tráfico.

El ciclo también proporciona retroalimentación en tiempo real al equipo de desarrollo. Envía notificaciones de los resultados de la compilación a un canal de Slack, crea tickets en Jira si hay compilaciones fallidas y actualiza un panel con métricas en tiempo real sobre el rendimiento del ciclo.

Al final del día, el ciclo de CI/CD está listo para la próxima confirmación y para seguir cumpliendo su misión de distribuir software de alta calidad con rapidez. Aunque el día sea repetitivo, con cada repetición el equipo se acerca más a su objetivo de ofrecer un valor añadido a los usuarios.

Fases de un ciclo de CI/CD

Al tratarse de un proceso basado en tecnología, el ciclo de CI/CD se integra con los sistemas de control de versiones, los servidores de compilaciones y otras herramientas de desarrollo. El ciclo estándar abarca varias fases, cada una de ellas diseñada para validar el código desde distintos puntos de vista y para corroborar que está listo para su implementación.

Cuando un desarrollador confirma el código en el repositorio de control de versiones, el ciclo se activa, automatizando las fases de recopilación, compilación, prueba e implementación.

Fase de recopilación

En la fase de recopilación interviene el sistema de control de versiones en el que los desarrolladores confirman los cambios de código. El ciclo de CI/CD supervisa el repositorio y activa la siguiente fase cuando se detecta una nueva compilación. Git, Mercurial y Subversion son algunos de los sistemas de control de versiones más utilizados.

Fase de compilación

Durante la fase de compilación, el ciclo de CI/CD compila el código fuente y crea artefactos ejecutables. Esta fase puede abarcar el empaquetado de código en un contenedor Docker u otro formato adecuado para la implementación. Para ser fiable, el proceso de compilación debe ser repetible y coherente.

Fase de pruebas

La fase de pruebas del ciclo de CI/CD consiste en ejecutar una serie de pruebas automatizadas (unitarias, de integración y exhaustivas) en los artefactos compilados. La automatización de las pruebas es crucial en esta fase para detectar y corregir problemas con rapidez.

Fase de implementación

La fase de implementación es la última en el ciclo de CI/CD. Con una configuración de distribución continua, la fase de implementación prepara la versión para la implementación manual. En una configuración de implementación continua, el ciclo implementa automáticamente la versión en el entorno de producción.

Tipos de ciclos de CI/CD

Para un programa sencillo, un ciclo de CI/CD suele pasar por fases como la recopilación, la compilación, las pruebas y la implementación. Los desarrolladores confirman el código en un sistema de control de versiones como Git. El ciclo activa un proceso para compilar el código y crear artefactos. Se realizan pruebas automatizadas para controlar la calidad de estos artefactos. En caso de superación de las pruebas, el ciclo implementa los artefactos en un entorno de producción. Este proceso se puede orquestar con herramientas como Jenkins, CircleCI o GitLab CI/CD.

Ciclos de CI/CD nativos en la nube

Un ciclo de CI/CD nativo en la nube aprovecha la modularidad propia de los microservicios para facilitar la independencia del desarrollo y la implementación. Cada microservicio tiene su propio ciclo, lo que permite aislar las pruebas, la compilación y la implementación. De este modo, se reduce el riesgo de que los fallos se transmitan en cadena y aumenta la velocidad de la distribución.

En el ciclo basado en microservicios, la seguridad se aplica en distintos niveles, uno de los cuales pasa por tratar cada microservicio como un límite de seguridad potencial, con sus propios permisos y controles. Para proteger la integridad de los microservicios, conviene seguir prácticas de seguridad de los contenedores como el análisis de imágenes y la protección en tiempo de ejecución.

Las mallas de servicios como Istio o Linkerd, una tecnología habitual en los ciclos nativos en la nube, brindan un modo uniforme de proteger, conectar y supervisar microservicios habilitando el protocolo TLS mutuo y funciones similares para la comunicación de servicio a servicio.

Los ciclos de CI/CD nativos en la nube utilizan herramientas en la nube para los repositorios de código, servidores de compilaciones y objetivos de implementación. Por ejemplo, un ciclo en AWS podría usar CodeCommit para el control del código fuente, CodeBuild para realizar compilaciones y pruebas, y CodeDeploy para la implementación. Estos ciclos se pueden integrar con funciones nativas en la nube y ofrecen opciones de pago por uso. Además, su escala se puede ampliar bajo demanda.

Ciclos nativos en Kubernetes

La arquitectura ampliable de Kubernetes respeta los principios de los ciclos de CI/CD, lo que permite distribuir las aplicaciones con rapidez y fiabilidad. El ciclo nativo en Kubernetes funciona directamente dentro de un clúster de Kubernetes, aprovechando sus funciones para la orquestación, el escalado y la gestión de aplicaciones basadas en contenedores. Puede implementar aplicaciones basadas en contenedores en varios clústeres, así como gestionar las reversiones y la detección de servicios. Las fases del ciclo, como la compilación, las pruebas y la implementación, se ejecutan como pods o tareas de Kubernetes, brindando aislamiento y control de los recursos.

Para garantizar la seguridad en los ciclos nativos en Kubernetes, hay que seguir prácticas específicas de Kubernetes. Se utilizan los controles de acceso basados en funciones (RBAC) para limitar los permisos de las fases de los ciclos, con lo que se reduce el radio de la onda expansiva de los posibles problemas de seguridad. Las políticas de seguridad de los pods refuerzan la estrategia de seguridad restringiendo las funciones de los contenedores que ejecutan las fases del ciclo.

Hay herramientas de CI/CD, como Jenkins X, Tekton y Argo CD, diseñadas para los ciclos nativos en Kubernetes, que ofrecen funciones como la promoción del entorno mediante GitOps y entornos para previsualizar las solicitudes de incorporación de cambios.

Ciclo de CI/CD para un monorrepositorio

Un monorrepositorio es un repositorio único que contiene más de un proyecto lógico. El ciclo de CI/CD de un monorrepositorio tiene que gestionar los cambios de varios proyectos con eficiencia. Solo se deberían compilar y probar los proyectos afectados por un cambio, no todo el repositorio.

Los desarrolladores pueden usar herramientas de CI/CD avanzadas, como Bazel o Cloud Build de Google, para crear un gráfico de dependencias de la base de código y usarlo para volver a compilar y someter a nuevas pruebas solo las partes de la base de código que dependan del código modificado.

En el ciclo de CI/CD de un monorrepositorio, la seguridad evita que los cambios afecten a otros componentes. Las pruebas automatizadas y el análisis de código estático detectan posibles problemas de seguridad en fases tempranas del ciclo. Las prácticas de revisión del código deben aplicarse sin excepciones para garantizar la integridad del monorrepositorio.

Ciclos de CI/CD en la nube

Las plataformas en la nube ofrecen funciones muy eficaces para implementar los ciclos de CI/CD, como la escalabilidad ilimitada, la alta disponibilidad y los mecanismos inherentes de recuperación en caso de desastre.

La elasticidad de los recursos en la nube favorece el escalado dinámico de los procesos de CI/CD según la carga de trabajo y, con él, la eficiencia y la optimización de costes. La CI/CD en la nube también facilita el trabajo de los equipos de desarrollo distribuidos, pues mejora la colaboración y hace posible una estrategia de desarrollo de software global.

CI/CD en AWS

Los proveedores de Amazon Web Services (AWS) ofrecen un paquete de herramientas para implementar un ciclo de CI/CD. AWS CodeCommit, un servicio de control del código fuente completamente gestionado, aloja repositorios Git seguros, con lo que facilita la colaboración en la codificación y el control de versiones.

AWS CodeBuild, un servicio de compilación gestionado, compila el código fuente, ejecuta pruebas y produce paquetes de software listos para su implementación. AWS CodePipeline, un servicio de integración continua y distribución continua, orquesta el flujo de trabajo desde el código fuente hasta la implementación, lo que permite modelar, visualizar y automatizar el proceso de publicación de software.

AWS CodeDeploy, un servicio de implementación automatizado, facilita la implementación de aplicaciones en distintos servicios de AWS, como Amazon EC2, AWS Lambda y Amazon ECS. AWS también se integra con herramientas de código abierto muy utilizadas, para proporcionar una solución de CI/CD flexible y exhaustiva.

CI/CD en Azure

Azure Pipelines, un servicio en la nube, admite tanto la integración continua como la distribución continua y es compatible con cualquier lenguaje y plataforma, con lo que brinda una solución versátil para diversos entornos de desarrollo.

Azure Repos proporciona una cantidad ilimitada de repositorios Git privados alojados en la nube, lo cual permite a los equipos colaborar y gestionar el código con eficacia. Azure Test Plans es una solución exhaustiva para gestionar, controlar y planificar pruebas con el fin de garantizar la distribución de software de calidad.

Además, Azure ofrece varias extensiones e integraciones con herramientas populares de código abierto, lo que mejora sus ventajas como plataforma de CI/CD.

CI/CD en Google Cloud

Google Cloud Platform (GCP) ofrece Cloud Build para CI/CD, un producto sin servidor que permite a los desarrolladores compilar, probar e implementar software en la nube. Cloud Build permite definir flujos de trabajo personalizados para realizar compilaciones, pruebas e implementaciones en distintos entornos, como máquinas virtuales, entornos sin servidor, Kubernetes o Firebase.

Gracias a Google Cloud Source Repositories, los equipos pueden almacenar, gestionar y controlar el código en un solo lugar, con un repositorio Git seguro, escalable y de alta disponibilidad. GCP también se integra con herramientas de código abierto muy utilizadas, como Git, Jenkins y Spinnaker, para proporcionar una solución CI/CD flexible y personalizable.

CI/CD en IBM Cloud

IBM Cloud ofrece un conjunto de herramientas completo para implementar un ciclo de CI/CD. El servicio IBM Cloud Continuous Delivery proporciona cadenas de herramientas con integraciones de herramientas abiertas y plantillas para automatizar la compilación, implementación y gestión de las aplicaciones.

IBM Cloud Code Engine es una plataforma sin servidor completamente gestionada que ejecuta las cargas de trabajo basadas en contenedores, como las aplicaciones web, los microservicios, las funciones basadas en eventos o las tareas por lotes. Además, IBM Cloud también se integra con herramientas de código abierto muy utilizadas, como Git, Jenkins y Tekton, así que se trata de una opción muy versátil para la implementación de CI/CD.

Prácticas recomendadas para los ciclos de CI/CD

Para mejorar el flujo de trabajo de DevOps y la distribución de software, incorpore las siguientes prácticas recomendadas a su ciclo de vida del desarrollo.

Un solo repositorio para todo el código fuente

Al utilizar un solo repositorio para todo el código fuente, contará con un sistema de gestión de código abierto (SCM) que centraliza el almacenamiento de todos los archivos y scripts necesarios para crear compilaciones. El repositorio debería incluir el código fuente, la estructura de las bases de datos, las bibliotecas, los archivos de propiedades y el control de versiones. Asimismo, debería contener los scripts de pruebas y los scripts para crear aplicaciones.

Trabajar desde un solo repositorio para todo el código fuente mejora la colaboración, favorece la coherencia, simplifica el control de las versiones, reduce el riesgo de que surjan conflictos y facilita el seguimiento de los cambios.

Basta con una compilación

Compile el código y cree artefactos de compilación una sola vez, y utilice esos artefactos a lo largo de todo el ciclo. Es una buena forma de mantener la coherencia al evitar las discrepancias que podrían surgir si el código se compila en todas las fases.

Automatización del proceso de compilación

La práctica de las compilaciones automatizadas, o convertir código en un artefacto implementable, reduce la posibilidad de que se comentan errores humanos y acelera el proceso de desarrollo. Los scripts de compilación deben ser muy exhaustivos para que pueda compilar todo —archivos de servidores web, scripts de bases de datos, software de aplicaciones, etc.— con un solo comando. Los procesos de CI deberían empaquetar y compilar el código automáticamente en una aplicación utilizable.

Priorización de las tareas de automatización

Automatice todo lo que pueda: la integración del código, las pruebas, la implementación, el aprovisionamiento de la infraestructura y la configuración. Con la automatización, aumenta la eficiencia al tiempo que se garantiza la repetibilidad. Una vez que los desarrolladores han enviado el código al repositorio compartido, el servidor de CI activa automáticamente un proceso de compilación y prueba en el que se van señalando los problemas sobre la marcha. Con este proceso, se reduce de forma considerable el tiempo y el esfuerzo que exige la integración manual, con lo que los desarrolladores podrán centrarse en las mejoras del código.

Pruebas frecuentes y tempranas

Incorpore pruebas automatizadas en las primeras fases del ciclo. Ejecute pruebas unitarias después de la fase de compilación y, a continuación, realice pruebas de integración y pruebas integrales. Diseñe scripts de pruebas para obtener una compilación fallida si el código no supera la prueba.

Entornos de pruebas clonados

En lugar de probar el nuevo código en el propio entorno de producción, realice las pruebas en un entorno que replique el de producción. Utilice scripts de pruebas rigurosos en el entorno clonado para detectar e identificar errores que se hayan podido pasar por alto en el proceso de pruebas inicial previo a la compilación.

Implementaciones frecuentes

Si se realizan implementaciones frecuentes, se reduce el tamaño de los lotes de cambios, con lo que resulta más fácil detectar y corregir problemas. Además, la retroalimentación se acelera, las reversiones son más factibles y el tiempo que tarda un usuario en experimentar los beneficios de su aplicación se reduce.

El ciclo de CI/CD como única forma de implementación

No permita las implementaciones manuales en el entorno de producción. Todos los cambios deben recorrer el ciclo entero para garantizar que se someten a prueba y que son coherentes y trazables.

Visibilidad

Los equipos de desarrollo deberían tener acceso a los últimos archivos ejecutables, así como a una línea visual de todos los cambios que se hayan hecho en el repositorio. Se debe utilizar el control de versiones para gestionar las entregas, de forma que los desarrolladores sepan siempre qué versión es la última.

Optimización del circuito de retroalimentación

El ciclo debería proporcionar retroalimentación útil con rapidez. Es fundamental avisar a los desarrolladores de inmediato si los cambios no superan las pruebas o, como consecuencia de ellos, la compilación deja de funcionar. Con una retroalimentación rápida, los problemas se corrigen con prontitud y el ciclo sigue fluyendo.

Limpieza de los entornos con cada versión

Automatice la limpieza de los entornos de preproducción y pruebas después de cada publicación para ahorrar recursos y permitir que cada implementación empiece con un estado limpio.

KPI de los ciclos de CI/CD

Duración del ciclo o tiempo de implementación

La duración del ciclo, también llamado «tiempo de implementación», es el tiempo que transcurre desde que se confirma el código hasta que se implementa en el entorno de producción. Se trata de un indicador clave de lo eficiente o ineficiente que es el ciclo de CI/CD. Cuanto más corto es el ciclo, antes empiezan a beneficiarse los usuarios de la aplicación y más rápido reciben retroalimentación los desarrolladores.

Frecuencia de desarrollo (Development Frequency)

Este término se refiere a la frecuencia con la que se confirman cambios de código en el sistema de control de versiones. Una frecuencia de desarrollo alta se corresponde con un proceso de desarrollo activo, lo cual a su vez se traduce en cambios más pequeños y fáciles de gestionar y, en consecuencia, un menor riesgo de cometer errores.

Tiempo de espera para los cambios (Change Lead Time)

El tiempo de espera para los cambios mide el tiempo que pasa desde que se confirma un cambio hasta que se implementa, así que es una forma de medir la velocidad del ciclo de CI/CD. Cuanto más cortos sean estos tiempos, antes se beneficiará el usuario de los cambios y más rápidos serán los circuitos de retroalimentación.

Tasa de fallos por cambios (Change Failure Rate)

La tasa de fallos por cambios es el porcentaje de cambios que dan lugar a un fallo en el entorno de producción. Si es baja, significa que el proceso de distribución de software es de alta calidad. Influyen en este parámetro factores como la calidad de las pruebas, las prácticas de revisión del código y las prácticas de implementación.

Diferencias entre MTTR y MTTF

El tiempo medio de recuperación (MTTR) y el tiempo medio hasta el fallo (MTTF) reflejan la fiabilidad del ciclo de CI/CD. El MTTR es el tiempo que se tarda por término medio en recuperarse de un fallo, mientras que el MTTF mide el tiempo medio entre un fallo y otro. Si el MTTR es bajo y el MTTF es alto, significa que el ciclo es más fiable.

Vídeo 1: Transición a metodologías más modernas con nuevas tecnologías y DevOps

Herramientas de CI/CD

Herramientas de integración continua

Codefresh

Codefresh, una plataforma de CI/CD diseñada para Kubernetes, facilita el ciclo de vida del desarrollo de aplicaciones desde que se confirma el código hasta que se implementa. Su particular infraestructura nativa en Docker permite realizar compilaciones aisladas con rapidez, lo cual brinda un entorno versátil para desarrollar, probar e implementar aplicaciones basadas en contenedores.

Bitbucket Pipelines

Bitbucket Pipelines, un servicio de CI/CD integrado que forma parte de Bitbucket, permite a los equipos de desarrollo compilar, probar e implementar código automáticamente según un archivo de configuración almacenado en su repositorio. Gracias a su integración perfecta con Bitbucket y al paquete de herramientas de Atlassian, mejora de forma considerable el flujo de trabajo para los equipos que ya utilizan el ecosistema de Atlassian.

Jenkins

Jenkins es un servidor de automatización de código abierto que permite a los desarrolladores compilar, probar e implementar su software de forma fiable. Ofrece compilaciones distribuidas y una amplia compatibilidad con complementos, lo que hace de él una herramienta muy flexible para los ciclos de CI/CD complejos.

CircleCI

CircleCI es una plataforma moderna de integración y distribución continuas que apuesta por la sencillez y la eficiencia, y favorece la rapidez en el desarrollo y la publicación de software. Ofrece almacenamiento en caché automático e inteligente, paralelismo y orquestación de tareas para optimizar el proceso de distribución de software.

Bamboo

Bamboo, otra herramienta del paquete Atlassian, brinda funciones de integración y distribución continuas, con el software JIRA y Git integrados. Si bien no es tan ampliable como Jenkins, Bamboo tiene funciones listas para usar que hacen posible una configuración más sencilla; ideal para los equipos de desarrollo que necesiten una implementación fácil y rápida.

GitLab CI

GitLab CI, parte integral de GitLab, es una solución sólida que facilita todo el ciclo de vida de DevOps. Ofrece configuraciones de ciclos flexibles y una integración perfecta con el control de fuentes y el seguimiento de problemas de GitLab, lo que da lugar a una solución todo en uno para el desarrollo y la implementación de software.

Herramientas de distribución e implementación continuas

Codefresh

Además de proporcionar funciones de CI, Codefresh también facilita la distribución continua. Gracias al aislamiento del entorno y a los charts de Helm, permite distribuir las aplicaciones de Kubernetes de forma eficiente y fiable.

Argo CD

Argo CD es una herramienta declarativa de distribución continua de GitOps para Kubernetes que, usando los repositorios de Git como fuente de información fidedigna, define las aplicaciones y las sincroniza automáticamente cuando se detectan cambios en el repositorio.

GoCD

GoCD es una herramienta de código abierto especializada en la modelización y visualización de flujos de trabajo complejos para la distribución continua. Su mapa de la cadena de valor permite visualizar toda la ruta desde que se confirma el código hasta que se implementa, lo cual mejora la comprensión y el control del proceso de distribución de software.

AWS CodePipeline

AWS CodePipeline es un servicio gestionado de distribución continua que automatiza los ciclos de publicación para garantizar la velocidad y la fiabilidad a la hora de actualizar las aplicaciones. Como parte del paquete AWS, CodePipeline se integra a la perfección con otros servicios de AWS y garantiza la eficacia de la gestión y automatización de todo el proceso de publicación dentro del ecosistema de AWS.

Azure Pipelines

Azure Pipelines, que forma parte de los servicios Azure DevOps de Microsoft, es un servicio en la nube que brinda funciones de CI/CD para aplicaciones de cualquier lenguaje y plataforma. Destaca por su gran capacidad de integración, ya que puede usarse con los servicios y las herramientas más utilizados en el mundo del desarrollo y ofrece una cantidad ilimitada de minutos de compilación gratuitos para proyectos de código abierto.

Spinnaker

Spinnaker, una plataforma de distribución continua de varias nubes desarrollada en su origen por Netflix, ofrece numerosas opciones de configuración y funciones de implementación muy eficaces para distintos proveedores de servicios en la nube. Se centra en la implementación y admite varias estrategias, como las versiones azul/verde y de valores controlados, con un alto grado de control del proceso de distribución.

Aplicaciones de CI/CD con aprendizaje automático

MLOps

MLOps, una combinación de aprendizaje automático y operaciones, se ha diseñado para estandarizar y optimizar el ciclo de vida del desarrollo y la implementación de modelos de aprendizaje automático. Aplica los principios de CI/CD para automatizar las pruebas, la implementación y la supervisión de modelos de aprendizaje automático, facilitando una distribución fiable y coherente.

Técnicas de generación de datos sintética

En el desarrollo de aprendizaje automático, la generación de datos sintética es un método para crear datos que imitan los reales. En los ciclos de CI/CD, esta estrategia es muy útil a la hora de probar modelos de aprendizaje automático, pues proporciona un sistema escalable para evaluar el rendimiento y la exhaustividad de los modelos garantizando el respeto a la privacidad.

Plataformas de AIOps

La AIOps (inteligencia artificial para las operaciones de TI) integra la IA y las tecnologías de aprendizaje automático en las operaciones de TI. En el contexto de los ciclos de CI/CD, AIOps automatiza y mejora numerosas tareas, como la detección de anomalías, la correlación de eventos y el análisis de la causa original, lo cual hace que mejoren la eficiencia y la eficacia de la distribución de software.

Seguridad en los ciclos de CI/CD

La velocidad y la automatización de los ciclos de CI/CD dan lugar a nuevos riesgos, como los siguientes:

  • Exposición de datos confidenciales
  • Uso de componentes de terceros no seguros
  • Accesos no autorizados si las herramientas de CI/CD no se protegen correctamente

Sin embargo, si dan prioridad a la seguridad de CI/CD e integran prácticas y herramientas de seguridad a lo largo del ciclo (una práctica que se denomina DevSecOps), las organizaciones podrán garantizar que el software que distribuyen sea, además de funcional, seguro.

Prácticas de programación segura

Los desarrolladores deberían adoptar prácticas de programación segura para no introducir vulnerabilidades en la base del código. Entre las prácticas a las que dar prioridad, se encuentran la validación de los datos entrantes, la gestión correcta de errores y el respeto al principio del mínimo privilegio.

Pruebas de seguridad

Integre pruebas de seguridad automatizadas en el ciclo de CI/CD. Pruebas como el análisis de código estático, el análisis dinámico y las de penetración pueden servir para detectar vulnerabilidades antes de implementar la aplicación.

Seguridad en la implementación

Proteja el proceso de implementación. Utilice protocolos seguros para la transmisión de datos, gestione los permisos y controles de acceso durante el proceso de implementación, y supervise la aplicación en el entorno de producción para detectar los incidentes de seguridad.

Arquitectura segura de los ciclos de CI/CD

Una arquitectura segura de los ciclos de CI/CD integra controles de seguridad en todas las fases del ciclo. Utilice repositorios seguros para controlar el código fuente, lleve a cabo comprobaciones de seguridad durante el proceso de compilación, ejecute pruebas de seguridad automatizadas y asegúrese de aplicar prácticas de implementación seguras.

Seguridad en la infraestructura como código

La infraestructura como código (IaC), una práctica clave en DevOps, consiste en gestionar y aprovisionar infraestructura informática a través de archivos de definición legibles por máquinas. La seguridad en IaC consiste en gestionar estos archivos de definición y la infraestructura que crean. Cifre los datos confidenciales, limite el acceso a los archivos de la infraestructura como código (IaC) y audítela periódicamente para garantizar el cumplimiento normativo en materia de seguridad.

Próximas tendencias en materia de CI/CD

Microservicios y arquitecturas sin servidor

Ahora que las organizaciones tienden cada vez más a adoptar microservicios y arquitecturas sin servidor, los ciclos de CI/CD deberán adaptarse para gestionar implementaciones más complejas. Para ello, tienen que implementar y gestionar varios servicios interdependientes, cada uno de los cuales podría utilizar diferentes tecnologías y plataformas de implementación.

Inteligencia artificial y aprendizaje automático

La IA y el ML se utilizan cada vez más para optimizar los ciclos de CI/CD. En los ciclos de CI/CD, estas tecnologías se pueden usar para predecir y prevenir posibles problemas, optimizar el uso de los recursos y automatizar las tareas más complejas, entre otras posibilidades.

Infraestructura como código

La IaC se está convirtiendo en una práctica estándar en DevOps. Conforme evolucionan las herramientas y las prácticas de IaC, desempeñarán un papel cada vez más importante en los ciclos de CI/CD.

Preguntas frecuentes sobre los ciclos de CI/CD

La gestión de la configuración es un proceso de ingeniería de sistemas para establecer y mantener la coherencia en los atributos físicos, funcionales y de rendimiento de un producto con sus requisitos, diseño e información operativa a lo largo de su vida. En el contexto del desarrollo de software, la gestión de la configuración se refiere a la gestión, organización y control sistemáticos de los cambios realizados en los documentos, códigos y otras entidades durante el proceso de desarrollo.
La orquestación del ciclo de CI/CD es el proceso de automatizar y gestionar la secuencia de tareas que tienen lugar desde que se confirma el código hasta que se implementa. Su objetivo es mejorar la eficiencia y la fiabilidad del ciclo, lo cual pasa por lo siguiente:
  • Optimizar los procesos
  • Garantizar que tengan lugar en el orden correcto
  • Gestionar las dependencias que pueda haber entre las distintas tareas

Jenkins, CircleCI y Bamboo son algunas de las herramientas de CI/CD más utilizadas para la orquestación de ciclos. También Kubernetes se utiliza cada vez más para este propósito, sobre todo en las arquitecturas de microservicios.

Un repositorio de artefactos es una ubicación en la que almacenar archivos binarios y otros artefactos de software producidos durante el proceso de desarrollo de software. Puede contener código compilado, bibliotecas, módulos, imágenes de servidor o imágenes de contenedor. Los repositorios de artefactos como JFrog Artifactory o Sonatype Nexus brindan control de versiones, metadatos y otras funciones, lo cual facilita el almacenamiento, la recuperación y la gestión de estos artefactos.
El control de versiones, también denominado «control del código fuente», es un sistema que registra los cambios que experimenta un archivo o conjunto de archivos a lo largo del tiempo para poder recuperar versiones específicas posteriormente cuando sea necesario. Permite restaurar un estado anterior de un determinado archivo, restablecer un estado anterior de todo el proyecto, comparar los cambios realizados a lo largo del tiempo, ver quién fue la última persona en modificar algo que puede estar causando un problema, etc.
Mantener una única fuente de información fidedigna en CI/CD significa contar con una sola vista de información que todo el mundo considera la versión definitiva. Esta característica, que suele referirse a la base del código de un sistema de control de versiones como Git, garantiza que los miembros del equipo de desarrollo y operaciones trabajen con los mismos datos para reducir las incoherencias y los conflictos. La única fuente de información fidedigna proporciona una base fiable para compilar, probar e implementar software.
Los controles de accesos basados en ciclos son medidas de seguridad que regulan quién puede interactuar con un ciclo de CI/CD y de qué forma. Pueden limitar quién activa un ciclo, modifica su configuración o accede a los resultados de la compilación. Estos controles son cruciales para mantener la integridad de los procesos de desarrollo e implementación, prevenir los cambios no autorizados y garantizar el cumplimiento de las políticas de seguridad.
Las estrategias de ramificación para CI/CD se refieren a la ramificación de las funciones, en la que las nuevas funciones se desarrollan en ramas independientes para después fusionarse en la rama principal; el desarrollo basado en troncos, en el que los desarrolladores trabajan en una sola rama con ramas de funciones temporales; y Gitflow, que utiliza ramas independientes para el desarrollo, la preproducción y la producción, cada una de ellas orientada a una fase diferente del ciclo de CI/CD.
El desarrollo de basado en troncos es una estrategia de desarrollo de software en la que todos los desarrolladores trabajan en una sola rama, que se suele llamar «principal» o «tronco». Los desarrolladores suelen integrar los cambios en esta rama principal, por lo general una vez al día, con lo que promueven la integración y reducen la complejidad de las fusiones.
ua-parser-js es una biblioteca ligera de JavaScript que detecta el navegador, el motor, el sistema operativo, la CPU y el tipo y modelo de dispositivo a partir de los datos del usuario-agente. La biblioteca puede resultar útil para realizar análisis, pues muestra páginas web o recursos diferentes según el entorno del usuario, así como en otras situaciones en las que el hecho de conocer el navegador y el dispositivo del usuario permite mejorar la experiencia del usuario u obtener indicadores útiles.
Un modelo de madurez de distribución continua es un marco que ayuda a las organizaciones a valorar su nivel de dominio y madurez en la implementación de prácticas de distribución continua. Por lo general, abarca varios niveles (desde inicial hasta optimizado, pasando por gestionado), cada uno de ellos con sus propias prácticas recomendadas y funciones. El modelo ayuda a las organizaciones a determinar qué áreas son susceptibles de mejora y a planificar el proceso que les permitirá adoptar prácticas más maduras.
En el contexto de los sistemas de control de versiones, confirmar el código significa almacenar en un repositorio los cambios aplicados a una base de código. Cada confirmación constituye un cambio individual en el código, que con frecuencia va acompañado de un mensaje que lo describe. Las confirmaciones crean un historial de modificaciones que permite a los desarrolladores llevar un seguimiento del progreso, comprender los cambios y restablecer versiones previas en caso de necesidad.
La ejecución de ciclos se refiere al proceso de ejecutar todas las tareas definidas en un ciclo de CI/CD, y suele comenzar con una confirmación del código o un evento programado. Conlleva la ejecución de fases como la compilación, las pruebas y la implementación de forma secuencial o en paralelo, según cuál sea la configuración de los ciclos. La ejecución se puede visualizar como un flujo de tareas, cada una de las cuales depende de la correcta realización de las anteriores para garantizar que el código esté listo para la implementación.
La cobertura de código es un parámetro que ayuda a medir el grado de ejecución del código fuente de un programa cuando se realiza un conjunto de pruebas determinado. Revela qué líneas de código se han ejecutado y cuáles no, lo cual facilita información sobre la exhaustividad de sus pruebas. Una cobertura de código alta puede ayudar a evitar que se cuelen errores en el entorno de producción.
El análisis de código estático es un método de depuración que consiste en examinar el código fuente antes de ejecutar un programa. Para ello, se analiza un conjunto de código comparándolo con uno o varios conjuntos de reglas de programación. Las pruebas de seguridad de aplicaciones estáticas (SAST) ayudan a detectar posibles vulnerabilidades, errores y vulneraciones de los estándares de programación, lo cual permite mejorar la calidad y la seguridad del código. Las herramientas para el análisis de código estático suelen estar integradas en los ciclos de CI/CD.
Las pruebas unitarias consisten en realizar pruebas en cada componente de una aplicación de software de forma aislada. Su objetivo es garantizar que cada unidad del software funcione tal como se espera. Una unidad es la parte más pequeña de un software que se puede someter a pruebas (por lo general, una función o un método). Los desarrolladores escriben pruebas unitarias, que suelen ser automatizadas, para comprobar que su código sea correcto. De este modo, contribuyen a detectar problemas en fases tempranas del ciclo de desarrollo.
Las pruebas de integración son un tipo de prueba de software en la que se combinan varias unidades individuales y se someten a pruebas de forma colectiva. El objetivo es detectar errores en el modo en que interactúan varias unidades integradas. Se crean casos de pruebas con el propósito explícito de observar cómo se comportan las interfaces entre una unidad y otra. Esta actividad está a cargo de los responsables de las pruebas después de las pruebas unitarias y se puede realizar de forma descendente, ascendente o intercalada. Las pruebas de integración pueden revelar problemas como incoherencias en las interfaces, fallos en la comunicación o errores relativos a los datos que podrían haber pasado desapercibidos en las pruebas unitarias.
Las pruebas de regresión son un tipo de prueba de software que permite confirmar que un software ya desarrollado y probado sigue funcionando según lo previsto después de realizar cambios. El objetivo es detectar nuevos errores o regresiones provocados por las modificaciones realizadas en el software. Las pruebas de regresión se pueden realizar en cualquier nivel y suelen ser automatizadas para evitar que se introduzcan defectos en funciones que antes carecían de problemas.
Las pruebas inestables («flaky tests») son pruebas automatizadas que muestran un resultado satisfactorio y fallido con el mismo código. Son impredecibles, porque el resultado puede ser diferente sin que haya cambios en el código. Pueden deberse a varios factores, como problemas relacionados con el momento en que se realizan, dependencias de estados concretos u operaciones asíncronas. Pueden llevar a una pérdida de confianza en un conjunto de pruebas, así que es necesario detectarlas y corregirlas o eliminarlas.
Los marcadores de funcionalidad, o «feature flags», son una técnica de desarrollo de software que permite a los desarrolladores activar o desactivar funciones de un producto de software para probar las funciones y revertir rápidamente las que sean problemáticas. Los desarrolladores pueden usarlos incluso después de haber implementado el software en el entorno de producción.
Una versión de valores controlados permite implementar gradualmente un cambio en un pequeño subconjunto de usuarios antes de la implementación en la infraestructura completa para reducir el riesgo que supone introducir una nueva versión de software en el entorno de producción. Se utiliza para detectar posibles problemas y errores que se hayan pasado por alto durante la fase de pruebas, con un impacto mínimo en la base de usuarios.
Las implementaciones azul/verde ofrecen una estrategia de gestión de versiones que reduce el tiempo de inactividad y los riesgos ejecutando dos entornos de producción idénticos, denominados azul y verde. En cada momento, solo uno de ellos funciona como entorno de producción para todo el tráfico. Cuando se publica una nueva versión de la aplicación, el entorno inactivo se actualiza, se somete a pruebas y, cuando está listo, se convierte en el entorno de producción. Las implementaciones azul/verde permiten una reversión rápida si se detectan problemas en la nueva versión.
La orquestación de versiones es el proceso de coordinación de varias tareas, necesario para distribuir cambios de software en el entorno de producción. Abarca aspectos como la gestión de dependencias entre las distintas tareas, la automatización de los flujos de trabajo y la garantía de que cada paso, desde la confirmación del código hasta la implementación, se ejecute en el orden correcto. Las herramientas de orquestación de versiones permiten ver el proceso de publicación, lo que ayuda a los equipos a gestionar implementaciones complejas y a reducir los riesgos.

La asignación de la cadena de valor (VSM) es un método de gestión ágil para analizar el estado actual y diseñar un estado futuro para la serie de eventos que se suceden desde que nace el concepto de un producto hasta su distribución. En lo que se refiere a los ciclos de CI/CD, VSM visualiza el flujo de cambios de código desde el desarrollo hasta la producción, para detectar cuellos de botella, redundancias o pérdidas de eficiencia en el proceso. Ayuda a los equipos a comprender todo el ciclo de vida de la distribución, optimizar los procesos y acelerar los cambios.

La asignación de la cadena de valor permite a las organizaciones tomar decisiones basadas en datos para optimizar sus ciclos de CI/CD ajustándolos más a los objetivos empresariales.

La ingeniería de la fiabilidad del sitio (SRE) es una disciplina que combina aspectos de la ingeniería de software y de la ingeniería de sistemas para compilar y ejecutar sistemas escalables, fiables y eficientes. La SRE, que tiene su origen en Google, implementa principios de DevOps haciendo hincapié en la fiabilidad. Utiliza el software como herramienta para gestionar sistemas, resolver problemas y automatizar tareas operativas. Abarca prácticas clave como la definición de objetivos de nivel de servicio (SLO), los presupuestos de errores y el ahorro de trabajo gracias a la automatización. El objetivo es lograr un equilibrio entre la velocidad de publicación y la fiabilidad de los sistemas.