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.
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.
Escenarios Típicos para Aprobaciones Manuales
| Escenario | Descripción | Beneficio |
|---|---|---|
| --- | --- | --- |
| Despliegue a Producción | Cambios que afectan directamente a los usuarios finales. | Evita interrupciones de servicio y errores costosos. |
| Lanzamientos Mayores | Despliegues con cambios significativos o nuevas características. | Permite la coordinación con stakeholders y marketing. |
| --- | --- | --- |
| Hotfixes Críticos | Parches urgentes que necesitan una revisión rápida pero confirmada. | Asegura que el hotfix no introduzca nuevos problemas. |
| Entornos Regulados | Sistemas 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.ymly gestionar entornos/proyectos en GitLab.
📖 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 destaging. Esto ocurre sin intervención manual si las etapas anteriores son exitosas.deploy_to_production: Este es el trabajo clave. La líneawhen: manualindica 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 (stagingyproduction) que GitLab puede rastrear.
🔐 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
- Navega a Configuración > CI/CD en tu proyecto de GitLab.
- Expande la sección "Entornos protegidos".
- Haz clic en el botón "Añadir entorno protegido".
- 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.
- Puedes seleccionar "Roles" (por ejemplo,
- Entorno: Selecciona
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:
- Un desarrollador hace
pushde código. - El pipeline de GitLab se inicia automáticamente.
- Los trabajos
build_jobytest_jobse ejecutan. deploy_to_stagingse ejecuta automáticamente (si las anteriores fueron exitosas).- El trabajo
deploy_to_productionaparecerá 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:
- Navega a la vista de Pipelines de tu proyecto en GitLab.
- Haz clic en el pipeline que está pendiente.
- Localiza el trabajo
deploy_to_production. - Haz clic en el botón "Play" (▶️) junto al trabajo.
- Si tienes los permisos necesarios (definidos en la protección del entorno), el trabajo se iniciará.
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.
✨ 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_leady luego otro trabajo manualapprove_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.
📈 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.
🤔 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
- Optimización de Pipelines CI/CD con Caché y Artefactos: Un Enfoque Prácticointermediate18 min
- Despliegues Canario con Istio y Kubernetes: Controlando el Riesgo en CI/CDintermediate20 min
- Asegurando la Cadena de Suministro de Software en CI/CD con SLSA: Un Enfoque Integralintermediate15 min
- Asegurando tus Pipelines CI/CD con Secretos Dinámicos en HashiCorp Vaultintermediate20 min
- Implementando Blue/Green Deployments con Kubernetes y GitOps para CI/CD sin Downtimeintermediate20 min
Comentarios (0)
Aún no hay comentarios. ¡Sé el primero!