DevOps · CI/CD|13 min de lectura|

Pipelines CI/CD Empresariales: De Commits a Producción con Confianza

Un pipeline CI/CD no es solo automatización de deploys. Un pipeline bien diseñado es el sistema nervioso del equipo de ingeniería: define la velocidad con la que el equipo puede iterar, el nivel de confianza que tiene en cada release, y el tiempo de recuperación ante un error en producción. Esta guía documenta las decisiones de diseño que marcan la diferencia entre un pipeline que acelera el equipo y uno que se convierte en un obstáculo.

La pirámide de tests: la base de todo pipeline

El costo de un bug se multiplica exponencialmente mientras más tarde se detecta. Un bug detectado en unit tests cuesta 1x. En integration tests, 10x. En staging, 50x. En producción, 500x. La pirámide de tests define la distribución correcta de cobertura para maximizar la detección temprana con el menor costo de ejecución.

  • Unit tests (base de la pirámide, 70%): rápidos (<5 minutos para toda la suite), sin dependencias externas, alta cobertura de lógica de negocio. Si tardan más de 10 minutos, el equipo empieza a saltárselos.
  • Integration tests (30%): verifican la interacción con bases de datos, APIs externas y otros servicios internos. Usan contenedores Docker para las dependencias (testcontainers).
  • E2E tests (10%): verifican los flows críticos del usuario completos. Solo para los happy paths de mayor valor de negocio — los E2E completos son lentos y frágiles.

Estrategia de branches: Trunk-Based Development para equipos ágiles

Gitflow (develop, release, hotfix branches) era el estándar hace 10 años. Para equipos que quieren deployar múltiples veces por día, Trunk-Based Development es el modelo correcto: todos los desarrolladores integran al main trunk frecuentemente (idealmente diario), y los releases se hacen directamente desde trunk.

text
# Trunk-Based Development — flujo simplificado
main (trunk)
├── feature/TICKET-123-add-checkout    # branch de corta duración (<2 días)
└── feature/TICKET-456-fix-cart        # merge a main vía PR con CI obligatorio

# NO: ramas de larga duración
# NO: develop, release, hotfix como modelo de integración
# SÍ: feature flags para desacoplar deploy de release

La clave de Trunk-Based Development son los feature flags. El código de una feature incompleta se mergea a trunk protegido por un flag desactivado. El feature se activa en producción cuando está listo, independientemente de cuándo se mergeó el código.

Pipeline de GitLab CI production-grade

yaml
stages:
  - test
  - build
  - security
  - deploy-staging
  - integration-test
  - deploy-production

variables:
  IMAGE: ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA}

unit-tests:
  stage: test
  image: node:20-alpine
  cache:
    paths: [node_modules/]
  script:
    - npm ci
    - npm run test:unit -- --coverage
  coverage: '/Lines\s*:\s*(\d+\.?\d*)%/'
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage/cobertura-coverage.xml

build-image:
  stage: build
  image: docker:24
  services: [docker:24-dind]
  script:
    - docker build --cache-from ${IMAGE}:latest -t ${IMAGE} .
    - docker push ${IMAGE}
  only: [main]

trivy-scan:
  stage: security
  image: aquasec/trivy:latest
  script:
    - trivy image --exit-code 1 --severity HIGH,CRITICAL ${IMAGE}
  allow_failure: false   # bloquea el pipeline si hay vulnerabilidades críticas
  only: [main]

deploy-production:
  stage: deploy-production
  environment: production
  when: manual
  script:
    - kubectl set image deployment/api api=${IMAGE} -n production
    - kubectl rollout status deployment/api -n production --timeout=5m
  only: [main]

Deployment Strategies: elegir según el riesgo

No todas las features merecen el mismo nivel de precaución en el deploy. Las tres estrategias principales:

Rolling Update

Deploy gradual reemplazando pods uno a uno. Costo de implementación bajo. Rollback tarda N minutos (tiempo de rolling update). Ideal para la mayoría de cambios de bajo riesgo en servicios stateless.

Blue/Green Deployment

Dos environments idénticos (blue=actual, green=nueva versión). El switch es instantáneo a nivel de load balancer. Rollback en segundos. Costo: doble de infra durante el deploy. Ideal para cambios de alto impacto donde el rollback instantáneo justifica el costo.

Canary Deployment

Deploy a un porcentaje pequeño del tráfico (5%, 10%) antes del rollout completo. Detecta problemas reales de producción con impacto mínimo. Requiere feature flags o traffic splitting en el ingress/service mesh. La estrategia más robusta para servicios críticos con alto volumen de usuarios.

yaml
# Argo Rollouts — Canary con análisis automático
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: api
spec:
  strategy:
    canary:
      steps:
      - setWeight: 5    # 5% del tráfico al canary
      - pause: {duration: 10m}
      - analysis:
          templates:
          - templateName: success-rate
      - setWeight: 50
      - pause: {duration: 5m}
      - setWeight: 100
      canaryMetadata:
        labels:
          deployment: canary
      stableMetadata:
        labels:
          deployment: stable
Argo Rollouts con análisis automático puede abortar un canary deployment automáticamente si la tasa de error del canary supera la del stable, sin intervención manual. Esto convierte el canary en un safety net, no solo en una estrategia de deploy.

Secrets en pipelines: el error más frecuente

Hardcodear secrets en el pipeline (variables de CI sin enmascarar, kubectl apply con tokens en el script) es el error más frecuente en pipelines empresariales. El patrón correcto: las credenciales de deploy viven en el secret manager del cloud (AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault), y el pipeline los obtiene en runtime con credenciales temporales vía OIDC.

yaml
# GitLab CI — OIDC con AWS para credenciales temporales sin secrets estáticos
deploy:
  id_tokens:
    AWS_OIDC_TOKEN:
      aud: https://gitlab.com
  script:
    - export $(aws sts assume-role-with-web-identity
        --role-arn ${AWS_DEPLOY_ROLE_ARN}
        --role-session-name gitlab-ci-${CI_JOB_ID}
        --web-identity-token ${AWS_OIDC_TOKEN}
        --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]'
        --output text | awk '{print "AWS_ACCESS_KEY_ID="$1" AWS_SECRET_ACCESS_KEY="$2" AWS_SESSION_TOKEN="$3}')
    - kubectl apply -f k8s/

Preguntas frecuentes

¿Cuántos deploys a producción por día es razonable para un equipo empresarial?
Empresas como Amazon y Google deployaban miles de veces por día hace más de una década. Para equipos empresariales típicos, 2-5 deploys por semana indica un pipeline maduro. El objetivo no es un número específico — es que el equipo tenga confianza para deployar cuando el código está listo, sin esperar una ventana de mantenimiento semanal.
¿Cómo implemento feature flags sin una herramienta de terceros?
La implementación mínima: una tabla en base de datos con feature_name y enabled (boolean), con un servicio de caché (Redis) para evitar queries en cada request. Para lanzamientos porcentuales: añadir un campo percentage y hash del user_id para determinar si el usuario entra al grupo de feature. Para producción empresarial, LaunchDarkly o Unleash (open-source) son más robustos y tienen SDKs para múltiples lenguajes.
¿Cómo medir la efectividad del pipeline de CI/CD?
Las métricas DORA (DevOps Research and Assessment) son el estándar: Deployment Frequency (con qué frecuencia se deploya), Lead Time for Changes (tiempo desde commit hasta producción), Change Failure Rate (% de deploys que causan incidente), y Time to Restore Service (MTTR). GitLab y GitHub tienen estas métricas integradas. Equipos elite tienen lead time < 1 hora y change failure rate < 5%.
¿Cómo manejo los database migrations en el pipeline?
El patrón correcto: las migrations se ejecutan como parte del deploy, antes de iniciar la nueva versión de la aplicación. Las migrations deben ser backward compatible con la versión anterior del código (para permitir rollback sin perder datos). Herramientas: Flyway, Liquibase, Alembic, o las migrations del ORM del framework. Nunca ejecutar migrations manualmente desde la máquina local de un desarrollador.
¿Qué tan costoso es implementar un pipeline CI/CD de nivel enterprise?
GitLab CI y GitHub Actions tienen niveles gratuitos suficientes para equipos pequeños. Para empresas medianas, el costo de GitLab Premium o GitHub Enterprise es 20-50 USD/usuario/mes. La inversión real es el tiempo de ingeniería: diseñar y mantener el pipeline, los tests automatizados y la infraestructura de staging. Un pipeline bien diseñado paga su inversión en 3-6 meses al reducir el tiempo de debugging en producción y la frecuencia de incidentes.

¿Tu equipo quiere pasar de deploys manuales a un pipeline CI/CD que les dé confianza para iterar rápido? Diseñamos e implementamos el pipeline desde cero.

Habla con el equipo

Artículos relacionados

IQS

Equipo de Ingeniería — IQS

Ingenieros de software, cloud y DevOps con experiencia en proyectos empresariales.