Ir al contenido

Estructura de Repositorios GitLab

La estructura de repositorios en HERA sigue una Jerarquia centrada en producto (Product-Centric Hierarchy): el producto digital es la entidad permanente, las versiones son reemplazables, y la operacion productiva no se rompe al cambiar de equipo, tecnologia o partner.


HERA resuelve las preocupaciones de 5 roles con esta jerarquía:

RolProblema que resuelve
Arquitecto de SolucionesEstructura predecible para microservicios, contratos entre productos y evolución tecnológica sin deuda estructural
Ingeniero DevOpsHerencia de pipelines, flujo de ambientes claro y templates CI/CD reutilizables desde un punto central
Líder de SeguridadControl de acceso por capa, compliance heredado, clasificación de datos y secret scanning uniforme
Líder de ProyectoTrazabilidad equipo-producto-versión, SLAs contractuales y ciclo de vida documentado
Administrador GitLabGrupos jerárquicos con herencia de permisos, push rules y approval rules propagadas automáticamente

HERA organiza la taxonomía en 5 niveles bajo el root group grupo-herdez/, con tres pilares de primer nivel: productos, plataforma y partners.

Jerarquía de Grupos GitLab
HERA Standard
Estructura de 5 niveles: RootDominioProductoVersiónRepos
ROOT NIVEL 1 DOMINIO PRODUCTO VERSIÓN REPO SHARED
grupo-herdez/ ROOT GROUP
│
├── products/ NIVEL 1 — Agrupador de productos digitales
│   │
│   ├── ecommerce/ DOMINIO — Dominio de negocio
│   │   │
│   │   ├── tienda-herdez/ PRODUCTO — Identidad del producto
│   │   │   ├── v1-partner-alpha/ VERSIÓN — Built by Partner Alpha
│   │   │   │   ├── frontend REPO
│   │   │   │   ├── bff-api REPO
│   │   │   │   └── .gitlab-ci.yml 
│   │   │   │
│   │   │   ├── v2-partner-beta/ VERSIÓN — Built by Partner Beta ★ activo
│   │   │   │   ├── frontend-next REPO
│   │   │   │   ├── graphql-gateway REPO
│   │   │   │   └── checkout-service REPO
│   │   │   │
│   │   │   └── _shared/ SHARED — Recursos compartidos
│   │   │       ├── iac-infra REPO
│   │   │       └── product-manifest.yml 
│   │   │
│   │   └── marketplace-b2b/ PRODUCTO
│   │
│   ├── marketing/ DOMINIO
│   └── supply-chain/ DOMINIO
│
├── platform/ NIVEL 1 — Infraestructura transversal
│   ├── iac/ IAC CORE
│   ├── ci-cd/ PIPELINES
│   └── docs/ DOCUMENTACIÓN
│
└── partners/ NIVEL 1 — Registro de Partners
    ├── partner-alpha/ 
    └── partner-beta/ 
Mensaje clave 5 niveles: grupo-herdez → dominio → producto → versión → repositorios. El producto es la entidad permanente.

El producto es la unidad fundamental de la taxonomía. No es un repositorio ni un namespace temporal — es la identidad permanente que:

  • Tiene una URL productiva asignada (ej. tienda.herdez.com).
  • Posee un namespace de Kubernetes fijo en cada ambiente.
  • Acumula historial de versiones, decisiones arquitectónicas y documentación.
  • Sobrevive a cualquier cambio de partner, tecnología o equipo.
Producto como Entidad Primaria
Product-Centric
El producto es la unidad fundamental: identidad permanente, URL fija, namespace propio. Las versiones son reemplazables.
PRODUCTO VERSION EXPERIENCE DOMAIN INTEGRATION PLATFORM SHARED CONFIG
grupo-herdez/products/ecommerce/tienda-herdez/ PRODUCTO
│
├── v1-partner-alpha/ VERSION — Primera version (archivada)
│
├── v2-partner-beta/ VERSION — Version activa 
│   ├── frontend-web-store             EXP — Experience Layer
│   ├── bff-mobile-app                 EXP — Experience Layer
│   ├── experience-checkout-journey    EXP — Experience Layer
│   ├── backend-checkout-service       DOM — Domain Layer
│   ├── backend-inventory-service      DOM — Domain Layer
│   ├── data-catalog-search            DOM — Domain Layer
│   ├── integration-sap-orders         INT — Integration Layer
│   ├── event-consumer-orders          INT — Integration Layer
│   └── worker-loyalty-points          INT — Integration Layer
│
└── _shared/ CROSS-VERSION — Recursos que trascienden versiones
    ├── infra-terraform-modules        PLAT — Platform Layer
    ├── docs-architecture-decisions    PLAT — Platform Layer
    └── product-manifest.yml           META — Metadata del producto
URL productiva tienda.herdez.com
Namespace K8s tienda-herdez (permanente)
Version activa v2-partner-beta
Identidad Sobrevive cambios de partner y tecnologia
Mensaje clave El producto es permanente. Los partners y versiones cambian. La URL productiva nunca se rompe.

Los productos se agrupan bajo dominios de negocio, no por tecnología ni por equipo. Esto refleja la estructura organizacional y facilita la gobernanza, el FinOps y la atribución de costos:

DominioDescripciónProductos ejemplo
ecommerce/Comercio electrónico y venta digitaltienda-herdez, marketplace-b2b
marketing/Presencia digital y campañassitio-corporativo, landing-campaigns
supply-chain/Cadena de suministro y logísticaportal-proveedores, tracking-app
sitios/Sitios institucionales y de marcasitio-barcel, sitio-donamaria
integracion/APIs y servicios de integraciónapi-pagos, api-inventario
cms/Gestores de contenidocms-corporativo, cms-marcas
datos/Productos de datos y analíticadatalake-ventas, bi-reportes
apps/Aplicaciones móviles y de escritorioapp-vendedores, app-rrhh
shared-services/Servicios compartidos cross-dominioauth-service, notification-svc

HERA clasifica cada repositorio con atributos obligatorios. El equipo registra esta metadata en el product-manifest.yml y el pipeline la replica como labels de GitLab en cada proyecto:

AtributoValores permitidosPropósito
Dominiositios, integracion, cms, ecommerce, datos, apps, shared-services, supply-chain, marketingAgrupación por área de negocio
Tipo_Productositio, api, cms, ecommerce, data-product, app, shared-serviceNaturaleza del producto
Marcagrupo-herdez, barcel, donamaria, corporativo, internoMarca propietaria
Partner_Equipointerno, {nombre-partner}, partner-tecnologicoQuién construye/mantiene
Estado_Implementacioncandidate, active-dev, active-qa, active-prd, legacy, retiredCiclo de vida actual
AtributoValores permitidosPropósito
Repo_Tipofrontend, backend, bff, cms, infra, helm, docsTipo técnico del repositorio
Criticidadlow, medium, high, criticalNivel de impacto al negocio
Clasificacion_Datospublic, internal, confidential, restrictedSensibilidad de datos manejados
AtributoValores permitidosPropósito
Pipeline_Modelocentralizado-hera-ciModelo de ejecución CI/CD
Pipeline_Template/base/base-service.yml, /base/base-infra.yml, /base/base-docs.ymlTemplate CI/CD heredado
Sonar_OrggrupoherdezOrganización en SonarQube
Sonar_Project_Keygrupoherdez_<dominio>_<producto>_<implementacion>_<repo-name>Project Key único en SonarQube — ver Convención de Project Key en SonarQube
GCP_Project_DEVghdz-<tenant>-<capability>-dev (ej. ghdz-grupo-ext-sites-dev)GCP project del entorno DEV
GCP_Project_QAghdz-<tenant>-<capability>-qaGCP project del entorno QA
GCP_Project_PRDghdz-<tenant>-<capability>-prdGCP project del entorno PRD
Cluster_DEVCluster GKE dentro de GCP_Project_DEVCluster GKE de desarrollo
Cluster_QACluster GKE dentro de GCP_Project_QACluster GKE de pruebas
Cluster_PRDCluster GKE dentro de GCP_Project_PRDCluster GKE de producción
_shared/product-manifest.yml
product:
name: "tienda-herdez"
domain: "ecommerce"
brand: "grupo-herdez"
owner:
tech_lead: "jperez@grupoherdez.com"
product_owner: "mgarcia@grupoherdez.com"
active_version: "v2-partner-beta"
partner: "partner-beta"
state: "active-prd"
classification:
criticality: "critical"
data_classification: "confidential"
product_type: "ecommerce"
urls:
dev: "tienda.dev.hera.cloudherdez.com"
qa: "tienda.qa.hera.cloudherdez.com"
prd: "tienda.herdez.com"
infrastructure:
pipeline_template: "/base/base-service.yml"
pipeline_model: "centralizado-hera-ci"
sonar_org: "grupoherdez"
# GCP projects por entorno
gcp_project_dev: "ghdz-grupo-ext-sites-dev"
gcp_project_qa: "ghdz-grupo-ext-sites-qa"
gcp_project_prd: "ghdz-grupo-ext-sites-prd"
# Clusters GKE (según estándar gke-<capability>-<env>)
cluster_dev: "gke-apps-dev"
cluster_qa: "gke-apps-qa"
cluster_prd: "gke-apps-prd-01"
# GCP Service Account (GSA) para Workload Identity
gsa_name: "gsa-tienda-herdez-backend-checkout"
# K8s namespace — invariante entre entornos, versiones y partners
namespace: "tienda-herdez"
sla:
response_time: "4h"
resolution_time: "24h"
availability: "99.9%"

Cada servicio tiene un Project Key único en SonarQube que se deriva de los atributos del repositorio declarados arriba (Sonar_Org, dominio, producto, implementación y nombre del repo). Este Project Key es el identificador con el que el pipeline sube resultados de análisis y con el que se aplican los Quality Gates.

grupoherdez_<dominio>_<producto>_<implementacion>_<repo-name>
ComponenteDescripciónEjemplo
grupoherdezPrefijo fijo del ecosistema (coincide con Sonar_Org)grupoherdez
<dominio>Dominio de negocio (ecommerce, marketing, supply-chain)ecommerce
<producto>Producto digitaltienda-herdez
<implementacion>Versión + partner que la construye (subgrupo de GitLab)v2-partner-beta
<repo-name>Nombre del repo con su prefijo de tipobackend-checkout-service
grupoherdez_ecommerce_tienda-herdez_v2-partner-beta_backend-checkout-service
grupoherdez_ecommerce_tienda-herdez_v2-partner-beta_bff-mobile-app
grupoherdez_ecommerce_tienda-herdez_v2-partner-beta_frontend-web-store
grupoherdez_marketing_corporate-site_v1-internal-team_cms-corporate-site
grupoherdez_supply-chain_supplier-portal_v1-partner-alpha_integration-sap-orders
  • Filtrado por dimensión — encuentra todos los backend services del dominio ecommerce.
  • Quality gates por tipo — define umbrales distintos para frontend vs. backend.
  • FinOps por dominio — agrega costos de calidad por área de negocio.
  • Auditoría multi-nivel — trazabilidad completa producto → versión → tipo → repo.

Cada versión de un producto se representa como un subgrupo con la convención v{N}-{partner}:

  1. Solo una versión activa a la vez por producto en producción.
  2. Las versiones anteriores se archivan en GitLab (read-only) una vez completada la migración.
  3. El nombre incluye el partner para trazabilidad contractual y auditoría.
  4. La versión activa se declara en product-manifest.yml, no por convención de nombres.
  5. El estado de implementación (candidateactive-devactive-qaactive-prdlegacyretired) se actualiza en el manifiesto conforme avanza el ciclo.
EstadoSignificadoAcciones permitidas
candidateVersión propuesta, aún no iniciadaCreación de subgrupo y repos vacíos
active-devEn desarrollo activoPush, MR, CI a DEV
active-qaEn pruebas de calidadCI a QA, no se aceptan features nuevas
active-prdVersión en producciónCD a PRD con aprobación, solo hotfixes
legacyVersión anterior, archivadaRead-only, consulta de código
retiredDada de baja permanentementeArchivado completo

El namespace de Kubernetes se deriva directamente de la identidad del producto, no de la versión:

ConceptoValorPermanencia
Namespace Kubernetestienda-herdezPermanente
URL productivatienda.herdez.comPermanente
Versión activav2-partner-betaCambia con cada rebuild
Branch de desplieguemain (del repo activo)Por versión

Esto garantiza que cuando se migra de v1 a v2, la URL no cambia, el namespace no cambia, y los certificados TLS, DNS y balanceadores permanecen intactos.


Resolución del Flujo de Ambientes (DEV/QA vs PRD)

Sección titulada «Resolución del Flujo de Ambientes (DEV/QA vs PRD)»

El flujo de ambientes se resuelve a nivel de rama + pipeline, no a nivel de grupo GitLab:

# Branch: develop → Despliega a DEV y QA (automático)
# Branch: main → Despliega a PRD (requiere aprobación)
#
# El namespace de K8s es el mismo en los 3 ambientes:
# DEV: tienda-herdez (en GCP project ghdz-grupo-ext-sites-dev)
# QA: tienda-herdez (en GCP project ghdz-grupo-ext-sites-qa)
# PRD: tienda-herdez (en GCP project ghdz-grupo-ext-sites-prd)
AmbienteTriggerGCP ProjectAprobación
DEVMerge a developghdz-<tenant>-<capability>-devAutomático
QAMerge a developghdz-<tenant>-<capability>-qaAutomático
PRDMerge a mainghdz-<tenant>-<capability>-prdTech Lead + QA Lead + PO

El subgrupo _shared/ dentro de cada producto contiene los recursos que trascienden versiones:

RecursoPropósitoPersiste entre versiones
iac-infraTerraform: namespace, secrets, ingress, DBSi
docsADRs, runbooks, diagramas, post-mortemsSi
product-manifest.ymlMetadata completa del productoSi

El grupo platform/ contiene recursos transversales a todos los productos:

SubgrupoContenidoConsumidores
iac/Módulos Terraform reutilizables, políticas GCP, configuraciones base KubernetesTodos los _shared/iac-infra
ci-cd/Templates de pipelines, configuración de runners, scanners de seguridadTodos los repositorios
observability/Dashboards de Grafana/Datadog, reglas de alertingSRE y Tech Leads
docs/HERA Handbook, guías de onboardingToda la organización

HERA define 13 categorías oficiales de servicios agrupadas en 4 capas estratégicas. Esta tabla cubre los aspectos operativos (cómo nombrar el repo, qué pipeline usar). Para entender qué es cada categoría conceptualmente, cuándo usarla, ejemplos y beneficios, consulta la página dedicada:

➡️ Clasificación de Servicios — Referencia oficial

<tipo>-<detalle>

No repetir el producto en el nombre del repo — la jerarquía del grupo GitLab ya lo provee.

CapaCategoríaConvención de nombrePipeline templateEjemplo
Experiencefrontendfrontend-{detalle}/base/base-service.ymlfrontend-web-store
Experiencebffbff-{canal}/base/base-service.ymlbff-mobile-app
Experienceexperienceexperience-{journey}/base/base-service.ymlexperience-checkout-journey
Domainbackendbackend-{dominio}-service/base/base-service.ymlbackend-checkout-service
Domaindatadata-{dominio}-{función}/base/base-service.ymldata-catalog-search
Domaincmscms-{tipo-contenido}/base/base-service.ymlcms-marketing-content
Integrationintegrationintegration-{sistema}-{función}/base/base-service.ymlintegration-sap-orders
Integrationeventevent-{rol}-{dominio}/base/base-service.ymlevent-consumer-orders
Integrationworkerworker-{función}/base/base-service.ymlworker-loyalty-points
Platformplatformplatform-{capacidad}/base/base-service.ymlplatform-auth-service
Platformedgeedge-{tecnología}-{función}/base/base-edge.ymledge-apigee-config
Platforminfrainfra-{tecnología}-{scope}/base/base-infra.ymlinfra-terraform-modules
Platformdocsdocs-{contenido}/base/base-docs.ymldocs-architecture-decisions

Los permisos en GitLab se configuran por nivel de grupo y se heredan hacia abajo. Esta estrategia garantiza el principio de mínimo privilegio:

NivelRol GitLabQuiénPermisos clave
grupo-herdez/ (Root)OwnerAdministradores HERAConfiguración global, compliance, push rules
products/{dominio}/MaintainerTech Lead del dominioGestión de productos del dominio, approval rules
{producto}/MaintainerTech Lead del productoGestión de versiones, _shared/
{producto}/{version}/DeveloperEquipo de DesarrolloPush a feature branches, crear MR
platform/MaintainerEquipo de plataforma HERAIaC, templates CI/CD, observabilidad
partners/ReporterPartners de Desarrollo (solo lectura de su perfil)Consulta de metadata y estándares

Gobierno Operacional: El Compliance Framework

Sección titulada «Gobierno Operacional: El Compliance Framework»

Cada producto hereda automáticamente las políticas de gobernanza HERA a través del Compliance Framework de GitLab:

ControlImplementaciónNivel de aplicación
Pipeline obligatorioTemplate CI/CD vía include desde platform/ci-cd/Producto
Branch protectionmain protegida, merge solo vía MR aprobadoRepositorio
Approval rulesMínimo 1 Tech Lead + 1 QA para merge a mainRepositorio
Secret scanningHabilitado globalmente, bloquea push con secretosGrupo root
SAST / SCAEjecutado en cada pipeline, Quality Gate obligatorioPipeline
Container scanningAnálisis de vulnerabilidades en imágenes DockerPipeline
Tagging obligatorioLabels: domain, product_type, brand, criticality, data_classificationProyecto
Push rulesProhibido push a main y develop directamenteGrupo root
Clasificación de datosValidada contra product-manifest.yml en cada desplieguePipeline

Estrategia de Mantenibilidad: El Update Cycle

Sección titulada «Estrategia de Mantenibilidad: El Update Cycle»

Cuando un partner entrega una nueva versión

Sección titulada «Cuando un partner entrega una nueva versión»
  1. Se crea el subgrupo vN-partner-nuevo/ con estado candidate.
  2. El equipo desarrolla y el estado avanza: active-devactive-qaactive-prd.
  3. Se actualiza _shared/product-manifest.yml con la nueva versión activa.
  4. Se ejecuta el pipeline de _shared/iac-infra para apuntar la infraestructura a los nuevos artefactos.
  5. La versión anterior cambia a estado legacy y se archiva (read-only en GitLab).
  6. El namespace, URL e ingress permanecen sin cambios.
  1. Se archivan todos los subgrupos de versión (estado retired).
  2. Se ejecuta terraform destroy desde _shared/iac-infra para limpiar recursos cloud.
  3. La documentación relevante se preserva en _shared/docs como registro histórico.
  4. El grupo del producto permanece como archivo (nunca se elimina).

El grupo partners/ mantiene un directorio centralizado de todos los partners de desarrollo y equipos que participan en el ecosistema HERA:

partners/partner-beta/partner-profile.yml
name: "Partner Beta"
type: "external"
contact:
tech_lead: "lead@partner-beta.com"
account_manager: "cuenta@partner-beta.com"
escalation: "cto@partner-beta.com"
contract:
start_date: "2024-06-01"
sla_response: "4h"
sla_resolution: "24h"
review_cycle: "trimestral"
products_assigned:
- product: "grupo-herdez/products/ecommerce/tienda-herdez"
version: "v2-partner-beta"
state: "active-prd"
- product: "grupo-herdez/products/supply-chain/portal-proveedores"
version: "v1-partner-beta"
state: "active-qa"
standards:
coding_standards_repo: "partners/partner-beta/coding-standards"
approved_languages: ["typescript", "python", "go"]
approved_frameworks: ["next.js", "fastapi", "gin"]

DimensiónBeneficio
Continuidad operativaCambiar de partner no rompe URLs, namespaces ni infraestructura
TrazabilidadCada línea de código tiene contexto: producto, versión, partner, dominio y marca
GobernanzaPolíticas heredadas automáticamente — compliance by design
FinOpsCostos atribuibles por producto, dominio, marca y versión mediante labels de GCP
SeguridadClasificación de datos, secret scanning y SAST aplicados uniformemente
EscalabilidadAgregar un nuevo producto o dominio es crear un subgrupo — sin reconfiguración
AuditoríaHistorial inmutable: versiones archivadas, nunca eliminadas
OnboardingEstructura predecible: cualquier ingeniero sabe dónde encontrar cualquier cosa
Multi-marcaUn mismo dominio puede contener productos de distintas marcas del grupo
Control de accesoPermisos heredados por nivel jerárquico con principio de mínimo privilegio