Trunk-Based Development
Trunk-Based Development (TBD) es una estrategia de control de versiones donde los desarrolladores colaboran en una única rama principal (trunk/main) haciendo commits pequeños y frecuentes.
Puntos importantes
Trunk-Based Development (TBD) se apalanca en una rama de larga duración (trunk o main) sobre la cual se articula todo el ciclo de desarrollo: procesos, ambientes, cambios, rollbacks y despliegues se orquestan siempre a partir de esta rama principal.
En TBD, los pull requests se gestionan mediante ramas feature efímeras, clonadas desde el trunk. Estas ramas tienen un ciclo de vida corto, se integran rápidamente y evitan la proliferación de ramas de larga duración, reduciendo complejidad y conflictos de integración.
A partir de los commits en trunk se generan artefactos versionados (por ejemplo, imágenes Docker, JAR, etc.) que se promueven a los distintos ambientes (DEV, QA, UAT y PROD). Para ello se utilizan tags asociados a esos commits, que versionan entregables específicos y habilitan una trazabilidad clara de cada despliegue dentro del ciclo de vida de desarrollo.
Este modelo demanda un nivel elevado de disciplina y madurez técnica del equipo, dado que todos trabajan sobre la misma rama y deben mantenerla en estado constante de “listo para desplegar”, respaldada por integración continua y validaciones automatizadas.
En contextos de alta demanda de producto, donde se requieren liberaciones frecuentes o incluso diarias, TBD habilita una promoción ágil y eficiente de cambios, incrementando velocidad, efectividad y calidad sobre una única rama, una única aplicación y un objetivo común.
La promoción entre ambientes se ejecuta a partir de tags creados sobre main y vinculados a un artefacto específico, los cuales actúan como identificadores únicos de la versión y se despliegan de forma consistente a lo largo de toda la cadena de entornos.
Principios Fundamentales
- Una rama principal: Todo el código converge en
mainotrunk - Commits frecuentes: Integración diaria o incluso varias veces al día
- Ramas de vida corta: Si se usan, duran menos de 24 horas
- Feature flags: Para código no listo sin bloquear integraciones
- CI/CD obligatorio: Tests automáticos en cada commit
Independencia: Versionamiento vs Despliegue
⚠️ IMPORTANTE: El flujo de versionamiento del código (TBD) NO afecta el flujo de despliegue a ambientes.
Versionamiento vs Flujo de Despliegue
Separación de responsabilidades
Beneficios de TBD
✅ Para Desarrollo
- Menos conflictos: Integraciones frecuentes evitan merge hell
- Feedback rápido: CI/CD detecta problemas en minutos
- Simplicidad: Sin gestión compleja de ramas
- Colaboración: Todo el equipo ve el código actualizado
✅ Para CI/CD
- Continuous Integration real: Tests en cada commit
- Deployment más simple: Siempre desde
main - Rollback fácil: Solo revertir commit en
main - Pipeline lineal: Sin esperar merges de múltiples ramas
✅ Para el Negocio
- Time to market: Features a producción más rápido
- Menor riesgo: Cambios pequeños son más seguros
- Calidad: Tests obligatorios en cada integración
Estrategias de Release con TBD
Descripción:
- Despliegues a PROD en fechas fijas (ej: viernes cada semana)
- Los commits van a
maincontinuamente - Solo lo que está en
mainel viernes va a PROD
Release on Demand (Bajo Demanda)
Descripción:
mainsiempre está listo para producción- Deployamos cuando queramos/necesitemos
- Requiere Feature Flags para funcionalidades incompletas
Continuous Deployment (Despliegue Continuo)
Descripción:
- Cada commit a
mainva automáticamente a PROD - Requiere alta madurez en tests y monitoring
- Feature Flags obligatorios
Feature Flags en TBD
¿Por qué son esenciales?
Problema sin Feature Flags:
// Código a medio hacer va a main y se despliega
function newFeature() {
// TODO: implementar validación
// TODO: manejar errores
saveToDatabase(data); // PELIGRO: incompleto en PROD
}
Solución con Feature Flags:
function processCheckout() {
if (featureFlags.isEnabled('new-checkout-flow')) {
return newCheckoutFlow(); // Solo para beta users
}
return oldCheckoutFlow(); // Usuarios normales
}
Tipos de Feature Flags
- Release Flags: Ocultar features incompletas
- Experiment Flags: A/B testing
- Ops Flags: Circuit breakers, kill switches
- Permission Flags: Features por roles
Consideraciones para el Equipo
- Commits pequeños y frecuentes
- Tests obligatorios
- Uso de feature flags
- Pull Requests rápidos (menos de 2 horas de review)
Mejores Prácticas
✅ DO's
- Commit al menos una vez al día a
main - Escribe tests antes de cada commit
- Usa feature flags para trabajo en progreso
- Reviews rápidos de PR (menos de 2 horas)
- Mantén
mainsiempre desplegable
❌ DON'Ts
- No crear ramas de larga vida (más de 24 horas)
- No hacer commits grandes (más de 500 líneas)
- No pushear código sin tests
- No esperar días para integrar
- No confundir versionamiento con despliegue
Herramientas Recomendadas
Feature Flags
- LaunchDarkly: Solución empresarial completa
- Unleash: Open source, self-hosted
- Flagsmith: Open source con cloud option
- ConfigCat: Sencillo y económico
CI/CD
- GitHub Actions: Integrado con GitHub
- GitLab CI: Pipelines poderosos
- Jenkins: Flexible y extensible
- CircleCI: Rápido y confiable
Monitoreo
- Datadog: Observability completa
- New Relic: APM y monitoring
- Sentry: Error tracking
- Prometheus + Grafana: Open source
Conclusión
Trunk-Based Development simplifica el versionamiento del código mientras permite mantener cualquier flujo de despliegue (DEV → QA → UAT → PROD). La clave está en:
- Separar conceptos: Versionamiento ≠ Despliegue
- Feature Flags: Para desarrollo seguro e incremental
- CI/CD robusto: Tests automáticos obligatorios
- Cultura de equipo: Commits frecuentes y reviews rápidos
El resultado: código más limpio, menos conflictos, y entregas más rápidas.