1. Importancia del versionado
Sin un sistema de versionado formal, surgen problemas recurrentes que afectan la velocidad y la confiabilidad del equipo:
- No hay trazabilidad: es imposible saber qué versión corre en cada ambiente, ni qué cambios incluye.
- No hay control de releases: cualquier push puede llegar a producción sin un punto de corte claro.
- Rollbacks a ciegas: sin tags ni versiones, revertir un deploy implica buscar commits manualmente.
- Comunicación ambigua: frases como "ya está el fix" no dicen nada sobre qué ambiente ni qué versión.
Al adoptar versionado semántico y un flujo de ramas estructurado, el equipo obtiene:
- Trazabilidad completa: cada ambiente tiene una versión concreta asociada a un tag de Git.
- Comunicación clara: "la versión 0.9.1 ya está en TEST" es una afirmación verificable.
- Rollback controlado: revertir es tan simple como desplegar el tag anterior.
- Historial auditable: cada release queda documentada con su tag, su rama y sus cambios.
2. Semantic Versioning
Nvito utiliza Semantic Versioning 2.0.0 (MAJOR.MINOR.PATCH) con reglas adaptadas al ecosistema:
Reglas de incremento
| Componente | Cuándo incrementar | Ejemplo |
|---|---|---|
| MAJOR | Breaking changes, rediseño de API, cambio de contrato incompatible. 1.0.0 marca el lanzamiento a producción. | 0.9.0 → 1.0.0 (lanzamiento oficial) |
| MINOR | Nuevo endpoint, nueva pantalla, nueva funcionalidad, nuevo módulo. Compatible hacia atrás. | 0.9.0 → 0.10.0 (nuevo módulo de pagos) |
| PATCH | Bug fix, ajuste de estilos, refactor sin cambio funcional, corrección de typos. | 0.9.0 → 0.9.1 (fix en timezone de RSVP) |
Ejemplos concretos de Nvito
| Cambio | Tipo | Versión |
|---|---|---|
Agregar endpoint POST /events/:id/addons | MINOR | 0.9.0 → 0.10.0 |
| Corregir cálculo de capacidad de invitados | PATCH | 0.9.1 → 0.9.2 |
| Rediseñar la estructura de respuesta del API de invitaciones | MAJOR | 0.9.0 → 1.0.0 |
| Agregar pantalla de galería en la PWA | MINOR | 0.3.0 → 0.4.0 |
| Ajustar padding en el badge de ambiente | PATCH | 0.8.0 → 0.8.1 |
| Refactorizar servicio de notificaciones (SRP split) | PATCH | 0.9.0 → 0.9.1 |
Mientras la versión sea 0.x.y, el API se considera inestable y los cambios de MINOR pueden incluir ajustes de contrato sin considerarse breaking. A partir de 1.0.0, los contratos son estables.
3. Versiones actuales
| Repositorio | Versión | Descripción |
|---|---|---|
| nvito-api | 0.9.0 | Backend NestJS — 374 endpoints |
| nvito-admin | 0.8.0 | Dashboard administrativo Next.js |
| nvito-invitations | 0.7.0 | Invitaciones públicas SSG/ISR |
| nvito-client | 0.5.0 | App móvil React Native + Expo |
| nvito-pwa | 0.3.0 | Progressive Web App (BFF) |
| nvito-landing | 0.2.0 | Landing page Astro |
Todas las versiones son pre-1.0.0, lo que indica que el ecosistema está en desarrollo activo previo al lanzamiento a producción.
4. Estructura de ramas (Gitflow)
Estructura de Ramas — Gitflow Nvito
PRODUCCIÓN
RAMAS PERMANENTES
RAMAS DE TRABAJO
Salen de develop — vuelven a develop
RELEASE
Sale de develop → merge a test → merge a main
HOTFIX
Sale de main → vuelve a main + develop
Tipos de rama
| Rama | Propósito | Origen | Destino | Protegida |
|---|---|---|---|---|
main | Producción estable. Solo recibe merges de release/* y hotfix/*. | — | — | Sí |
develop | Integración continua. Auto-deploy a DEV. | main | — | Sí |
feature/* | Nuevas funcionalidades. Naming en kebab-case. | develop | develop | No |
fix/* | Corrección de bugs no urgentes. | develop | develop | No |
refactor/* | Refactorización sin cambio funcional. | develop | develop | No |
release/X.Y.Z | Preparación de release. Bump de versión y QA. | develop | test → main | No |
hotfix/X.Y.Z | Fixes urgentes sobre producción. | main | main + develop | No |
Reglas de protección
mainydevelopson ramas protegidas: no se permite push directo.- Todo cambio llega vía merge request (MR) desde ramas de trabajo.
- Las ramas
feature/*,fix/*yrefactor/*se eliminan después del merge.
5. Mapeo de ramas a ambientes
Ramas → Ambientes
Ramas Git
Ambientes
| Rama | Ambiente | URLs | Deploy |
|---|---|---|---|
develop | DEV | dev-api.nvito.mx, dev-admin.nvito.mx, dev-app.nvito.mx | Automático (Coolify webhook) |
test | TEST | test-api.nvito.mx, test-admin.nvito.mx, test-app.nvito.mx | Automático (Coolify webhook) |
main | PROD | api.nvito.mx, admin.nvito.mx, app.nvito.mx | Automático (futuro) |
La rama test se mantiene como puente fijo para Coolify. Las ramas release/X.Y.Z se mergean a test para disparar el deploy automático al ambiente TEST. No se hace desarrollo directo en test.
Flujo de promoción entre ambientes
feature/* → develop → DEV (automático)
↓
release/X.Y.Z → test → TEST (automático)
↓
main → PROD (automático, futuro)
6. Flujo de release
Flujo de Release
Desarrollo
Release
Producción
Pasos del flujo
- Crear rama de release:
git checkout -b release/X.Y.Z develop - Bump de versión: actualizar
versionenpackage.jsonde cada repositorio modificado. - Commit de versión:
git commit -m "release: bump version to X.Y.Z" - Merge a test:
git checkout test && git merge release/X.Y.Z→ deploy automático a TEST. - QA y verificación: el equipo valida funcionalidad en el ambiente TEST.
- Si hay bugs: corregir en la rama
release/X.Y.Z, repetir desde el paso 4. - Merge a main:
git checkout main && git merge release/X.Y.Z+ crear tagvX.Y.Z. - Merge de vuelta:
git checkout develop && git merge release/X.Y.Zpara sincronizar. - Limpiar: eliminar la rama
release/X.Y.Z.
Comandos del flujo completo
# 1. Crear rama de release desde develop
git checkout develop
git pull origin develop
git checkout -b release/0.9.1
# 2-3. Bump de versión y commit
# (El agente nvito-version-bumper lo hace automáticamente)
npm version 0.9.1 --no-git-tag-version
git add package.json
git commit -m "release: bump version to 0.9.1"
# 4. Merge a test para deploy a TEST
git checkout test
git pull origin test
git merge release/0.9.1
git push origin test
# 5-6. QA en TEST... si hay fixes, hacerlos en release/0.9.1 y repetir
# 7. Merge a main y tag
git checkout main
git pull origin main
git merge release/0.9.1
git tag -a v0.9.1 -m "Release 0.9.1"
git push origin main --tags
# 8. Merge de vuelta a develop
git checkout develop
git merge release/0.9.1
git push origin develop
# 9. Limpiar
git branch -d release/0.9.1
git push origin --delete release/0.9.1
7. Flujo de hotfix
Cuando se detecta un bug crítico en producción que no puede esperar al siguiente release:
Pasos
- Crear rama de hotfix:
git checkout -b hotfix/X.Y.Z main - Corregir el bug: implementar la corrección mínima necesaria.
- Bump de versión PATCH: incrementar solo el tercer número.
- Merge a main + tag:
git merge hotfix/X.Y.Z+git tag vX.Y.Z. - Merge a develop: sincronizar la corrección con la rama de integración.
Comandos
# 1. Crear hotfix desde main
git checkout main
git pull origin main
git checkout -b hotfix/0.9.2
# 2. Corregir el bug
# ... implementar fix ...
# 3. Bump versión
npm version 0.9.2 --no-git-tag-version
git add package.json
git commit -m "hotfix: fix critical RSVP timezone calculation"
# 4. Merge a main
git checkout main
git merge hotfix/0.9.2
git tag -a v0.9.2 -m "Hotfix 0.9.2 — fix RSVP timezone"
git push origin main --tags
# 5. Merge a develop
git checkout develop
git merge hotfix/0.9.2
git push origin develop
# Limpiar
git branch -d hotfix/0.9.2
git push origin --delete hotfix/0.9.2
Un hotfix siempre incrementa solo el PATCH. Si el fix requiere cambios significativos, debe hacerse como release normal desde develop.
8. Ciclo de vida de una versión
Ciclo de Vida de una Versión
test→devfix y re-deployCada versión pasa por cuatro estados:
| Estado | Descripción | Ambiente | Quién valida |
|---|---|---|---|
| Draft | La versión se crea con el bump en package.json. Existe solo en la rama. | — | Desarrollador |
| En DEV | La versión se despliega automáticamente al ambiente de desarrollo. | DEV | Equipo de desarrollo |
| En TEST | La versión se despliega al ambiente de QA para validación formal. | TEST | QA + stakeholders |
| Producción | La versión se despliega a producción con su tag vX.Y.Z. | PROD | Usuarios finales |
Transiciones
- Draft → En DEV: automático al hacer push a
develop. - En DEV → En TEST: manual al mergear
release/X.Y.Zatest. - En TEST → Producción: manual al mergear a
maindespués de aprobación de QA. - En TEST → En DEV (rollback): si se encuentra un bug, se corrige y se re-despliega.
9. Naming conventions
| Elemento | Formato | Ejemplo |
|---|---|---|
| Feature branch | feature/descripcion-kebab | feature/guest-capacity-bar |
| Fix branch | fix/descripcion-kebab | fix/rsvp-timezone-offset |
| Refactor branch | refactor/descripcion-kebab | refactor/notification-channels-srp |
| Release branch | release/X.Y.Z | release/0.9.1 |
| Hotfix branch | hotfix/X.Y.Z | hotfix/0.9.2 |
| Tag de versión | vX.Y.Z | v0.9.1 |
| Commit de release | release: bump version to X.Y.Z | release: bump version to 0.9.1 |
| Commit de hotfix | hotfix: descripción corta | hotfix: fix critical RSVP timezone calculation |
| Commit de feature | feat: descripción corta | feat: add guest capacity bar component |
| Commit de fix | fix: descripción corta | fix: correct timezone offset in RSVP |
| Commit de refactor | refactor: descripción corta | refactor: split notification service (SRP) |
Los nombres de rama siempre usan kebab-case en la parte descriptiva. Nunca usar camelCase, PascalCase ni espacios.
10. Agente nvito-version-bumper
El ecosistema Nvito cuenta con un agente automático que gestiona el versionado de forma inteligente:
Funcionamiento
- Se ejecuta al pre-cierre de cada sesión de desarrollo como parte del flujo de agentes.
- Analiza los cambios realizados en la sesión: archivos modificados, tipos de commit, módulos afectados.
- Determina automáticamente el tipo de incremento:
- Nuevos archivos de servicio, controlador o pantalla → MINOR
- Modificaciones a archivos existentes sin cambio de API → PATCH
- Cambios en contratos de API o modelos de datos → potencial MAJOR
- Actualiza
package.jsonde cada repositorio modificado en la sesión. - MAJOR siempre requiere confirmación explícita del usuario antes de aplicarse.
Criterios de decisión
| Indicador | Tipo | Justificación |
|---|---|---|
| Nuevo endpoint en controller | MINOR | Nueva funcionalidad expuesta |
| Nuevo componente de pantalla | MINOR | Nueva funcionalidad visible |
| Nuevo módulo NestJS | MINOR | Nueva capacidad del sistema |
| Fix en servicio existente | PATCH | Corrección sin cambio de interfaz |
| Refactor de código interno | PATCH | Sin impacto funcional |
| Ajuste de estilos CSS | PATCH | Sin impacto funcional |
| Cambio en DTO existente (breaking) | MAJOR | Rompe contratos existentes |
| Migración de BD con columnas eliminadas | MAJOR | Cambio destructivo |
El agente nunca aplica un incremento MAJOR sin confirmación. Si detecta un posible breaking change, presenta los cambios al usuario y solicita aprobación explícita.
11. Badge de ambiente en el admin
El dashboard administrativo (nvito-admin) muestra un badge de ambiente en el header que indica el ambiente actual y la versión desplegada.
Comportamiento
- Solo visible en ambientes no-producción: LOCAL, DEV y TEST. En producción no se muestra.
- Muestra el nombre del ambiente más la versión actual del
package.json. - Click para ver detalles: al hacer click, despliega un popover con versión, ambiente y URL del API.
Colores por ambiente
| Ambiente | Color | Código | Estilo |
|---|---|---|---|
| LOCAL | Gris | — | Fondo gris con borde punteado |
| DEV | Azul complementario | #005587 | Fondo sólido con texto blanco |
| TEST | Naranja | #F17F3A | Fondo sólido con texto blanco |
| PROD | — | — | No se muestra badge |
Configuración
La variable de entorno que controla el ambiente es:
NEXT_PUBLIC_APP_ENV=local # local | dev | test | production
La versión se inyecta automáticamente desde package.json en build time, lo que garantiza que siempre refleja la versión exacta del código desplegado.
// next.config.ts (simplificado)
const packageJson = require('./package.json');
const nextConfig = {
env: {
NEXT_PUBLIC_APP_VERSION: packageJson.version,
},
};
12. Referencia rápida
Comandos más usados
| Acción | Comando |
|---|---|
| Crear feature | git checkout -b feature/mi-feature develop |
| Crear fix | git checkout -b fix/mi-fix develop |
| Crear release | git checkout -b release/X.Y.Z develop |
| Crear hotfix | git checkout -b hotfix/X.Y.Z main |
| Bump de versión | npm version X.Y.Z --no-git-tag-version |
| Crear tag | git tag -a vX.Y.Z -m "Release X.Y.Z" |
| Push con tags | git push origin main --tags |
| Ver tags | git tag --list 'v*' --sort=-version:refname |
| Ver versión actual | node -p "require('./package.json').version" |
Checklist de release
- Todos los tests pasan en la rama
release/X.Y.Z - Build exitoso sin errores de TypeScript
- Versión actualizada en
package.json - Commit de release con formato
release: bump version to X.Y.Z - Merge a
testexitoso, deploy verificado en TEST - QA aprobado en ambiente TEST
- Merge a
mainrealizado - Tag
vX.Y.Zcreado y pusheado - Merge de vuelta a
developcompletado - Rama
release/X.Y.Zeliminada (local y remota)
Checklist de hotfix
- Bug crítico confirmado en producción
- Rama
hotfix/X.Y.Zcreada desdemain - Corrección implementada y testeada
- Versión PATCH incrementada
- Merge a
main+ tagvX.Y.Z - Merge a
developpara sincronizar - Rama
hotfix/X.Y.Zeliminada