tutoriales.com

Asegurando Despliegues: Implementando Aprobaciones Manuales en Pipelines GitLab CI/CD

Este tutorial te guiará a través de la implementación de etapas de aprobación manual en tus pipelines de GitLab CI/CD. Descubre cómo configurar trabajos manuales y proteger entornos para asegurar que los despliegues críticos solo ocurran después de una revisión y aprobación explícita, mejorando la seguridad y la fiabilidad de tus entregas de software.

Intermedio15 min de lectura8 views
Reportar error

La Integración Continua y el Despliegue Continuo (CI/CD) son pilares fundamentales en el desarrollo de software moderno, permitiendo entregas rápidas y consistentes. Sin embargo, no todos los despliegues son iguales. Los entornos de producción, por ejemplo, requieren un nivel de precaución adicional para evitar interrupciones o fallos costosos. Aquí es donde entran en juego las aprobaciones manuales en los pipelines CI/CD.

Este tutorial te mostrará cómo implementar aprobaciones manuales en tus pipelines de GitLab CI/CD. Aprenderás a configurar trabajos que requieren intervención humana, protegiendo tus entornos más sensibles y añadiendo una capa vital de control a tu proceso de entrega.


🚀 ¿Por Qué Aprobaciones Manuales en CI/CD?

Aunque el objetivo de CI/CD es la automatización, hay escenarios donde una pausa intencionada y una revisión humana son indispensables. Considera los siguientes puntos:

  • Prevención de Errores Críticos: Evitar despliegues automáticos de código defectuoso o inestable a producción.
  • Cumplimiento Normativo: Muchas industrias requieren auditorías y aprobaciones explícitas antes de cualquier cambio en entornos regulados.
  • Coordinación de Lanzamientos: Sincronizar despliegues con eventos de marketing, lanzamientos de productos o mantenimientos programados.
  • Control de Riesgos: Un humano puede evaluar el impacto total de un cambio antes de que afecte a usuarios finales.
  • Revisión Final de Calidad: Asegurar que todas las pruebas, revisiones de seguridad y verificaciones de rendimiento se han completado satisfactoriamente.
💡 Consejo: Las aprobaciones manuales no son un signo de debilidad en la automatización, sino una herramienta estratégica para gestionar el riesgo en etapas críticas.

Escenarios Típicos para Aprobaciones Manuales

EscenarioDescripciónBeneficio
---------
Despliegue a ProducciónCambios que afectan directamente a los usuarios finales.Evita interrupciones de servicio y errores costosos.
Lanzamientos MayoresDespliegues con cambios significativos o nuevas características.Permite la coordinación con stakeholders y marketing.
---------
Hotfixes CríticosParches urgentes que necesitan una revisión rápida pero confirmada.Asegura que el hotfix no introduzca nuevos problemas.
Entornos ReguladosSistemas bajo normativas estrictas (financiero, salud, etc.).Garantiza el cumplimiento de políticas de seguridad y auditoría.

🛠️ Requisitos Previos

Antes de sumergirnos en la configuración, asegúrate de tener lo siguiente:

  • Una cuenta de GitLab activa.
  • Un proyecto de GitLab con un repositorio Git.
  • Conocimientos básicos de CI/CD en GitLab y el archivo .gitlab-ci.yml.
  • Permisos suficientes para modificar el archivo .gitlab-ci.yml y gestionar entornos/proyectos en GitLab.
📌 Nota: Este tutorial asume que ya tienes un pipeline de CI/CD funcional y deseas añadir una etapa de aprobación.

📖 Paso 1: Configurando un Trabajo Manual en .gitlab-ci.yml

La forma más sencilla de implementar una aprobación manual es definir un trabajo como manual en tu archivo .gitlab-ci.yml. Esto hará que el trabajo espere a ser ejecutado manualmente por un usuario.

Comencemos con un ejemplo básico de un pipeline que incluye una etapa de deploy que requiere aprobación.

stages:
  - build
  - test
  - deploy

build_job:
  stage: build
  script:
    - echo "Compilando la aplicación..."
    - mkdir build_output
    - echo "Aplicación compilada" > build_output/app.txt
  artifacts:
    paths:
      - build_output/

test_job:
  stage: test
  script:
    - echo "Ejecutando pruebas unitarias y de integración..."
    - echo "Pruebas pasadas"

deploy_to_staging:
  stage: deploy
  script:
    - echo "Desplegando a Staging..."
    - cat build_output/app.txt
  environment:
    name: staging
    url: https://staging.example.com

deploy_to_production:
  stage: deploy
  script:
    - echo "Desplegando a Producción..."
    - cat build_output/app.txt
    - echo "¡Despliegue a Producción exitoso!"
  when: manual
  environment:
    name: production
    url: https://production.example.com

Explicación del Código:

  • stages: Define las etapas del pipeline: build, test, deploy.
  • build_job: Un trabajo estándar para compilar el código y guardar artefactos.
  • test_job: Un trabajo estándar para ejecutar pruebas.
  • deploy_to_staging: Despliega automáticamente a un entorno de staging. Esto ocurre sin intervención manual si las etapas anteriores son exitosas.
  • deploy_to_production: Este es el trabajo clave. La línea when: manual indica que este trabajo no se ejecutará automáticamente. Permanecerá pendiente hasta que un usuario haga clic en el botón "Play" ▶️ en la interfaz de GitLab.
  • environment: Define los entornos de despliegue (staging y production) que GitLab puede rastrear.
⚠️ Advertencia: Un trabajo `manual` puede ser ejecutado por cualquier usuario con permisos de desarrollador o superiores en el proyecto, a menos que se configure una protección de entorno.

🔐 Paso 2: Protegiendo Entornos con Aprobadores Específicos

Simplemente marcar un trabajo como manual es un buen comienzo, pero para entornos críticos como production, es crucial restringir quién puede iniciar esos trabajos manuales. Aquí es donde entra la protección de entornos de GitLab.

2.1. Creando el Entorno en GitLab

Aunque ya lo hemos especificado en el .gitlab-ci.yml, GitLab gestiona los entornos de forma más robusta a través de su interfaz. Ve a Operaciones > Entornos en tu proyecto de GitLab.

Después de que un pipeline se haya ejecutado (incluso si el trabajo production está pendiente), verás el entorno production listado.

2.2. Configurando la Protección del Entorno

  1. Navega a Configuración > CI/CD en tu proyecto de GitLab.
  2. Expande la sección "Entornos protegidos".
  3. Haz clic en el botón "Añadir entorno protegido".
  4. En el formulario:
    • Entorno: Selecciona production (o el nombre de tu entorno crítico).
    • Permitir desplegar: Aquí es donde defines quién puede iniciar trabajos manuales para este entorno.
      • Puedes seleccionar "Roles" (por ejemplo, Mantenedores) para permitir a todos los usuarios con ese rol.
      • Puedes seleccionar "Usuarios" para elegir usuarios específicos por nombre.
      • Puedes seleccionar "Grupos" para elegir un grupo completo de usuarios.
🔥 Importante: Al proteger un entorno, solo los usuarios o roles especificados podrán iniciar trabajos manuales asociados a ese entorno. Esto añade una capa de seguridad crucial.
Inicio Configuración > CI/CD Entornos protegidos Añadir entorno protegido Formulario de Configuración Entorno: production Permitir desplegar: [Mantenedores | Usuarios | Grupos] Entorno protegido configurado

Ejemplo Práctico de Configuración

Digamos que solo los Mantenedores del proyecto y un usuario específico llamado devops-admin pueden desplegar a producción.

  • Entorno: production
  • Permitir desplegar: Mantenedores
  • Permitir desplegar: Usuario: devops-admin

Con esta configuración, incluso si un Desarrollador inicia el pipeline, no podrá ejecutar el trabajo deploy_to_production a menos que también sea Mantenedor o devops-admin.


⚙️ Paso 3: Ejecutando y Monitoreando Aprobaciones Manuales

Una vez configurado el trabajo manual y la protección del entorno, el flujo del pipeline será el siguiente:

  1. Un desarrollador hace push de código.
  2. El pipeline de GitLab se inicia automáticamente.
  3. Los trabajos build_job y test_job se ejecutan.
  4. deploy_to_staging se ejecuta automáticamente (si las anteriores fueron exitosas).
  5. El trabajo deploy_to_production aparecerá en la interfaz de GitLab como pendiente (un ícono de pausa o manual).

3.1. Iniciando el Despliegue Manual

Para iniciar el despliegue a producción:

  1. Navega a la vista de Pipelines de tu proyecto en GitLab.
  2. Haz clic en el pipeline que está pendiente.
  3. Localiza el trabajo deploy_to_production.
  4. Haz clic en el botón "Play" (▶️) junto al trabajo.
  5. Si tienes los permisos necesarios (definidos en la protección del entorno), el trabajo se iniciará.
Build compile_app Test unit_tests Deploy deploy_to_staging deploy_to_prod

3.2. Monitoreando el Despliegue

Una vez iniciado, puedes monitorear el progreso del trabajo como cualquier otro trabajo de CI/CD, viendo sus logs y estado en tiempo real.

📌 Nota: Si intentas iniciar un trabajo manual sin los permisos adecuados, GitLab te mostrará un mensaje de error indicando que no tienes permiso para desplegar a ese entorno protegido.

✨ Ejemplos Avanzados y Buenas Prácticas

Las aprobaciones manuales pueden ser más sofisticadas. Aquí hay algunas ideas avanzadas y buenas prácticas.

4.1. Múltiples Aprobadores o Roles Diferentes

Si necesitas que varios usuarios o roles aprueben un despliegue, la configuración when: manual en sí misma no lo soporta directamente como un "quorum". Sin embargo, puedes simularlo con etapas adicionales o herramientas externas:

  • Múltiples Trabajos Manuales en Serie: Define un trabajo manual approve_release_lead y luego otro trabajo manual approve_qa_lead, ambos en etapas sucesivas. Solo cuando ambos se aprueben, se podrá ejecutar el despliegue final.
stages:
- build
- test
- pre_deploy_approval
- deploy

# ... (trabajos build y test)

release_lead_approval:
stage: pre_deploy_approval
when: manual
allow_failure: false # Asegura que el pipeline falle si no se aprueba
script:
- echo "Esperando aprobación del Líder de Lanzamiento..."
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: manual
# Restringir quién puede ejecutar este trabajo a través de protección de entorno
# para el entorno 'pre_production_approval'

deploy_to_production:
stage: deploy
script:
- echo "Desplegando a Producción..."
environment:
name: production
url: https://production.example.com
needs: ["release_lead_approval"] # Depende de la aprobación previa
# Este trabajo también debe ser manual si quieres una segunda aprobación, 
# o automático si la aprobación previa es suficiente
<div class="callout note">📌 <strong>Nota:</strong> Para `release_lead_approval`, tendrías que crear un entorno protegido llamado `pre_production_approval` (o similar) y asignar los roles/usuarios que pueden aprobarlo.</div>

4.2. Uso de Variables de Entorno y rules

Puedes usar rules en GitLab CI/CD para hacer que un trabajo sea manual o automático bajo ciertas condiciones.

deploy_to_production:
  stage: deploy
  script:
    - echo "Desplegando a Producción..."
  environment:
    name: production
    url: https://production.example.com
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "push"
      when: manual # Solo si es un push a la rama principal, requiere manual
    - if: $CI_COMMIT_BRANCH == "feature/hotfix"
      when: always # Los hotfixes pueden ir automáticos (¡usar con precaución!)
    - when: never # Por defecto, no desplegar

En este ejemplo, el despliegue a producción requiere aprobación manual solo cuando se hace un push a la rama principal. Para ramas de feature/hotfix, el despliegue es automático (esto es solo un ejemplo, en la vida real querrías que los hotfixes también fueran manuales o al menos pasaran por un entorno de QA).

4.3. Consideraciones de Auditoría

GitLab registra quién inicia cada trabajo manual. Esto es invaluable para propósitos de auditoría y para responder a preguntas como "¿quién desplegó esto a producción y cuándo?". Puedes ver esta información en los logs del trabajo y en la vista de pipelines.

💡 Consejo: Complementa las aprobaciones manuales con una buena política de _branch protection_ (protección de ramas) en GitLab para asegurar que el código que entra en las ramas críticas ya ha sido revisado.

📈 Beneficios de las Aprobaciones Manuales Bien Implementadas

Implementar un sistema de aprobación manual en tus pipelines CI/CD de forma efectiva conlleva múltiples ventajas:

  • Reducción de Riesgos: Minimiza la probabilidad de desplegar código con errores críticos en entornos de producción, protegiendo la reputación y los ingresos de tu empresa.
  • Mayor Control y Transparencia: Los equipos tienen un punto de control explícito, lo que aumenta la confianza en el proceso de despliegue y facilita la trazabilidad de los cambios.
  • Cumplimiento Normativo: Facilita la adhesión a estándares de seguridad y regulaciones de la industria al requerir aprobaciones documentadas.
  • Colaboración Mejorada: Fomenta una mejor comunicación entre desarrolladores, QA, operaciones y stakeholders de negocio para coordinar lanzamientos.
  • Flexibilidad Operacional: Permite a los equipos de DevOps responder a eventos inesperados o realizar despliegues programados con mayor precisión.
Riesgo Mitigado 90%
Control Mejorado 85%

🤔 Preguntas Frecuentes (FAQ)

¿Las aprobaciones manuales ralentizan el CI/CD? Sí, por definición, introducen una pausa. Sin embargo, esta pausa es intencional y busca reducir riesgos mayores. La clave es aplicarlas solo en los puntos críticos donde el riesgo de la automatización completa supera los beneficios de la velocidad.
¿Puedo automatizar la aprobación de alguna manera? GitLab no permite la automatización de la *ejecución* de un trabajo `manual` sin intervención. Si quieres automatizar decisiones, tendrías que basarlas en `rules` que evalúen condiciones (ej. cobertura de pruebas, resultados de scanners de seguridad) y determinen si un trabajo se ejecuta automáticamente o se salta. La "aprobación manual" es por naturaleza humana.
¿Qué pasa si nadie aprueba el despliegue manual? El trabajo simplemente permanecerá en estado pendiente. Si el trabajo es crítico para el pipeline, el pipeline en sí puede quedar atascado. Puedes configurar un `timeout` para los trabajos si deseas que fallen después de un cierto período de inactividad, aunque esto no es común para aprobaciones manuales.
¿Se pueden usar aprobaciones manuales para flujos de reversión (rollback)? Absolutamente. Un trabajo de `rollback` también podría ser configurado como `when: manual` y protegido por entorno, permitiendo que solo personal autorizado lo inicie en caso de emergencia.

✅ Conclusión

Las aprobaciones manuales en GitLab CI/CD son una herramienta poderosa y esencial para gestionar el riesgo en los despliegues de software, especialmente en entornos de producción. Al integrar juicios humanos en puntos estratégicos de tu pipeline, puedes garantizar que los cambios críticos sean revisados y aprobados antes de afectar a tus usuarios.

Este tutorial te ha proporcionado los conocimientos para configurar trabajos manuales y proteger entornos, dotándote de un control más granular sobre tus procesos de entrega. ¡Implementa estas prácticas para construir pipelines más robustos, seguros y fiables!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!