Proyecto empresarial completo que implementa una solución integral de CI/CD para Crezcamos con despliegue automatizado en Google Kubernetes Engine (GKE) siguiendo mejores prácticas de DevOps.
- Descripción General
- Características
- Arquitectura
- Estructura del Proyecto
- Configuración Inicial
- Pipelines CI/CD
- Despliegue
- Testing
- Seguridad
- Monitoreo
- Troubleshooting
Este proyecto proporciona una solución production-ready de CI/CD que automatiza completamente el ciclo de vida del software, desde el desarrollo hasta la producción. Implementa:
✅ GitFlow Gobernado con protecciones y aprobaciones
✅ Pipelines automatizados con escaneo de seguridad
✅ Despliegue en Kubernetes con Blue-Green strategy
✅ Observabilidad completa con Google Cloud Operations
✅ Testing multicapa (unitarias, integración, E2E, rendimiento)
✅ Infraestructura como código (IaC) con Kubernetes manifests
- ✓ Detección de secretos (TruffleHog)
- ✓ Análisis de dependencias (OWASP Dependency Check)
- ✓ Escaneo de vulnerabilidades en imágenes (Trivy)
- ✓ Pruebas de seguridad (OWASP ZAP)
- ✓ Análisis de calidad de código (SonarQube)
- ✓ Pruebas unitarias con cobertura
- ✓ Pruebas de integración
- ✓ Pruebas E2E con Cypress
- ✓ Pruebas de rendimiento con k6
- ✓ Health checks automatizados
- ✓ Smoke tests post-despliegue
- ✓ Despliegue azul-verde (Blue-Green) en producción
- ✓ Rolling updates en staging y desarrollo
- ✓ Auto-scaling horizontal (HPA)
- ✓ Rollback automático o manual
- ✓ Soporte multi-ambiente (DEV, STAGING, PROD)
- ✓ Logs centralizados (Google Cloud Logging)
- ✓ Métricas con Prometheus
- ✓ Dashboards con Grafana
- ✓ Alertas y notificaciones (Slack)
- ✓ Trazabilidad distribuida
- ✓ Dockerización automatizada
- ✓ Manifiestos Kubernetes parametrizados
- ✓ GitOps ready
- ✓ Infrastructure as Code
- ✓ Secrets management
┌─────────────────────────────────────────────────────────────────┐
│ GitLab (VM1) │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ GitLab Self-Managed │ │
│ │ ├── GitLab Runner (Docker Executor) │ │
│ │ ├── Container Registry │ │
│ │ └── Pipeline Automation │ │
│ └────────────────────────────────────────────────────────────┘ │
└─────────────────────▼─────────────────────────────────────────────┘
│
▼ Build & Test
┌─────────────────────────────────────────────────────────────────┐
│ Google Cloud Platform │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Google Kubernetes Engine (GKE) Clusters │ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ DEV │ │ STAGING │ │ PROD │ │ │
│ │ │ Cluster │ │ Cluster │ │ Cluster │ │ │
│ │ │ Auto │ │ 2-3 Nodos│ │ HA Multi │ │ │
│ │ │ 2 Nodos │ │ Manifest │ │ Zone 3-5 │ │ │
│ │ └──────────┘ └──────────┘ │ Nodos │ │ │
│ │ └──────────┘ │ │
│ │ vert│Rolling Rolling Blue-Green │ │
│ │ Auto│Updates Updates Manual Approval │ Traffic │ │
│ │ │Approval Approval Switch Validation │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Google Cloud Operations Suite │ │
│ │ ├── Cloud Logging (Logs Centralizados) │ │
│ │ ├── Cloud Monitoring (Métricas e Alertas) │ │
│ │ ├── Cloud Trace (Trazabilidad Distribuida) │ │
│ │ └── Error Reporting │ │
│ └────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
proyecto-gitlab-cicd-crezcamos/
├── 📄 README.md # Este archivo
├── 📄 LICENSE # Licencia del proyecto
├── 📄 package.json # Dependencias Node.js
├── 📄 sonar-project.properties # Configuración SonarQube
├── 📄 cypress.config.js # Configuración Cypress
├── 📄 .dockerignore # Archivos ignorados en Docker
│
├── 📁 .gitlab/ # Configuración GitLab
│ ├── 📁 ci/ # Pipelines específicos por rama
│ │ ├── develop-pipeline.yml # Pipeline para rama develop
│ │ ├── release-pipeline.yml # Pipeline para rama release
│ │ └── main-pipeline.yml # Pipeline para rama main
│ │
│ └── 📁 templates/ # Templates reutilizables
│ ├── security.yml # Jobs de seguridad
│ ├── build.yml # Jobs de construcción
│ └── deploy.yml # Jobs de despliegue
│
├── 📁 docker/ # Dockerización
│ └── Dockerfile # Multi-stage Dockerfile
│
├── 📁 infrastructure/ # Infraestructura como código
│ └── 📁 kubernetes/ # Manifiestos Kubernetes
│ └── 📁 apps/ # Aplicación
│ ├── 📁 dev/ # Manifiestos para DEV
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── configmap.yaml
│ ├── 📁 staging/ # Manifiestos para STAGING
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── configmap.yaml
│ │ └── hpa.yaml
│ └── 📁 prod/ # Manifiestos para PROD
│ ├── deployment.yaml
│ ├── service.yaml
│ └── configmap.yaml
│
├── 📁 scripts/ # Scripts y herramientas
│ └── 📁 performance/ # Tests de rendimiento
│ └── load-test.js # Test de carga con k6
│
├── 📁 src/ # Código fuente (ejemplo)
│ └── index.js # Entry point
│
├── 📁 tests/ # Pruebas
│ ├── unit/ # Pruebas unitarias
│ └── integration/ # Pruebas de integración
│
└── 📁 cypress/ # Tests E2E
├── e2e/ # Especificaciones E2E
├── support/ # Helpers y configuración
└── fixtures/ # Datos de prueba
- Node.js 18+
- Docker 24+
- kubectl 1.24+
- git
- Acceso a GitLab (instancia self-managed)
- Acceso a Google Cloud Platform
- Acceso a SonarQube (opcional pero recomendado)
git clone <URL_REPOSITORIO>
cd proyecto-gitlab-cicd-crezcamosnpm installEn GitLab > Settings > CI/CD > Variables agregar:
# GCP Configuration
GCP_PROJECT_ID: "crezcamos-prod"
GCP_REGION: "us-central1"
GCP_SERVICE_ACCOUNT_KEY: <base64_encoded_service_account>
# GKE Clusters
GKE_CLUSTER_DEV: "crezcamos-dev-cluster"
GKE_CLUSTER_STAGING: "crezcamos-staging-cluster"
GKE_CLUSTER_PROD: "crezcamos-prod-cluster"
# Registry
CI_REGISTRY_USER: <gitlab_username>
CI_REGISTRY_PASSWORD: <gitlab_token>
# Database
DATABASE_URL_STAGING: "postgresql://user:pass@host/db"
DATABASE_URL_PROD: "postgresql://user:pass@host/db"
# API Keys
API_KEY_STAGING: <staging_api_key>
API_KEY_PROD: <prod_api_key>
# SonarQube
SONAR_HOST_URL: "https://sonarqube.crezcamos.com"
SONAR_TOKEN: <sonarqube_token>
# Slack Notifications
SLACK_WEBHOOK_URL: "https://hooks.slack.com/services/..."# Autenticar con GCP
gcloud auth activate-service-account --key-file=service-account.json
gcloud config set project crezcamos-prod
# Obtener credenciales de cluster
gcloud container clusters get-credentials crezcamos-dev-cluster --region us-central1
# Verificar conexión
kubectl cluster-info
kubectl get nodesEjecuta automáticamente en cada push a develop:
┌─ security-scan ─┐
│ • Secret scanning
│ • Dependency check ┌─ test ─┐
│ │ • Unit tests
│ │ • Integration tests
├─── build ──┤
│ • Docker build ├─ quality ─┐
│ • Image push │ • SonarQube analysis
│
├─ vulnerability ─┐
│ • Trivy scan
│
└─ deploy ──────────────┐
• Deploy a DEV ├─ post-deploy ───┐
• Health check │ • Health checks
• Smoke tests │ • E2E tests
• Performance tests │ • Performance tests
Características:
- ✅ Despliegue automático a DEV
- ✅ No requiere aprobaciones
- ✅ Useful para desarrollo rápido
- ⏹️ Se detiene en vulnerabilidades críticas
Ejecuta automáticamente en cada push a release:
┌─ security-scan ──┐
│ • Secret scanning
│ • Dependency check ┌─ test ────┐
│ │ • E2E tests
├─── build ──┤ • Security tests ├─ approval ─┐
│ • Docker build │ │ QA Approval
│ • Image push │
│
├─ vulnerability ─┐
│ • Trivy scan
│
┌─ approval ──────────────┐
│ • Líder Técnico ├─ deploy ────┐
│ • Comité de Cambios │ • Staging
│ ├─ post-deploy ──┐
│ │ • Smoke tests
│ │ • E2E tests
Características:
- ✅ Requiere aprobación de QA
- ✅ Requiere aprobación de Líder Técnico
- ✅ Despliegue a Staging
- ✅ Tagging automático de imagen
- ✅ Capacidad de rollback
Ejecuta automáticamente en cada push a main:
┌─ security-scan ─┐
│ • Secret scanning
│ • Dependency check ┌─ approval ────────────┐
│ │ • Líder Técnico
├─ build ──┤ • Comité de Cambios
│ • Docker build
│ • Image tagging
│
├─ vulnerability ─┐
│ • Trivy scanning (CRÍTICA)
│
├─ deploy ────────────────────┐ ┌─ approval ──────────────┐
│ • Create release tag │ │ • Validar smoke tests
│ • Blue-Green prep ├──┤ • Validar métricas
│ • Deploy Green │ │ • Aprobación final
│ • Smoke tests Green │ │
│ • Traffic switch approval │
│
└─ post-deploy ──────────────┐
• Valproduction metrics
• Cleanup Blue
• Notificaciones
Características:
- ✅ Despliegue azul-verde sin downtime
- ✅ Aprobación de Líder Técnico
- ✅ Aprobación de Comité de Cambios
- ✅ Validaciones de salud
- ✅ Monitoreo post-switch
- ✅ Rollback disponible
main (Producción)
│
├─ release/v1.0.0 (QA/Staging)
│ │
│ └─ hotfix/bug-fix (Correcciones urgentes)
│
develop (Integración)
│
├─ feature/new-feature
├─ feature/another-feature
│
└─ bugfix/issue-123
Reglas:
main: Protegida, requiere PR y todas las reviewsrelease/*: Persistente, branch pre-produccióndevelop: Protegida, base para featuresfeature/*,bugfix/*: Temporal, desdedevelophotfix/*: Desdemain, merge amainydevelop
Automático en cada push a develop
# Ver estado del despliegue
kubectl get pods -n development -w
# Ver logs
kubectl logs -l app=crezcamos -n development -f
# URL de acceso
kubectl get svc -n developmentManual tras aprobación en pipeline de release
- Push a rama
release - Pipelines ejecutan automáticamente
- Esperar aprobación manual: QA Approval ✋
- Despliegue automático a Staging
- Ejecutar E2E tests y validaciones
kubectl get pods -n staging -w
kubectl get svc -n stagingControlado en rama main con múltiples aprobaciones
Proceso:
- Crear PR de
release→main - Pipelinelines ejecutan validaciones
- Aprobación 1: Líder Técnico ✅
- Aprobación 2: Comité de Cambios ✅
- Tag de release creado automáticamente
- Deployment Green desplegado
- Smoke tests en Green
- Aprobación manual: Traffic Switch ✋
- Switch de tráfico de Blue a Green
- Cleanup de Blue (después de 30 min)
# Monitorear despliegue Blue-Green
kubectl get deployments -n production
# Ver tráfico actual
kubectl get svc crezcamos -n production -o jsonpath='{.spec.selector.deployment}'
# Verificar logs
kubectl logs -l app=crezcamos -n production -f
# Switch de tráfico (si se necesita manualmente)
kubectl patch service crezcamos -n production -p '{"spec":{"selector":{"deployment":"green"}}}'# Ejecutar pruebas unitarias
npm run test:unit
# Con cobertura
npm test
# Ver reporte de cobertura
open coverage/index.htmlnpm run test:integration# Interfaz interactiva
npm run test:e2e:open
# Modo headless
npm run test:e2e
# Usuarios específicos
npx cypress run --spec "cypress/e2e/login/**"# Test de carga local
k6 run scripts/performance/load-test.js
# Test en Cloud
k6 cloud scripts/performance/load-test.js
# Con variables custom
k6 run --vus 30 --duration 30s -e BASE_URL=https://staging.crezcamos.com scripts/performance/load-test.jsEjecuta automáticamente en todos los pipelines:
-
Secret Scanning - TruffleHog
- Detecta credenciales hardcodeadas
- Falla el pipeline si encuentra secretos
-
Dependency Check - OWASP
- Analiza vulnerabilidades en dependencias
- Reporte detallado de CVEs
-
Container Scanning - Trivy
- Escanea imagen Docker
- Bloquea vulnerabilidades críticas
- Detallado en release/main
-
SAST - SonarQube
- Análisis estático de código
- Detecta bugs y code smells
- Quality gate
-
DAST - OWASP ZAP
- Testing dinámico de seguridad
- Atacontra aplicación viva
- Genera reporte HTML
# Nunca hardcodear secretos
❌ const apiKey = "sk_live_123456"
✅ const apiKey = process.env.API_KEY
# Usar .env para variables locales
echo "API_KEY=secret" > .env.local
# Verificar antes de commit
npm run lint
git pre-commit hook- Secretos: Rotar cada 90 días
- Tokens: Rotar cada 30 días
- Passwords: Cambiar en IAM
- Service accounts: Manejar via GCP
# Ver logs de aplicación
gcloud logging read "resource.type=k8s_container AND resource.labels.pod_name=crezcamos" --limit=50
# Filtrar por nivel
gcloud logging read "severity=ERROR" --limit=50
# Crear log sink para BigQuery
gcloud logging sinks create crezcamos-sink bigquery.googleapis.com/projects/crezcamos-prod/datasets/logsMétricas automáticamente recolectadas:
/metrics endpoint en puerto 9090
Métricas disponibles:
- http_requests_total (contador)
- http_request_duration_seconds (histograma)
- process_cpu_seconds_total
- process_resident_memory_bytes
- nodejs_version_info
Alertas automáticas configuradas:
- CPU > 80% (5 min)
- Memoria > 85% (5 min)
- Error rate > 5% (2 min)
- Latencia p95 > 1000ms (5 min)
- Pod restart > 3 (1 hora)
- Disk > 90% (continuo)
Notificaciones:
- Slack en #crezcamos-alerts
- Email a oncall@crezcamos.com
- PagerDuty para P0/P1
Problema: Pipeline detiene en stage de "build"
# Ver logs del job
# En GitLab: Pipeline > Job > Logs
# Validar Dockerfile
docker build -f docker/Dockerfile -t crezcamos:test .
# Verificar dependencias
npm ci --verbose# Describir pod para ver error
kubectl describe pod <pod-name> -n <namespace>
# Ver logs
kubectl logs <pod-name> -n <namespace>
# Ejecutar comando en pod
kubectl exec -it <pod-name> -n <namespace> -- /bin/sh
# Status del deployment
kubectl get deployment <deployment> -n <namespace> -o wide
kubectl rollout status deployment/<deployment> -n <namespace># Verificar credenciales de registry
kubectl get secret regcred -n <namespace> -o yaml
# Crear secret si falta
kubectl create secret docker-registry regcred \
--docker-server=$CI_REGISTRY \
--docker-username=$CI_REGISTRY_USER \
--docker-password=$CI_REGISTRY_PASSWORD \
-n <namespace>
# Test de acceso
docker login $CI_REGISTRY# Test manual del endpoint
curl http://<pod-ip>:8080/health
# Ver probe configuration en manifest
kubectl get deployment <deployment> -n <namespace> -o yaml | grep -A5 livenessProbe
# Aumentar initialDelaySeconds si la app tarda en iniciar# Verificar secret
kubectl get secret app-secrets -n <namespace> -o yaml
# Test de conexión manual
kubectl run -it --rm debug --image=postgres:13 --restart=Never -- \
psql -h <db-host> -U <user> -d <database># Limpiar namespace completo
kubectl delete namespace <namespace> --ignore-not-found
# Limpiar solo deployments
kubectl delete deployment -l app=crezcamos -n <namespace>
# Rescan de imágenes viejas
docker rmi $(docker images | grep crezcamos | awk '{print $3}')Para contribuir al proyecto:
-
Create feature branch
git checkout -b feature/my-feature
-
Commit changes
npm run lint # Linting npm test # Tests git commit -m "feat: add my feature"
-
Push y crear PR
git push origin feature/my-feature
-
Esperar aprobaciones en GitLab MR
-
Merge cuando todas las pruebas pasen
Este proyecto está bajo licencia MIT. Ver archivo LICENSE para más detalles.
- Slack: #crezcamos-devops
- Email: devops@crezcamos.com
- Issues: GitLab Issues
- Docs: Wiki interno
Última actualización: Marzo 2026
Versión del Sistema: 1.0.0
Mantenedor: Crezcamos DevOps Team
- Prometheus: Recolección de métricas
- Grafana: Visualización de dashboards
- Alertmanager: Gestión de alertas
- Loki: Agregación de logs (opcional)
- CPU/Memoria > 80%
- Pods en estado CrashLoopBackOff
- Deployments fallidos
- Latencia de respuesta > umbral
- Errores HTTP 5xx > tasa aceptable
- Disponibilidad de servicios < 99.5%
proyecto-gitlab-cicd-crezcamos/
├── .gitlab-ci.yml # Pipeline principal
├── .gitlab/
│ ├── ci/
│ │ ├── develop-pipeline.yml # Jobs para develop
│ │ ├── release-pipeline.yml # Jobs para release
│ │ └── main-pipeline.yml # Jobs para main
│ └── templates/
│ ├── security.yml # Templates de seguridad
│ ├── build.yml # Templates de build
│ └── deploy.yml # Templates de deploy
├── infrastructure/
│ ├── terraform/ # IaC para GCP
│ │ ├── gitlab-vm/ # Terraform para VM GitLab
│ │ ├── gke-clusters/ # Terraform para GKE
│ │ └── monitoring/ # Terraform para Monitoring
│ └── kubernetes/
│ ├── namespaces/ # Definiciones de namespaces
│ ├── rbac/ # Roles y permisos
│ ├── monitoring/ # Stack de monitoreo
│ │ ├── prometheus/
│ │ ├── grafana/
│ │ └── alertmanager/
│ └── apps/ # Manifiestos de aplicaciones
│ ├── dev/
│ ├── staging/
│ └── prod/
├── scripts/
│ ├── security/
│ │ ├── secret-scan.sh # Detección de secretos
│ │ └── dependency-check.sh # Análisis de dependencias
│ ├── build/
│ │ └── docker-build.sh # Script de build
│ ├── deploy/
│ │ ├── deploy-to-gke.sh # Deploy a GKE
│ │ └── rollback.sh # Script de rollback
│ └── monitoring/
│ └── health-check.sh # Health checks
├── docker/
│ ├── Dockerfile # Dockerfile de aplicación
│ └── .dockerignore
├── docs/
│ ├── arquitectura.md # Documentación de arquitectura
│ ├── pipelines.md # Guía de pipelines
│ ├── deployment.md # Guía de despliegue
│ └── monitoring.md # Guía de monitoreo
└── README.md # Este archivo
-
Cuenta de GCP con permisos para:
- Compute Engine
- Kubernetes Engine
- Container Registry
- Cloud Monitoring
- Cloud Logging
-
GitLab Self-Managed instalado en VM1 o GitLab.com
-
Herramientas locales:
- gcloud CLI
- kubectl
- terraform
- docker
Ver las guías detalladas en:
- ✅ Secret scanning en cada commit
- ✅ Análisis de vulnerabilidades con Trivy
- ✅ Escaneo de dependencias
- ✅ Protección de ramas (main, release, develop)
- ✅ Aprobaciones obligatorias en Pull Requests
- ✅ RBAC en Kubernetes
- ✅ Network Policies en GKE
- ✅ Encriptación de secretos con Google Secret Manager
- Trazabilidad completa de cambios
- Auditoría de despliegues
- Segregación de ambientes
- Control de accesos basado en roles
- Registro de aprobaciones
- Pipeline Health: Estado de pipelines y frecuencia de fallos
- Application Performance: Latencia, throughput, errores
- Infrastructure: CPU, memoria, disco, red
- Security: Vulnerabilidades detectadas, secrets expuestos
- Business Metrics: Métricas de negocio personalizadas
- Slack
- PagerDuty (opcional)
- Google Chat (opcional)
- Crear feature branch desde develop
- Desarrollar y hacer commits
- Crear Pull Request a develop
- Revisión de código (mínimo 1 aprobación)
- Merge a develop
- Pipeline automático despliega a DEV
- Crear Pull Request de develop a release
- Revisión de código (mínimo 2 aprobaciones)
- Merge a release
- Pipeline ejecuta pruebas automatizadas
- Aprobación manual de QA
- Despliegue automático a QA/Staging
- Certificación de calidad
- Crear Pull Request de release a main
- Revisión de código (mínimo 2 aprobaciones: técnica y funcional)
- Merge a main
- Pipeline ejecuta análisis de seguridad
- Aprobación de Líder Técnico
- Aprobación de Comité de Cambios
- Despliegue a producción
- Verificación automática
- Notificación a stakeholders
En caso de problemas en producción:
# Opción 1: Rollback desde la UI de GitLab
# Ir al pipeline → Rollback
# Opción 2: Rollback manual
cd scripts/deploy
./rollback.sh <version-anterior>
# Opción 3: Rollback de Kubernetes
kubectl rollout undo deployment/<app-name> -n production- Equipo DevSecOps: devops@crezcamos.com
- Documentación: confluence.crezcamos.com/devops
- Incidentes: jira.crezcamos.com
Confidencial - Uso interno exclusivo de Crezcamos.
Versión: 1.0 Fecha: Marzo 2026 Autor: Equipo DevSecOps Crezcamos