Anticipándonos al inicio del curso "CI / CD en AWS, Azure y Gitlab", hemos preparado una traducción de material útil para usted.
La Integración Continua (CI) y la Entrega Continua (CD) son una cultura, un conjunto de principios y prácticas que permiten a los desarrolladores implementar cambios de software de manera más frecuente y confiable.
CI / CD es una de las prácticas de DevOps . También se aplica a las prácticas ágiles : la automatización de la implementación permite a los desarrolladores concentrarse en cumplir con los requisitos comerciales, la calidad del código y la seguridad.
Definición de CI / CD
La integración continua es una metodología de desarrollo y un conjunto de prácticas en las que se realizan pequeños cambios en el código con confirmaciones frecuentes. Y dado que la mayoría de las aplicaciones modernas se desarrollan utilizando varias plataformas y herramientas, existe la necesidad de un mecanismo de integración y prueba de los cambios introducidos.
Técnicamente hablando, el objetivo de CI es proporcionar una forma coherente y automatizada de crear, empaquetar y probar aplicaciones. Con un proceso de integración continua optimizado, es más probable que los desarrolladores realicen compromisos frecuentes, lo que a su vez ayudará a mejorar la comunicación y la calidad del software.
La entrega continua comienza donde termina la integración continua. Automatiza la implementación de aplicaciones en diferentes entornos: la mayoría de los desarrolladores trabajan tanto con un entorno de producción como con entornos de desarrollo y prueba.
Las herramientas de CI / CD ayudan a configurar parámetros de entorno específicos que se configuran durante la implementación. Y también CI / CD-Automation realiza las solicitudes necesarias a servidores web, bases de datos y otros servicios que pueden necesitar ser reiniciados o realizar algunas acciones adicionales al implementar la aplicación.
La integración continua y la entrega continua necesitan pruebas continuasporque el objetivo final es desarrollar aplicaciones de calidad. Las pruebas continuas a menudo se implementan como un conjunto de varias pruebas automatizadas (regresión, rendimiento y otras) que se ejecutan en la canalización de CI / CD.
La práctica madura de CI / CD permite la implementación continua: cuando el código pasa con éxito a través de la canalización de CI / CD, los ensamblados se implementan automáticamente en el entorno de producción. Los equipos que practican la entrega continua pueden permitirse una implementación diaria o incluso por horas. Sin embargo, vale la pena señalar aquí que la entrega continua no es adecuada para todas las aplicaciones comerciales .
La integración continua mejora la comunicación y la calidad
La Integración Continua es una metodología de desarrollo basada en procesos regulados y automatización. Con la integración continua implementada, los desarrolladores a menudo envían su código al repositorio de código fuente. Y la mayoría de los equipos siguen la regla de comprometerse al menos una vez al día. Los cambios pequeños son más fáciles de detectar defectos y problemas diversos que los cambios grandes en los que se ha trabajado durante un largo período de tiempo. Además, trabajar con ciclos de confirmación cortos reduce las posibilidades de que varios desarrolladores cambien el mismo código, lo que puede generar conflictos de fusión.
Los equipos que implementan la integración continua a menudo comienzan configurando un sistema de control de versiones y definiendo un flujo de trabajo. A pesar de que las confirmaciones se realizan con frecuencia, la implementación de funciones y la corrección de errores puede llevar mucho tiempo. Hay varios enfoques para controlar qué funciones y código están listos.
Mucha gente usa marcas de funciones, un mecanismo para activar y desactivar la funcionalidad en tiempo de ejecución. La funcionalidad que aún está en desarrollo está envuelta en indicadores de características y se implementa desde la rama maestra hasta la producción, pero está deshabilitada hasta que esté completamente lista para su uso. Según un estudio recienteEl 63 por ciento de los equipos que utilizan la función de bandera informan que mejoraron la capacidad de prueba y la calidad del software. Existen herramientas especiales para trabajar con indicadores de funciones, como CloudBees Rollout , Optimizely Rollouts y LaunchDarkly , que se integran en CI / CD y permiten la configuración a nivel de función.
Otra forma de trabajar con funciones es utilizar ramas en el sistema de control de versiones. En este caso, debe definir un modelo de ramificación (por ejemplo, como Gitflow) y describir cómo el código ingresa a las ramas de desarrollo, prueba y producción. Para las funciones con un ciclo de desarrollo largo, se crean ramas de funciones independientes. Después de completar el trabajo en una función, los desarrolladores fusionan los cambios de la rama de funciones en la rama de desarrollo principal. Este enfoque funciona bien, pero puede resultar inconveniente si se desarrollan muchas funciones al mismo tiempo.
La fase de construcción consiste en automatizar el empaquetado del software, la base de datos y otros componentes necesarios. Por ejemplo, si está desarrollando una aplicación Java, el CI empaquetará todos los archivos estáticos como HTML, CSS y JavaScript junto con la aplicación Java y los scripts de la base de datos.
CI no solo empaquetará todos los componentes de software y bases de datos, sino que también realizará automáticamente pruebas unitarias y otros tipos de pruebas. Esta prueba permite a los desarrolladores obtener comentarios de que los cambios que realizaron no rompieron nada.
La mayoría de las herramientas de CI / CD le permiten iniciar una compilación manualmente, en un compromiso o en un horario. Los equipos deben discutir un cronograma de construcción que se adapte a ellos en función del tamaño del equipo, los compromisos diarios esperados y otros criterios. Es importante que las confirmaciones y las compilaciones sean rápidas; de lo contrario, las compilaciones largas pueden convertirse en un obstáculo para los desarrolladores que intentan comprometerse de forma rápida y frecuente.
Las pruebas continuas son más que la automatización de pruebas
Los marcos de prueba automatizados ayudan a los ingenieros de control de calidad a diseñar, ejecutar y automatizar varios tipos de pruebas que ayudan a los desarrolladores a realizar un seguimiento del éxito de la construcción. Las pruebas incluyen pruebas funcionales que se desarrollan al final de cada sprint y se combinan en pruebas de regresión para toda la aplicación. Las pruebas de regresión informan al equipo si sus cambios han roto algo en otra parte de la aplicación.
La mejor práctica es exigir a los desarrolladores que ejecuten todas o parte de las pruebas de regresión en su entorno local. Esto asegurará que los desarrolladores confirmen el código ya verificado.
Las pruebas de regresión son solo el comienzo. Pruebas de rendimiento, pruebas de API, análisis de código estático, pruebas de seguridad: estos y otros tipos de pruebas también se pueden automatizar. El punto clave es la capacidad de ejecutar estas pruebas desde la línea de comandos, a través de un webhook o mediante un servicio web y devolver el resultado de la ejecución: si la prueba fue exitosa o no.
Las pruebas continuas implican no solo la automatización, sino también la integración de las pruebas automatizadas en la canalización de CI / CD. Las pruebas unitarias y funcionales pueden ser parte del CI e identificar problemas antes o durante el lanzamiento del canal de CI. Las pruebas que requieren una implementación completa del entorno, como las pruebas de rendimiento y seguridad, a menudo forman parte del CD y se ejecutan después de que las compilaciones se hayan implementado en los entornos de destino.
La canalización de CD automatiza la entrega de cambios a diferentes entornos
La entrega continua es la implementación automática de una aplicación en su entorno de destino. Normalmente, los desarrolladores trabajan con uno o más entornos de desarrollo y prueba donde la aplicación se implementa para probar y revisar. Para ello, se utilizan herramientas de CI / CD como Jenkins , CircleCI, AWS CodeBuild, Azure DevOps, Atlassian Bamboo, Travis CI.
Una canalización de CD típica consta de pasos de creación, prueba e implementación. Las canalizaciones más complejas incluyen los siguientes pasos:
- Recuperar código del control de código fuente y ejecutar una compilación.
- Configuración de infraestructura automatizada a través de un enfoque de infraestructura como código.
- Copiar el código en el entorno de destino.
- Establecer variables de entorno para el entorno de destino.
- (-, API-, ).
- , , .
- .
- .
Por ejemplo, en el archivo Jenkinsfile determinado por el transportador Jenkins , que describe los distintos pasos, como ensamblaje (compilación), prueba (prueba) e implementación (implementación). También describe variables de entorno, claves secretas, certificados y otros parámetros que se pueden utilizar en las etapas de la canalización. La sección de publicación configura el manejo de errores y las notificaciones.
En una canalización de CD más compleja, puede haber pasos adicionales, como sincronización de datos, archivo de recursos de información, instalación de actualizaciones y parches. Las herramientas de CI / CD suelen admitir complementos. Por ejemplo, Jenkins tiene más de 1500 complementos para la integración con plataformas de terceros, para ampliar la interfaz de usuario, la administración, la gestión del código fuente y la construcción.
Cuando se usa una herramienta CI / CD, los desarrolladores deben asegurarse de que todos los parámetros estén configurados fuera de la aplicación mediante variables de entorno. Las herramientas de CI / CD le permiten establecer los valores de estas variables, enmascarar contraseñas y claves de cuenta y personalizarlas durante la implementación para un entorno específico.
También en las herramientas de CD hay cuadros de mando e informes. En caso de falla de construcción o entrega, lo notifican. Al integrar el CD con control de versiones y herramientas ágiles, es más fácil encontrar cambios de código e historias de usuario incluidas en la compilación.
Implementación de canalizaciones de CI / CD con Kubernetes y arquitecturas sin servidor
Muchos equipos que utilizan canalizaciones de CI / CD en las nubes utilizan contenedores como Docker y sistemas de orquestación como Kubernetes . Los contenedores ayudan a estandarizar el empaquetado y la entrega, y simplifican el escalado y la destrucción de entornos volátiles.
Hay muchas opciones para compartir contenedores, infraestructura como código y canalizaciones de CI / CD. Puede obtener más información sobre esto en los artículos Kubernetes con Jenkins y Kubernetes con Azure DevOps .
La informática sin servidor es otra forma de implementar y escalar aplicaciones. En un entorno sin servidor, la infraestructura está completamente administrada por el proveedor de la nube y la aplicación consume los recursos necesarios de acuerdo con su configuración. Por ejemplo, en AWS, las aplicaciones sin servidor se ejecutan a través de funciones de AWS Lambda , cuya implementación se puede integrar en la canalización de Jenkins CI / CD mediante un complemento.
CI / CD permite una implementación de código más frecuente
Entonces, resumamos. CI empaqueta, prueba compilaciones y notifica a los desarrolladores si algo sale mal. El CD implementa aplicaciones automáticamente y ejecuta pruebas adicionales.
Las canalizaciones de CI / CD están diseñadas para organizaciones que necesitan realizar cambios frecuentes en las aplicaciones con un proceso de entrega confiable. Además de estandarizar compilaciones, desarrollar pruebas y automatizar implementaciones, obtenemos un flujo de trabajo perfecto para implementar cambios de código. La implementación de CI / CD permite a los desarrolladores concentrarse en mejorar sus aplicaciones y no perder tiempo implementándolas.
CI / CD es una de las prácticas de DevOpsporque tiene como objetivo combatir las contradicciones entre desarrolladores que quieren hacer cambios frecuentes y una explotación, que requiere estabilidad. Con la automatización, los desarrolladores pueden realizar cambios con mayor frecuencia, y los equipos de operaciones, a su vez, ganan más estabilidad, ya que la configuración de los entornos está estandarizada y se realizan pruebas continuas durante el proceso de entrega. Además, la configuración de las variables de entorno es independiente de la aplicación y existen procedimientos de reversión automatizados.
El impacto de la implementación de canalizaciones de CI / CD se puede medir en términos de indicadores clave de rendimiento (KPI) de DevOps... Los KPI como la frecuencia de implementación, el tiempo de espera del cambio y el tiempo medio de recuperación a menudo mejoran con las implementaciones de CI / CD con pruebas continuas. Sin embargo, CI / CD es solo un proceso que puede contribuir a estas mejoras. Existen otras condiciones para aumentar la frecuencia de entrega.
Para comenzar con CI / CD, el equipo de desarrollo y operaciones debe colaborar en tecnologías, prácticas y prioridades. Los equipos deben llegar a un consenso sobre los enfoques correctos para su negocio y tecnología, de modo que después de la implementación de CI / CD, el equipo se adhiera constantemente a las prácticas elegidas.
Resumen de herramientas de CICD: Gitlab CI, Docker, Ansible