0018. Estrategia general de versionado¶
Fecha: 2026-09-08 Estado: Propuesto Módulo(s) afectado(s): transversal, API, móvil, web y escritorio
Contexto¶
Versionar no es asignar un número a cada despliegue: es comunicar a quienes consumen un componente qué pueden esperar al actualizarlo. Sin una regla común, un cambio pequeño puede romper una integración, obligar a actualizar una app sin aviso o dejar versiones antiguas sin una fecha clara de retiro.
Esta decisión define por qué, cuándo y cómo se versionan los componentes del ecosistema. El detalle del contrato REST y de su validación en CI se encuentra en los ADR 0016 y 0017, respectivamente.
Decisión¶
Se adopta Versionado Semántico (SemVer) para las versiones publicadas de aplicaciones, librerías y contratos:
MAJOR.MINOR.PATCH
2 . 4 . 1
La versión describe el impacto para el consumidor, no el tamaño del cambio ni
el número de tickets incluidos. Todo componente público comienza en 1.0.0;
0.x.y queda reservado para prototipos que aún no tengan consumidores ni
compromiso de compatibilidad.
Por qué versionamos¶
- Proteger a los consumidores: permite saber si actualizar puede requerir cambios en código, configuración o datos.
- Desplegar con control: hace posible identificar rápidamente qué artefacto está en producción y volver a uno anterior si es necesario.
- Planificar migraciones: una versión mayor nueva crea un periodo explícito de convivencia, comunicación y retiro de la versión anterior.
- Tener trazabilidad: incidentes, notas de entrega, binarios y contratos se pueden relacionar con una versión concreta.
Cuándo incrementar la versión¶
| Cambio realizado | Incremento | Ejemplos |
|---|---|---|
| Rompe un uso documentado o exige una migración | MAJOR |
eliminar o renombrar endpoint/campo público; cambiar un tipo; requerir un campo antes opcional; retirar una funcionalidad; cambiar comportamiento esperado por clientes |
| Añade capacidad compatible | MINOR |
endpoint nuevo; campo opcional en una respuesta; pantalla o función nueva; permiso o configuración opcional nuevos |
| Corrige sin alterar el contrato | PATCH |
corrección de cálculo, seguridad o rendimiento; ajuste visual; mensaje de error más claro; corrección interna |
| Solo cambia implementación o documentación | sin incremento público obligatorio | refactor interno, pruebas, CI, documentación; se publica una nueva compilación solo si el proceso de despliegue lo requiere |
Ante la duda, se evalúa desde el punto de vista del consumidor: si una
integración que funcionaba con la versión anterior puede fallar o necesita
cambios, es un MAJOR. No se usa un PATCH para introducir una ruptura con
el fin de evitar una versión mayor.
Cómo versionar por tipo de componente¶
APIs REST¶
- Toda API se expone bajo
/api/v<major>/, por ejemplo/api/v1/pedidosy/api/v2/pedidos. - La versión en la ruta cambia solo ante cambios rompedores del contrato. Los cambios MINOR y PATCH permanecen en la misma ruta mientras sean compatibles hacia atrás.
- El documento OpenAPI publica la versión del contrato y se verifica en CI. Los criterios concretos y los contract tests son los de los ADR 0016 y 0017.
Ejemplo: añadir observaciones opcional a GET /api/v1/pedidos/{id} es
compatible y mantiene v1. Renombrar cantidad a cantidad_facturable
requiere publicar /api/v2/... y mantener v1 durante la migración.
Aplicaciones móviles y de escritorio¶
- El binario se etiqueta con SemVer y se registra también un número de build ascendente para las tiendas o la distribución interna.
- Antes de una versión MAJOR, se publican instrucciones de migración y se define la versión mínima soportada por el backend.
- La aplicación consulta al inicio una política de versión mínima. Se usa actualización obligatoria únicamente cuando una versión antigua presenta un riesgo de seguridad, corrupción de datos o ya no puede comunicarse con una API soportada. Para nuevas funcionalidades compatibles se prefiere la actualización recomendada, no el bloqueo.
Aplicaciones web¶
- Cada artefacto desplegable lleva SemVer, etiqueta Git y notas de entrega, aunque el usuario reciba la actualización automáticamente.
- Un despliegue debe conservar la posibilidad de rollback al artefacto anterior. Si el frontend y una API cambian de forma incompatible, primero se publica la API nueva y se mantiene la anterior durante la transición.
- Los cambios visibles pero compatibles son MINOR; las correcciones son PATCH. Un MAJOR aplica cuando cambia una integración, una configuración pública o una experiencia que requiere migración explícita de clientes administrados.
Librerías, SDK y paquetes compartidos¶
- Se publica una nueva versión para todo cambio disponible a otros proyectos.
- El rango de dependencias debe permitir PATCH/MINOR compatibles según el gestor usado, pero no actualizar automáticamente un MAJOR.
- Una API marcada como obsoleta sigue disponible al menos durante un MINOR antes de eliminarse en el siguiente MAJOR, salvo una corrección urgente de seguridad.
Proceso de publicación¶
- Clasificar el cambio con la tabla anterior antes de fusionarlo. Si hay consumidores externos o dudas de compatibilidad, se trata como rompedor hasta demostrar lo contrario.
- Actualizar la versión y las notas de entrega. Las notas indican qué cambió, quién debe actuar y, en un MAJOR, los pasos y fecha límite de migración.
- Validar. CI ejecuta pruebas, análisis de compatibilidad del contrato y
la compilación de consumidores relevantes. Un cambio rompedor en una API
existente no puede pasar como
v1(ADR 0017). - Etiquetar y publicar el artefacto. La etiqueta Git, el paquete/binario,
el despliegue y las notas deben usar la misma versión, por ejemplo
v2.4.1. - Deprecar y retirar cuando corresponda. La versión anterior se marca como deprecada, se comunica a sus consumidores y se monitoriza su uso antes de apagarla.
Convivencia y deprecación de versiones MAJOR¶
Publicar v2 no autoriza a eliminar v1 inmediatamente. El responsable del
componente debe definir y comunicar antes del lanzamiento:
- consumidores afectados y ruta de migración;
- fecha de deprecación y fecha estimada de retiro;
- periodo de convivencia, como mínimo dos ciclos de release cuando el riesgo no exija otra medida;
- métricas o registros que permitan confirmar que los consumidores dejaron de utilizar la versión anterior.
Una excepción por vulnerabilidad crítica puede retirar o bloquear una versión antes del periodo previsto. Debe documentarse el motivo, comunicar la acción y ofrecer la actualización segura disponible.
Alternativas descartadas¶
- Versionado por fechas: ordena lanzamientos, pero no comunica si existe compatibilidad ni el esfuerzo de actualización.
- Una sola versión para todo el monorepo: convierte cambios independientes en releases innecesarios y oculta qué componente cambió realmente.
- API sin versión en la ruta o solo por cabecera: dificulta la coexistencia, los cachés, los logs y las pruebas de contrato.
- Forzar todas las actualizaciones de cliente: aumenta el abandono y no es necesario para cambios compatibles; se reserva para los casos definidos.
Consecuencias¶
- Cada release comunica de forma consistente el riesgo de actualizar y deja evidencia trazable para soporte y auditoría.
- Las versiones MAJOR requieren planificación adicional: compatibilidad, migración, comunicación y retiro controlado.
- Mantener compatibilidad implica más de una versión temporalmente, pero evita interrupciones masivas y desplaza las migraciones a un proceso predecible.
- Producto, desarrollo y soporte deben conocer la política de soporte de cada versión publicada.