Ir al contenido

GitLab Workflow

El GitLab Workflow define cómo los equipos de desarrollo colaboran usando Git y GitLab. Este modelo estandariza el flujo de trabajo desde la creación de código hasta el despliegue en producción, asegurando calidad, trazabilidad y colaboración efectiva.


Para mantener el orden y la calidad, todos los proyectos en HERA deben seguir una estrategia de ramas estandarizada, con dos ramas principales protegidas y ramas de feature de corta duración.

Estrategia de Ramas HERA
main
MR + Aprobación Tech Lead + QA
→ Producción (PRD)
develop
MR feature
MR fix
→ Auto-deploy DEV & QA
feature/
task-A
Merge Request hacia develop
fix/
bug-B
Merge Request hacia develop
main — Protegida · Solo Producción
develop — Integración continua
feature/* — Corta duración
fix/* — Corrección de bugs
Mensaje clave Dos ramas protegidas: develop para integración, main para producción. Todo cambio entra por Merge Request.
  • main: Esta rama es sagrada. Refleja el estado actual de Producción.
    • Nadie puede hacer push directo. Los cambios solo llegan a través de Merge Requests desde develop.
    • Cada merge a main es, en efecto, una release a producción.
  • develop: Es la rama principal de integración.
    • Representa la última versión del código con todas las nuevas funcionalidades listas.
    • Se despliega automáticamente a los ambientes de DEV y QA.
    • Todas las ramas de trabajo (feature, fix, etc.) se crean a partir de develop.

Este es el ciclo de trabajo diario para cualquier desarrollador en HERA.

  1. Sincroniza y Crea tu Rama: Asegúrate de tener la última versión de develop y crea tu nueva rama de trabajo.

    Ventana de terminal
    git checkout develop
    git pull origin develop
    git checkout -b feature/nueva-funcionalidad
  2. Desarrolla y Haz Commits: Realiza tu trabajo, haciendo commits pequeños y frecuentes con mensajes claros (ver Conventional Commits).

    Ventana de terminal
    git add .
    git commit -m "feat(auth): add login form component"
  3. Sube tus Cambios y Crea el Merge Request (MR): Una vez que tu trabajo esté listo para ser integrado, súbelo y crea un MR en GitLab.

    Ventana de terminal
    git push -u origin feature/nueva-funcionalidad
    # Ahora, ve a GitLab y crea el Merge Request de 'feature/...' hacia 'develop'
  4. Revisión de Código y Merge a develop:

    • Tu Tech Lead o un compañero revisará tu código directamente en el MR.
    • Una vez aprobado y el pipeline de CI pase exitosamente, se hace “Merge”.
    • Resultado: Al hacer merge, el pipeline despliega automáticamente al ambiente de DEV.

La promoción de código sigue un flujo controlado con responsabilidades claras entre el equipo de desarrollo y el equipo de DevOps Operacional. Un solo Merge Request genera el commit que se despliega a QA y luego a PRD — no se crean MRs adicionales.

Paso 1 — Developer crea el MR de developmain

Sección titulada «Paso 1 — Developer crea el MR de develop → main»

El Developer (o Tech Lead) es quien crea el Merge Request porque conoce qué funcionalidades están listas para pasar al ambiente de QA. El Developer sabe qué features se completaron, qué bugs se corrigieron y qué está estable en DEV.

El MR debe incluir:

  • Título con Conventional Commits: feat(checkout): implement payment gateway integration
  • Descripción con las funcionalidades incluidas y los criterios de validación para QA
  • Checklist de lo que negocio debe validar en QA

Paso 2 — DevOps Operacional revisa e integra

Sección titulada «Paso 2 — DevOps Operacional revisa e integra»

El DevOps Operacional (rol Maintainer) revisa el MR:

  • Verifica que el pipeline de CI pasó todos los Quality Gates
  • Confirma que no hay vulnerabilidades Critical/High sin resolver
  • Valida que la descripción del MR está completa
  • Aprueba y ejecuta el merge a main

Al integrar el MR, se genera un commit en main que es la versión candidata para QA y PRD.

Después del merge, el pipeline de main muestra el job deploy-qa como manual (botón play). El DevOps Operacional lo ejecuta cuando el ambiente de QA está disponible.

  • El deploy usa exactamente el mismo commit que se generó del MR
  • No se crea ningún MR adicional para QA
  • El equipo de QA y negocio validan las funcionalidades en este ambiente

El equipo de negocio (Product Owner) valida en QA que:

  • Las funcionalidades cumplen con los criterios de aceptación
  • No hay regresiones en funcionalidad existente
  • La experiencia de usuario es correcta

Esta validación no ocurre en GitLab — ocurre en el ambiente de QA. El PO comunica su aprobación al equipo de DevOps.

Con la aprobación de negocio, el DevOps Operacional ejecuta el job deploy-prd en el mismo pipeline de main — es el mismo commit que pasó por QA. No se hace ningún merge adicional.

ConceptoDetalle
Mismo commitEl código que se desplegó en QA es bit-identical al que se despliega en PRD
Sin MR adicionalNo se crea un nuevo MR para PRD — se usa el pipeline del merge original
Ventana de deployLunes a jueves 9:00-16:00 CST. Viernes antes de 14:00. Fines de semana solo emergencias
Rollback disponibleSi algo falla en PRD: kubectl rollout undo en menos de 5 minutos
PasoQuiénAcciónResultado
1DeveloperCrea MR de developmain con descripción de featuresMR abierto, pendiente de revisión
2DevOps OperacionalRevisa, aprueba e integra el MRCommit en main, pipeline habilitado
3DevOps OperacionalEjecuta deploy manual a QAVersión corriendo en QA
4Product Owner / NegocioValida funcionalidades en QA y da el OKAprobación para PRD
5DevOps OperacionalEjecuta deploy manual a PRD (mismo commit)Versión en producción

Este es el modelo operativo que conecta las ramas con los ambientes de despliegue. Define quién puede hacer qué y cómo fluye un cambio desde el código hasta producción.

  1. El Developer crea una feature branch desde develop y desarrolla su cambio.
  2. El Developer abre un MR hacia develop. Otro Developer lo revisa, aprueba e integra.
  3. El pipeline de CI ejecuta automáticamente el Deploy a DEV al integrar el MR.
  4. Validado DEV, el Developer (o Tech Lead) crea un MR de develop hacia main. No puede integrarlo — solo tiene permisos de creación.
  5. El DevOps Operacional (Maintainer) revisa el MR, aprueba e integra.
  6. El pipeline de CD habilita el Deploy manual a QA, que el DevOps Operacional ejecuta.
  7. Validado QA por el equipo de negocio y con aprobación explícita, el DevOps Operacional ejecuta el Deploy manual a PRD sobre el mismo commit.
AmbienteBranchTriggerQuién ejecutaCondición previa
DEVdevelopAutomático al mergePipeline (sin intervención)MR aprobado entre developers
QAmainManualDevOps OperacionalMR aprobado e integrado por DevOps
PRDmainManualDevOps OperacionalQA validado + aprobación de negocio
RolRol GitLabPuede integrar a developPuede integrar a mainPuede ejecutar deploy QA/PRD
DeveloperDeveloperNo (solo crea el MR)No
Tech LeadDeveloperNo (solo crea el MR)No
QA EngineerDeveloperNoNo
DevOps OperacionalMaintainer (aprueba e integra)
Líder DevOpsMaintainer

Configuración de branches protegidas en GitLab

Sección titulada «Configuración de branches protegidas en GitLab»
CampoValor
Allowed to mergeDevelopers + Maintainers
Allowed to push and mergeNo one
Allowed to force pushDesactivado

Los developers se autogestionan: crean MRs, revisan entre ellos e integran los cambios aprobados. El pipeline despliega a DEV automáticamente.

CampoValor
Allowed to mergeMaintainers (solo DevOps Operacionales)
Allowed to push and mergeNo one
Allowed to force pushDesactivado

Los developers crean el MR a main pero no pueden integrarlo. Solo los DevOps Operacionales (Maintainer) aprueban, integran y ejecutan el deploy manual a QA. Si QA es exitoso y negocio aprueba, ejecutan el deploy a PRD.

Protected Environments — control del deploy

Sección titulada «Protected Environments — control del deploy»

Las Protected Environments son una capa de control independiente de las Protected Branches. Una persona con rol Maintainer que puede mergear a main no necesariamente puede deployar a PRD — el acceso al ambiente se configura por separado.

Ruta en GitLab: Settings → CI/CD → Protected environments

EnvironmentAllowed to deployPropósito
developmentDeveloper + MaintainerCualquier dev puede deployar al ambiente de pruebas al mergear a develop
qaMaintainerSolo DevOps Operacional ejecuta el deploy manual a QA
productionMaintainerSolo DevOps Operacional ejecuta el deploy manual a PRD

Complementan a las Protected Branches y Protected Environments imponiendo validaciones técnicas antes del merge y facilitando que los reviewers correctos se asignen automáticamente.

Ruta en GitLab: Settings → Merge requests

ControlValor recomendadoEfecto
Merge checks → Pipelines must succeedONBloquea el merge si el pipeline CI no está en verde
Merge checks → All threads must be resolvedONBloquea el merge si hay discusiones abiertas en el código
Merge method → Merge commitSegún convención del equipoHistorial trazable del merge en main y develop
Squash commits when merging → EncourageEncourageHistorial más limpio en ramas protegidas

CODEOWNERS — asignación automática de revisores

Sección titulada «CODEOWNERS — asignación automática de revisores»

El archivo .gitlab/CODEOWNERS declara quién es dueño de cada path del repositorio. Al abrir un MR, GitLab sugiere automáticamente como reviewers a los owners de los archivos modificados — evita que el autor tenga que recordar a quién asignar.

Ubicación: .gitlab/CODEOWNERS en la raíz del repositorio.

# Todo cambio requiere revisión del Tech Lead del equipo
* @tech-lead-username
# Paths sensibles: Tech Lead + Security
/src/payments/ @tech-lead-username @security-lead-username
/src/auth/ @tech-lead-username @security-lead-username
# Pipeline CI/CD: DevOps Operacional
/.gitlab-ci.yml @devops-ops-lead-username
# Manifiestos Helm/K8s: Platform Engineering
/helm/ @platform-eng-lead-username
/k8s/ @platform-eng-lead-username

Jobs de deploy — heredados del Golden Pipeline

Sección titulada «Jobs de deploy — heredados del Golden Pipeline»

Los jobs deploy-dev, deploy-qa y deploy-prd no se definen en el .gitlab-ci.yml del proyecto. Se heredan del Golden Pipeline a través de la directiva include: al inicio del pipeline del repo — el equipo de producto no escribe el YAML de deploy a mano.

Ubicación canónica del template: grupo-herdez/platform/pipelines/gitlab-ci/

Contrato de los jobs de deploy (definido en el template)

Sección titulada «Contrato de los jobs de deploy (definido en el template)»
Jobenvironment:rules / triggerBranch objetivoQuién ejecuta
deploy-devdevelopmentAutomático al merge a developdevelopPipeline (sin intervención humana)
deploy-qaqaManual (when: manual) sobre mainmainDevOps Operacional (Maintainer + acceso al Protected Environment qa)
deploy-prdproductionManual (when: manual + needs: [deploy-qa]) sobre mainmainDevOps Operacional (Maintainer + acceso al Protected Environment production)

El valor de environment: en cada job debe coincidir exactamente con el nombre del Protected Environment configurado en los pasos 4, 5 y 6 del checklist inicial. El pipeline del proyecto no redefine estos jobs ni sobrescribe su script: — simplemente los hereda del template.


Paso a paso de configuración inicial del repo

Sección titulada «Paso a paso de configuración inicial del repo»

Al crear un repositorio nuevo bajo grupo-herdez/products/..., el equipo DevOps Operacional aplica esta configuración antes del primer MR. Garantiza gobierno desde el día 1 y evita tener que “cerrar huecos” después de que el repo ya tiene actividad.

#PasoRuta en GitLabDetalle
1Invitar miembros con su rolProject → Members → Invite membersDevelopers (devs + TL + QA) · Maintainers (DevOps Operacional) · Owner (admin plataforma HERA). Ver tabla de roles.
2Proteger developSettings → Repository → Protected branchesAllowed to merge: Developers + Maintainers · Allowed to push and merge: No one · Allowed to force push: OFF
3Proteger mainSettings → Repository → Protected branchesAllowed to merge: Maintainers · Allowed to push and merge: No one · Allowed to force push: OFF
4Proteger environment developmentSettings → CI/CD → Protected environmentsAllowed to deploy: Developer + Maintainer
5Proteger environment qaSettings → CI/CD → Protected environmentsAllowed to deploy: Maintainer
6Proteger environment productionSettings → CI/CD → Protected environmentsAllowed to deploy: Maintainer
7Configurar controles de MRSettings → Merge requestsMerge checks → Pipelines must succeed: ON · Merge checks → All threads must be resolved: ON · Merge method: Merge commit · Squash commits: Encourage. La convención de equipo “2 aprobaciones para MRs a main” se enforce vía CODEOWNERS + verificación del DevOps Operacional antes del merge.
8Crear .gitlab/CODEOWNERSCommit en rama inicialDeclarar owners por path (Tech Lead, Security, DevOps Ops, Platform). Ver ejemplo arriba.
9Validar environment: en .gitlab-ci.ymlRevisar el pipeline del stackdeploy-qa debe referenciar environment: qa · deploy-prd debe referenciar environment: production. Los nombres deben coincidir exactamente con los Protected Environments de los pasos 5 y 6.
10Validación final con MR dummyCrear MR de pruebaConfirmar que: (a) un Developer no puede mergear a main · (b) el deploy a QA/PRD exige rol Maintainer · (c) el autor no puede auto-aprobar su propio MR
GarantíaMecanismo que la hace cumplir
Developers crean feature branches sin pedir permisoRamas feature/* no protegidas (Paso 2)
Nadie pushea directo a develop ni a mainAllowed to push: No one en ambas (Pasos 2 y 3)
Solo DevOps Operacional mergea a mainAllowed to merge: Maintainers (Paso 3)
Solo DevOps Operacional deploya a QA y PRDProtected Environments (Pasos 5 y 6)
Ningún MR se mergea sin revisiónMerge checks + asignación de reviewers vía CODEOWNERS + verificación del DevOps Operacional antes del merge (Pasos 7 y 8)
Los reviewers correctos se asignan automáticamenteCODEOWNERS (Paso 8)
El Tech Lead tiene autoridad de aprobación pero NO de merge ni deployRol Developer + CODEOWNERS (Pasos 1 y 8)
Ninguna feature branch puede saltarse el pipeline CIQuality Gates obligatorios antes de mergear

Comparativa: GitFlow vs Trunk-based vs Modelo HERA

Sección titulada «Comparativa: GitFlow vs Trunk-based vs Modelo HERA»

El modelo HERA no nació en el vacío. Es una decisión deliberada posicionada entre los dos extremos del spectrum: GitFlow (más estructurado) y Trunk-based development (más ágil). Esta sección explica el porqué y cuándo cada modelo es apropiado.

AspectoGitFlowTrunk-basedModelo HERA
Ramas principalesmaster + develop + release branchesSolo mainmain + develop
Feature branchesSí, larga duraciónSí, corta duración (menos de 1 día)Sí, corta duración (menos de 3 días)
Release branchesSí, obligatoriasNoNo
Hotfix branchesSí, dedicadasDirecto en mainDirecto a main con MR fast-track
Frecuencia de deployMensual o trimestralMúltiples veces al díaDiaria a semanal
ComplejidadAlta — muchas ramasBaja — una ramaMedia — dos ramas
Curva de aprendizajeAltaBajaMedia
Coordinación entre equiposPor release branchContinua via feature flagsVia develop como punto de integración
Adecuado paraProductos con releases planeadas (software empaquetado)Equipos maduros con CI/CD avanzado y feature flagsOrganizaciones en transición de tradicional a DevOps maduro
Correlación con DORA high-performersBajaAltaMedia-alta
El spectrum de branching
HERA
menos coordinacion mas velocidad
GitFlow
  • Estructura formal
  • Multiples branches
  • Releases planeadas
Hibrido Pragmatico HERA
  • main + develop
  • Feature branches cortas
  • Modelo de transicion
Trunk-based
  • Agilidad maxima
  • Solo main
  • Trunk always releasable
Evolucion natural conforme madura el equipo
Mensaje clave HERA está entre GitFlow y Trunk-based. El objetivo es evolucionar hacia Trunk-based puro.

HERA está en transición desde operaciones tradicionales hacia DevOps maduro. El modelo de branching refleja esa realidad:

RazónDetalle
Trunk-based puro requiere madurez avanzadaFeature flags maduros, monitoring sofisticado, cultura de continuous deployment. Grupo Herdez aún no está ahí en todos los productos.
GitFlow puro es overhead innecesarioNo necesitamos release branches mensuales. La industria moderna no opera así.
develop actúa como buffer de integraciónPermite ejecutar pruebas en QA antes de PRD, sin la complejidad de release branches
MRs cortos compensan la rama developSi los MRs son menores a 3 días, el riesgo de divergencia es bajo
Familiar para equipos que vienen de GitFlowLa curva de aprendizaje es menor que ir directo a Trunk-based
Compatible con releases manuales a PRDCumple con políticas de aprobación + ventanas de deploy
SituaciónModelo recomendado
Software empaquetado con releases mensuales planeadasGitFlow puro
Equipo maduro con feature flags + monitoring + CDTrunk-based puro
Producto experimental sin tráfico realTrunk-based simplificado
Sistema con regulaciones que requieren change windows estrictasGitFlow con release branches

Un hotfix es un parche urgente a producción que NO puede esperar al ciclo normal develop → main. Casos típicos: vulnerabilidad crítica, bug bloqueante de negocio, regresión post-deploy.

Flujo de Hotfix en HERA

Parche urgente a produccion que NO espera al ciclo normal develop a main

1
main PRD actual: v1.2.3
git checkout -b hotfix/... origin/main
2
hotfix/security-patch-v1.2.4 Fix minimo, NO incluye otras features
MR fast-track a main
3
main PRD: v1.2.4 — Pipeline despliega con aprobacion expedita
Merge back a develop (obligatorio)
4
develop Incluye el hotfix para que el proximo release no lo revierta
Mensaje clave Branch desde main, fix, MR fast-track a main, merge-back obligatorio a develop en 24h.
ReglaPor qué
Branch desde main, no desde developdevelop puede tener cambios no validados
Solo el fix mínimoCualquier “y de paso…” rompe el propósito del hotfix
MR directamente a mainNo pasa por develop (eso lo demoraría)
Aprobación expedita1 Tech Lead + Security Engineer (en vez de 3 aprobaciones normales)
Pipeline completo igualQuality Gates NO se relajan ni siquiera en hotfix
Merge back a develop obligatorioSin esto, el siguiente release a develop → main revertiría el hotfix
Post-mortem dentro de 48 horasDocumentar qué falló, por qué urgió, cómo prevenir
main: v1.2.3 → hotfix → v1.2.4 (con fix de seguridad)
develop: v1.3.0 (sin el fix)
# Próximo release develop → main
develop → main: v1.3.0 → ¡REVIERTE EL HOTFIX! 💥

Solución: después de cada hotfix a main, hacer git merge main en develop o cherry-pick del commit del fix.


Esta es una decisión deliberada de HERA: NO se usan release branches.

Razón
Agregan complejidad sin valor para el modelo de releases continuos de HERA
Requieren coordinación adicional entre equipos
Generan deuda de “qué cherry-pickeamos al release”
Modernamente, feature flags + Trunk-based reemplazan release branches
HERA usa el patrón “tag de release sobre main” en su lugar
  • Software empaquetado distribuido a clientes (instalable, on-prem)
  • Versiones LTS con backport de fixes (más de 1 año de soporte)
  • Regulaciones que requieren freeze de código antes de release

Para HERA, ninguna de estas aplica hoy. Si en el futuro Grupo Herdez distribuye software on-premises, se reevaluará.


El modelo HERA es de transición. Trunk-based development puro es el destino para productos maduros. Estos son los criterios de readiness para que un producto pueda migrar:

CriterioCumplido
✅ El producto tiene feature flags maduros (kill switches, gradual rollout)[ ]
✅ Pipeline de CI corre en < 10 minutos consistentemente[ ]
✅ Pipeline de CD permite deploy a PRD sin aprobación humana (automatizado con quality gates)[ ]
✅ Cobertura de tests > 80% unit + integration[ ]
✅ Tests E2E automatizados que corren post-deploy[ ]
✅ Observabilidad madura: dashboards, SLOs, alertas con bajo umbral[ ]
✅ Capacidad de rollback automático basado en métricas[ ]
✅ Cultura de deploy múltiples veces al día ya establecida[ ]
✅ El equipo ha leído y entiende los principios de Trunk-based[ ]
✅ La organización acepta deploys a PRD sin gates manuales[ ]

Si el producto cumple los 10 criterios, está listo para migrar a Trunk-based puro. La migración es voluntaria y se hace producto por producto, no big bang.

  1. Eliminar la rama develop — los feature branches se integran directamente a main
  2. Habilitar deploy automático a PRD desde main (sin aprobación humana, con quality gates fuertes)
  3. Reforzar feature flags — toda funcionalidad nueva detrás de un flag
  4. Acortar feature branches a menos de 1 día (idealmente horas)
  5. Tests E2E continuos post-deploy automático

ConceptoEstándar HERA
Modelo de branchingHíbrido — main + develop + feature branches cortas
PosicionamientoEntre GitFlow y Trunk-based, más cerca de Trunk-based
Release branchesNO — usamos tags sobre main
HotfixesBranch desde main, MR fast-track, merge back obligatorio
Frecuencia objetivoDiaria a semanal a PRD
Destino futuroTrunk-based puro (producto por producto, cuando estén listos)
Razón del modelo actualPragmático para una organización en transición