
[26/10/2022] Si sus objetivos son el desarrollo de software a gran velocidad y la entrega frecuente de compilaciones de trabajo a la producción, necesita automatizar al menos parte del proceso de prueba y entrega. Lo ideal es implementar canales de integración continua (CI/CD) para sus proyectos, junto con conjuntos de pruebas para detectar errores antes de que los clientes vean el software, y scripts que implementen los pasos de los canales.
La integración continua (CI, por sus siglas en inglés) es una metodología para automatizar la creación, el empaquetado y las pruebas del software de forma coherente. La integración continua ayuda a dar a un equipo cierta confianza en que los cambios que comprueban en el control de versiones del código fuente no romperán la compilación ni introducirán errores en el software. El punto final de la CI suele ser un check-in completado en la rama principal de un repositorio de software.
[Reciba lo último de CIO Perú suscribiéndose a nuestro newsletter semanal]
La entrega continua (CD, por sus siglas en inglés) automatiza la entrega de software probado a entornos de infraestructura. Eso no suele significar lanzarlo directamente a producción para ver si los clientes se quejan. Por lo general, las organizaciones empiezan por enviar la compilación a un entorno de desarrollo. Después de que los propios desarrolladores se pongan a trabajar en la nueva versión y la liberen, suele pasar a un entorno de pruebas, donde la utiliza un grupo más amplio de usuarios (a veces solo probadores internos dedicados, a veces un grupo más amplio de usuarios inscritos para pruebas beta o "dog-fooding") y se supervisa de cerca. Por último, si todo va bien, los probadores dan el visto bueno y pasan la nueva versión a un entorno de producción.
En cada etapa de la CD, hay opciones para volver rápidamente a una versión anterior, y generar informes de errores para que los desarrolladores los aborden en la nueva versión. El objetivo no es enviar muchas versiones a producción, sino mejorar y perfeccionar continuamente el software sin introducir regresiones. Otro término para estas prácticas es "devops".
¿Por qué alojar CI/CD en la nube?
Alojar una plataforma de CI/CD en su propio centro de datos es una opción viable, especialmente para las empresas que exigen alojar sus aplicaciones y datos dentro del firewall. La desventaja de hacer esto es que necesitará un equipo dedicado para mantener la infraestructura, e incurrirá en algunos gastos de capital para los servidores.
Si se le permite alojar en la nube, suele ser una mejor opción. El costo del alojamiento en la nube es modesto, y ese gasto operativo se compensa con los servicios prestados: incorporación, mantenimiento de la infraestructura, mantenimiento de la seguridad, soporte y mantenimiento del software de CI/CD. Alojar el software de CI/CD en la nube suele facilitar y agilizar la interacción de los pipelines con los repositorios de código fuente, si también están en la nube. Si sus desarrolladores y probadores están distribuidos geográficamente, alojar sus repositorios en la nube suele ofrecer a los desarrolladores una mejor experiencia que alojarlos en servidores remotos tras firewalls.
También es posible desplegar CI/CD en un híbrido de servidores locales y en la nube. Varias de las últimas ofertas de CI/CD se ejecutan en contenedores en clústeres de Kubernetes, que son igualmente felices funcionando en las instalaciones y en la nube. En un escenario de despliegue híbrido, puede colocar cada componente donde tenga más sentido dada la ubicación física de los propios desarrolladores, y las ubicaciones de red de los otros servidores en la infraestructura de desarrollo.
CI/CD debe integrarse con sus repositorios
Como puede haber deducido al leer "el punto final de CI es típicamente un check-in completado en la rama principal de un repositorio de software", los repositorios son esenciales para CI y CD. Más allá de ser el punto final del proceso de check-in y de prueba, los repositorios de software son el lugar preferido para almacenar sus scripts de CI y CD y los archivos de configuración. Sí, muchas de las plataformas de CI/CD pueden almacenar scripts y otros archivos internamente, pero normalmente es mejor tenerlos en el control de versiones fuera de la herramienta.
Casi todas las herramientas de CI/CD pueden interactuar con Git. Algunas también se integran directamente con GitHub, GitHub Enterprise, GitLab, y/o Bitbucket. Algunas también soportan Subversion y/o Mercurial.
Sus herramientas de CI/CD deben ser compatibles con Sus lenguajes y herramientas de programación
Cada lenguaje de programación o grupo de lenguajes (lenguajes JVM, lenguajes compilados con LLVM, lenguajes .NET, etc.) tiende a tener sus propias herramientas de construcción y herramientas de prueba. Para que le resulte útil, una herramienta de CI/CD debe ser compatible con todos los lenguajes que forman parte de un proyecto determinado. De lo contrario, es posible que tenga que escribir uno o más plug-ins para la herramienta.
Las imágenes Docker son cada vez más importantes para el despliegue de software distribuido, modular y de microservicios. Es de gran ayuda si su herramienta de CI/CD sabe cómo tratar con imágenes Docker, incluyendo la creación de una imagen a partir de su código fuente, binarios y prerrequisitos, y el despliegue de una imagen en un entorno específico. De nuevo, a falta de esto, es posible que tenga que escribir plug-ins o scripts para implementar la funcionalidad de Docker que necesita. Del mismo modo, querrá que su herramienta de CI/CD sea compatible con Kubernetes y cualquier otro sistema de orquestación de contenedores que utilice en sus entornos.
¿Sus desarrolladores entienden el CI/CD y las herramientas que está considerando?
Los principios de CI y CD pueden parecer obvios, pero los detalles no lo son. Las distintas herramientas de CI/CD tienen distintos niveles de soporte y documentación. Hay varios libros sobre Jenkins, lo que no es sorprendente, ya que es la más antigua del grupo. Para otros productos, es posible que tenga que investigar la documentación y los foros de apoyo, así como las opciones de apoyo de pago como parte de su debida diligencia en la elección de una herramienta.
Para obtener información general sobre CI, considere el libro de Addison-Wesley, Continuous Integration de Duvall et al. De manera similar, para obtener información general sobre CD, considere Continuous Delivery de Humble y Farley. Ambos libros ganaron los premios Jolt cuando se publicaron.
Puede elegir diferentes herramientas de CI/CD para diferentes proyectos
Aunque esta guía trata sobre la elección de una plataforma de CI/CD, no asuma que una plataforma será óptima para todos sus proyectos de desarrollo de software. La mayoría de los departamentos de TI utilizan varios lenguajes y entornos de programación, y no todas las plataformas de CI/CD son compatibles con todos ellos.
Siéntase libre de elegir las plataformas de CI/CD que mejor funcionen para cada uno de sus proyectos, en lugar de encontrar una única plataforma de compromiso. Los principios generales de CI y CD se trasladan de una plataforma a otra, aunque las secuencias de comandos que escriba para ellas no siempre sean portátiles. Aunque el tiempo adicional de incorporación a cada nueva plataforma puede costar a su equipo de desarrollo algo de tiempo, lo más probable es que sea menos costoso que tener que personalizar ampliamente una herramienta de CI/CD.
Planifique la futura migración de CI/CD
En la misma línea, no asuma que una determinada plataforma de CI/CD servirá para las necesidades de sus proyectos para siempre. Siempre cubra sus apuestas, por ejemplo, almacenando scripts en repositorios en lugar de dentro de la herramienta de CI/CD.
Prefiera el CI/CD sin servidor cuando sea apropiado
En general, los despliegues de contenedores en la nube son menos costosos que los despliegues de instancias de servidor en la nube, y los despliegues de nube sin servidor son menos costosos que los despliegues de contenedores. Lamentablemente, pocas plataformas de CI/CD pueden ejecutar sin servidor en el momento de escribir este artículo.
Sin servidor significa que el contenedor que ejecuta el proceso de interés se instala según sea necesario, generalmente en respuesta a un evento. Para CI/CD, el evento desencadenante es generalmente un check-in de código en una rama específica del repositorio; el Webhook del repositorio entonces lanza el proceso sin servidor. Cuando el proceso se completa, los recursos se liberan.
Una de las pocas plataformas de CI/CD que pueden ejecutar sin servidor es Serverless CI/CD, parte de Serverless Framework Pro, una versión mejorada del Serverless Framework de código abierto. Serverless CI/CD está optimizado para el despliegue de aplicaciones sin servidor, y actualmente solo se ejecuta en AWS. Tendrá que determinar si soporta su aplicación lo suficientemente bien como para usarla.
¿Dónde están sus activos actuales en la nube?
Para optimizar una configuración de CI/CD basada en la nube (o cualquier aplicación en la nube), ayuda que todos sus activos estén "cerca" unos de otros. "Cerca" en este contexto se refiere en parte a la ubicación geográfica, y en parte a la ubicación de la red.
Por ejemplo, si su base de datos está en Australia y su aplicación está en Norteamérica, va a tener un gran retraso cada vez que la aplicación necesite leer o escribir datos. A menor escala, si su aplicación y su base de datos están en la misma zona de disponibilidad (AZ), la latencia entre ellas se minimizará. Si están en zonas diferentes de la misma región, la latencia será mayor, pero no tan alta como si estuvieran en regiones diferentes.
Del mismo modo, si su base de datos está en Google Cloud Platform en Virginia y su aplicación está en Microsoft Azure en Virginia, la latencia será mayor que si ambas estuvieran en el mismo proveedor de nube en la misma AZ. Todo esto también se aplica a su repositorio (que es esencialmente una base de datos), su software de CI/CD, su aplicación real, y sus desarrolladores y probadores. Ayuda si todos están "cerca", aunque los efectos del retraso no son tan evidentes en esta situación como lo serían para, por ejemplo, un juego interactivo en tiempo real.
Si los desarrolladores pueden enviar commits de código al repositorio maestro de forma fiable y sin tiempos de espera notables, normalmente estarán contentos. Del mismo modo, si los usuarios y probadores están lo suficientemente "cerca" de la aplicación como para obtener tiempos de respuesta inferiores a un segundo, también estarán contentos. Para el software CI/CD, la clave es la fiabilidad de las conexiones a los puntos de despliegue. Un poco de retraso puede ser tolerable siempre que no cause tiempos de espera o paquetes perdidos.
Productos de CI/CD en la nube
Hay un número sorprendente de servicios basados en la nube que soportan devops. Aquí he enumerado 14 proveedores de productos de CI/CD en la nube como ejemplos. Tenga en cuenta que la inclusión en esta lista no es una recomendación, y la exclusión no es una condena.
AWS CodePipeline: AWS CodePipeline es un servicio de entrega continua totalmente gestionado que le ayuda a automatizar sus canalizaciones de lanzamiento para obtener actualizaciones de aplicaciones e infraestructuras rápidas y fiables. CodePipeline automatiza las fases de creación, prueba e implementación de su proceso de lanzamiento cada vez que hay un cambio en el código, según el modelo de lanzamiento que defina. Esto le permite entregar características y actualizaciones de forma rápida y fiable. Puede integrar fácilmente AWS CodePipeline con servicios de terceros como GitHub o con su propio complemento personalizado.
Azure DevOps: Azure DevOps proporciona servicios para desarrolladores que ayudan a los equipos a planificar el trabajo, colaborar en el desarrollo del código y crear e implementar aplicaciones. Puede trabajar en la nube utilizando Azure DevOps Services, o en las instalaciones utilizando Azure DevOps Server. Azure DevOps proporciona funciones integradas a las que puede acceder a través de su navegador web o cliente IDE. Azure Pipelines proporciona servicios de construcción y lanzamiento que soportan la integración y entrega continuas. Otros servicios independientes son Azure Repos (control de fuentes de Git y Team Foundation), Agile Boards (un conjunto de herramientas ágiles), Azure Test Plans (herramientas para pruebas manuales/exploratorias y pruebas continuas) y Azure Artifacts (permite a los equipos compartir paquetes de registros públicos y privados).
Bitbucket Cloud: Bitbucket Cloud de Atlassian combina el alojamiento de código Git y el control de fuentes y una solución CI/CD integrada en Bitbucket Pipelines. También ofrece integraciones con las herramientas Jira (seguimiento de características y problemas) y Trello (gestión de proyectos estilo Kanban) de Atlassian, dando a los equipos de desarrollo un lugar central para planificar proyectos, colaborar en el código, probar y desplegar.
Bitrise: Bitrise es una plataforma de devops y CI/CD orientada a los desarrolladores de aplicaciones móviles. Es compatible con una amplia gama de tecnologías móviles, incluyendo Swift, Objective-C, Java, Kotlin, Cordova, Ionic, React Native y Flutter. Puede integrar Bitrise con GitHub, GitHub, GitLab, Bitbucket y otros servicios de control de origen Git, tanto en la nube como en las instalaciones. Bitrise se anuncia como un "CI/CD móvil con todas las funciones en la nube, para cualquier plataforma, sin necesidad de hardware". Esto significa que, además de las compilaciones que se ejecutan en máquinas Linux, las compilaciones de macOS también están totalmente incluidas en todos los planes, incluidos los de los usuarios gratuitos y los proyectos de código abierto.
CircleCI: CircleCI puede automatizar las compilaciones en múltiples entornos, tanto en la nube como en las instalaciones, se integra con GitLab, GitHub y Bitbucket, y despliega en objetivos que van desde AWS, Azure y Google Cloud hasta Artifactory y npm. Puede elegir entre miles de integraciones existentes o crear las suyas propias, optimizar la velocidad de las compilaciones y ejecutar trabajos en paralelo, y garantizar que sus proyectos se construyan, desplieguen y mantengan de forma segura. Los entornos de construcción incluyen Docker, Linux (incluyendo emuladores de Android), macOS, Windows, GPUs y Arm.
CloudBees: CloudBees es una solución de automatización de la entrega de software para organizaciones grandes y que dan prioridad al cumplimiento, que proporciona a los equipos de desarrollo de software capacidades de CI/CD basadas en Jenkins, orquestación de lanzamientos, gestión de características y gestión del flujo de valor, a la vez que proporciona a la dirección capacidades de mitigación de riesgos, cumplimiento y gobernanza. La plataforma CloudBees proporciona herramientas que permiten a las organizaciones crear flujos de trabajo de autoservicio, rápidos y seguros, y conectar la entrega de software con los resultados empresariales.
Codefresh: Codefresh es una plataforma de entrega de software para Kubernetes impulsada por Argo, que utiliza un modelo GitOps donde la infraestructura como código se versiona en un repositorio. Codefresh utiliza Argo CD, Argo Workflows, Argo Events y Argo Rollouts, ampliados con funcionalidad y características esenciales para los despliegues empresariales. Codefresh ofrece seguridad, capacidad de mantenimiento, trazabilidad y un único plano de control para todas las partes interesadas, ya sean desarrolladores, operadores, propietarios de productos o gestores de proyectos. Codefresh es compatible con GitHub, GitLab y Bitbucket.
GitHub Actions: GitHub Actions es una plataforma de integración continua y entrega continua alojada en GitHub, que le permite automatizar su canal de construcción, prueba y despliegue. Puede crear flujos de trabajo que construyan y prueben cada pull request en su repositorio, o que desplieguen pull requests fusionados a producción. GitHub Actions también le permiten ejecutar flujos de trabajo cuando se producen otros eventos en su repositorio. (Por ejemplo, puede ejecutar un flujo de trabajo para añadir automáticamente las etiquetas adecuadas cada vez que alguien cree una nueva incidencia en su repositorio). GitHub proporciona máquinas virtuales de Linux, Windows y macOS para ejecutar los flujos de trabajo, o puede ejecutarlos en sus propias máquinas virtuales, en la nube o en la empresa, utilizando ejecutores autoalojados. GitHub Actions es compatible con Node.js, Python, Java, Ruby, PHP, Go, Rust, .NET y Swift.
GitLab CI/CD: GitLab CI/CD es la parte de GitLab que puede utilizar para todos los métodos continuos (integración continua, entrega continua y despliegue continuo). Con GitLab CI/CD, puede construir, probar, desplegar y monitorizar sus aplicaciones, sin necesidad de aplicaciones o integraciones de terceros. GitLab detecta automáticamente su lenguaje de programación y utiliza plantillas de CI/CD para crear y ejecutar pipelines por defecto para construir y probar su aplicación. A continuación, puede configurar los despliegues para desplegar sus aplicaciones en staging y producción, y configurar Review Apps para previsualizar sus cambios por rama. De este modo, GitLab CI/CD le ayuda a detectar fallas y errores en una fase temprana del ciclo de desarrollo, y a garantizar que todo el código desplegado en producción cumple con los estándares de código que ha establecido para su aplicación.
Google Cloud Build: Google Cloud Build es una plataforma de CI/CD alojada en la nube y totalmente gestionada que le permite ejecutar compilaciones en Google Cloud, en otras nubes públicas y en sistemas locales, o estrictamente en su propia red privada. Puede crear pipelines como parte de sus pasos de construcción para automatizar las implementaciones, y desplegar usando integraciones incorporadas a Google Kubernetes Engine, Google App Engine, Google Cloud Functions y Google Firebase. Puede configurar disparadores para construir, probar o desplegar automáticamente el código fuente cuando empuje los cambios a GitHub, Google Cloud Source Repositories o un repositorio de Bitbucket. Cloud Build puede utilizarse con Spinnaker para crear y ejecutar canalizaciones complejas.
IBM Cloud Continuous Delivery: IBM Cloud Continuous Delivery proporciona cadenas de herramientas, canalizaciones e integraciones de herramientas para la entrega de software. Puede crear cadenas de herramientas que incluyan servicios de IBM, herramientas de código abierto o herramientas de terceros que hagan que el desarrollo y las operaciones sean repetibles y más fáciles de gestionar. Puede crear, probar y desplegar de forma repetible con una mínima intervención humana aprovechando las canalizaciones de entrega basadas en Tekton. Puede gestionar su código fuente y realizar un seguimiento del trabajo con repositorios Git y seguimiento de incidencias alojados por IBM y creados en GitLab Community Edition. Y puede aprovisionar rápidamente cadenas de herramientas para DevSecOps, despliegues en Kubernetes, Cloud Foundry, VMs y más con plantillas compartibles y personalizables que incluyen herramientas de IBM, de código abierto y de terceros.
Spinnaker: Spinnaker es una plataforma de entrega continua multi-nube de código abierto diseñada para ayudarle a liberar cambios de software con alta velocidad y confianza. Spinnaker combina funciones de gestión de aplicaciones que le permiten ver y gestionar sus recursos en la nube con funciones de despliegue de aplicaciones, que le permiten construir y gestionar flujos de trabajo de entrega continua. Spinnaker, una plataforma de entrega continua madura y ampliamente producida, puede aplicar la experiencia de Netflix, Google, Microsoft y Amazon a su ciclo de vida de desarrollo de software.
TeamCity: TeamCity es una solución CI/CD de propósito general de JetBrains que permite la flexibilidad para todo tipo de flujos de trabajo y prácticas de desarrollo. TeamCity le permite escribir la configuración de CI/CD utilizando Kotlin, dándole el poder de un lenguaje de programación con todas las funciones y su conjunto de herramientas. TeamCity se integra con todos los sistemas de control de versiones, no sólo con Git. Soporta nativamente Java, .NET, Python, Ruby, Xcode, además de otros lenguajes a través de plugins. TeamCity también se integra con Docker, YouTrack, Jira, Bugzilla, Maven, Visual Studio Team Services y NuGet.
Travis CI: Travis CI es una herramienta de integración y despliegue continuo que proporciona una automatización flexible para sus construcciones, pruebas y despliegues. Además de construir y probar automáticamente los cambios de código, Travis CI puede automatizar otras partes de su proceso de desarrollo mediante la gestión de los despliegues y las notificaciones. Esto significa que puede hacer que los trabajos dependan unos de otros mediante el uso de etapas de compilación, configurar notificaciones, preparar despliegues después de las compilaciones y realizar muchas otras tareas. Travis CI fue el primer servicio de CI que proporcionó servicios a proyectos de código abierto de forma gratuita, y continúa haciéndolo. Travis CI es compatible con Assembla, Bitbucket, GitHub y GitLab, y con más de 30 lenguajes de programación.
Haga una prueba de concepto antes de comprometerse
CI/CD será una parte crítica de su infraestructura una vez que la tenga completamente implementada. Téngalo en cuenta mientras se pone al día.
Es importante realizar una prueba de concepto rigurosa antes de empezar a desplegar los pipelines de CI/CD. Agite la parte de CI antes de comenzar la fase de CD. Asegúrese de ejercitar sus conjuntos de pruebas y capacidades de reversión, antes de conectar cualquier pipeline de CI/CD a las instancias de producción, y mantenga a los humanos en el bucle hasta que esté muy seguro de que la automatización es sólida como una roca.
Basado en el artículo de Martin Heller (InfoWorld) y editado por CIO Perú
Crédito foto: tine ivanic / Unsplash
Puede ver también: