Lapachos Lending : Proceso de Integración y Despliegue Continuo (CI/CD)

La arquitectura y el flujo del pipeline de CI/CD automatizado se implementa a través de una plantilla de AWS CloudFormation. El objetivo principal de este pipeline es automatizar el proceso de merge de código, despliegue en un entorno de pruebas (TEST), ejecución de pruebas E2E automatizadas (Cypress), y finalmente, el despliegue en el entorno final (DEV, QA o DEMO).

Template de Cloudformation

El proceso completo se orquesta a través de una combinación de servicios de AWS, incluyendo AWS CodePipeline, AWS Step Functions, y AWS CodeBuild.

Componentes Principales de la Arquitectura

  • AWS CodePipeline: Es el servicio principal que automatiza el flujo de trabajo. Actúa como el punto de entrada, detectando cambios en el código fuente y activando la secuencia de acciones.

  • AWS Step Functions: Es el orquestador central del proceso. Una vez que CodePipeline lo invoca, una Máquina de Estados define y ejecuta una serie de pasos lógicos (merge, desplegar, probar, notificar) de manera secuencial y condicional.

  • AWS CodeBuild: Proporciona los entornos de compilación y ejecución para las tareas específicas, como el merge de ramas de Git, la ejecución de pruebas de Cypress y los despliegues.

  • AWS Secrets Manager: Almacena de forma segura el token de acceso a GitHub, evitando que quede expuesto en el código o en la configuración.

  • AWS S3: Se utiliza un bucket con dos propósitos:

    • Como almacén de artefactos para CodePipeline.

    • Para guardar los resultados de las pruebas de Cypress (screenshots de errores, reportes, etc.).

  • AWS IAM: Gestiona todos los roles y permisos necesarios para que los servicios de AWS puedan interactuar entre sí de forma segura, siguiendo el principio de privilegio mínimo.

  • AWS Lambda: Se utiliza para enviar notificaciones en tiempo real al canal de Slack del equipo, informando sobre el estado del pipeline (inicio, éxito o fallo).

Flujo del Proceso de CI/CD

El flujo se inicia automáticamente y sigue una secuencia de pasos bien definida, orquestada por la Máquina de Estados.

Paso 1: Activación (Trigger)

  1. Un desarrollador realiza un git push o merge con nuevos cambios a la rama dev, qa o demo del repositorio de GitHub LapachosLending/lending-frontend o LapachosLending/lending-backend.

Paso 2: Detección y Arranque del Pipeline

  1. CodePipeline detecta el push o merge en la rama dev, qa o demo a través de la conexión configurada con AWS CodeStar Connections.

  2. CodePipeline empaqueta el código fuente y lo almacena como un artefacto de salida en el bucket de S3.

  3. Inmediatamente después, CodePipeline invoca directamente a la Máquina de Estados (Step Function), pasándole un payload que indica que fue iniciado por el pipeline.

Paso 3: Orquestación de la Máquina de Estados

La Máquina de Estados toma el control y comienza a ejecutar su flujo lógico:

  1. Notificación de Inicio: El primer estado invoca la función Lambda de Slack (lending-backend-dev-sendSlack) para enviar un mensaje al canal del equipo, notificando que el pipeline de CI/CD ha comenzado.

  2. Merge de Ramas:

    • Se ejecuta el proyecto de CodeBuild lending-codebuild-cypress-merge-test.

    • Este proyecto realiza las siguientes acciones:

      1. Clona el repositorio lending-frontend.

      2. Hace checkout a la rama test.

      3. Merge de los cambios de la rama dev en test.

      4. Sube los cambios (push) a la rama test del repositorio.

      5. Repite el mismo proceso para el repositorio lending-backend.

    • Si este paso falla (por ejemplo, por un conflicto de merge), el flujo se desvía directamente al paso de Notificación de Fallo.

  3. Despliegue en Entorno de Pruebas (TEST):

    • Tras un merge exitoso, se ejecuta el proyecto de CodeBuild lending-codebuild-test.

    • Este proyecto se encarga de desplegar la versión de la rama test (que ahora incluye los cambios de dev) en el entorno de pruebas.

  4. Ejecución de Pruebas End-to-End:

    • Una vez desplegado el entorno de TEST, se ejecuta el proyecto de CodeBuild lending-codebuild-cypress-test.

    • Este proyecto clona la rama test de lending-frontend, instala todas las dependencias (npm install), y ejecuta el conjunto de pruebas de Cypress (npx cypress run).

    • Los artefactos generados (screenshots de errores, reportes) se guardan en el bucket de S3.

    • Si las pruebas fallan, el flujo se desvía al paso de Notificación de Fallo.

    • Al finalizar, sube el reporte HTML al bucket de S3 público.

  5. Decisión Condicional:

    • La Máquina de Estados evalúa el estado de finalización del paso anterior.

    • Si las pruebas fueron exitosas (SUCCEEDED): El flujo continúa hacia el despliegue final.

    • Si las pruebas fallaron (FAILED): El flujo se desvía inmediatamente al paso de Notificación de Fallo.

  6. Despliegue Final:

    • Si las pruebas pasaron, se ejecuta el proyecto de CodeBuild lending-codebuild-dev.

    • Este proyecto se encarga de realizar el despliegue final en la rama DEV, QA o DEMO.

    • Si este despliegue falla, el flujo se desvía al paso de Notificación de Fallo.

  7. Notificación Final:

    • En caso de Éxito: Si todos los pasos anteriores se completaron sin errores, se invoca por última vez la Lambda de Slack para enviar un mensaje de "ÉXITO".

    • En caso de Fallo: Si cualquiera de los pasos críticos falló, se invoca la Lambda de Slack para enviar un mensaje de "ERROR", alertando al equipo para que revise los logs.

Cómo Consultar Resultados de Pruebas

Con la ejecución de este pipeline se genera un reporte de pruebas HTML interactivo que se publica automáticamente en una URL pública.

Acceder al Reporte:

Después de que el pipeline se ejecute, el reporte estará disponible en una URL estática, para encontrar esta URL hay que ir a la consola de AWS > CloudFormation, selecciona el stack de este pipeline y haz clic en la pestaña Outputs (Salidas), buscar la salida llamada ReportWebsiteURL y haz clic en el enlace.

Contenido del Reporte:

El reporte HTML (generado por cypress-mochawesome-reporter) ofrece una vista detallada de la ejecución de las pruebas, se podrá ver un resumen con gráficos, el estado de cada prueba (éxito o fallo), el tiempo de ejecución, y lo más importante, las capturas de pantalla y videos incrustados directamente en los tests que fallaron.

Integración con Slack:

La plantilla de CloudFormation está preparada para que las notificaciones de Slack (tanto de éxito como de fallo en la etapa de Cypress) incluyan el enlace al reporte directamente, permitiendo al equipo acceder a los resultados con un solo clic desde la notificación.

Prerrequisitos y Configuración Manual

Para que esta plantilla de CloudFormation se despliegue y funcione correctamente, se deben configurar los siguientes elementos de forma manual:

  1. Token de GitHub: Se debe generar un Personal Access Token en GitHub con los permisos necesarios para clonar y hacer push a los repositorios. El valor de este token se debe proporcionar en el parámetro GitHubTokenValue al crear el stack.

  2. Conexión de CodeStar: Se debe crear una conexión entre AWS y GitHub en la consola de AWS, dentro de Codebuild > Settings > Connections. El ARN de esta conexión se debe proporcionar en el parámetro CodeStarConnectionArn.

  3. Seleccionar elDeployEnvironment”: Sera el entorno donde se hará el despliegue (dev, qa o demo)

Diagrama del Proceso

Template - Pipeline.png

Attachments: