Reglas de Versiones y OTA
Nomenclatura de canales EAS Update, política de versiones de runtime, flujo de promoción y triggers de reversión para Expo SDK 57. Las actualizaciones OTA son poderosas y peligrosas - JavaScript puede llegar a producción en minutos sin revisión de tienda. Estas reglas separan cambios OTA seguros de versiones que rompen nativas y definen cuándo hacer rollback.
- Establece Nivel 1 antes del primer
eas update - una runtimeVersion incorrecta deja a usuarios atrapados en bundles obsoletos silenciosamente.
- Aplica Niveles 2-3 en cada publicación y promoción OTA - la higiene de canales previene que JS de staging llegue a usuarios de producción.
- Nivel 4 es el playbook de incidentes - define triggers de reversión antes de necesitarlos a las 2 a.m.
- Empareja
eas update con monitoreo de bloqueos y feature flags - OTA sin observabilidad es vuelo a ciegas.
- Las presentaciones de tienda y promociones OTA usan diferentes checklists - nunca omitas validaciones nativas para cambios nativos.
-
Establece política explícita de runtimeVersion en app.config: Usa policy: "appVersion", "sdkVersion" o "fingerprint" consistentemente - documenta qué política usa tu equipo en README.
- Coincide: La
runtimeVersion en artefactos de eas build debe coincidir con lo que eas update apunta.
- Rechaza: Omitir
runtimeVersion esperando que EAS adivine correctamente entre sabores.
-
Incrementa runtime cuando cambien las dependencias nativas: Nuevo módulo nativo, actualización de SDK o cambio de plugin de configuración - nueva compilación de tienda y nuevo runtime. OTA solo no puede agregar código nativo.
- Gatea JS: Los feature flags ocultan JS que llama nuevas APIs nativas hasta que se alcanza el umbral de adopción de tienda (p.ej., 90%).
- Ver: Native Module Rules.
-
Configura updates.url y project ID para EAS Update: extra.eas.projectId y updates.url en app.config - verifica con npx expo config --type public.
- Por aplicación: Los sabores de white-label necesitan
projectId y canales distintos por bundle ID.
- Prueba:
eas update:list muestra bundles recientes después de una publicación de prueba.
-
Usa eas update --environment <name> en SDK 55+: Los corredores de actualización cargan variables del entorno EAS nombrado - los archivos .env locales se ignoran, manteniendo OTA alineado con el entorno de compilación.
- Producción:
eas update --channel production --environment production.
- Rechaza: Publicar actualizaciones de producción desde una laptop con
.env.local obsoleto.
-
Revisa las actualizaciones al lanzar con una política sensata: expo-updates checkAutomatically y fallbackToCacheTimeout - equilibra la frescura con el inicio sin conexión.
- UX: Muestra "Actualización disponible - reinicia" para correcciones obligatorias; solo recarga silenciosa para parches bajo riesgo.
- Prueba: El lanzamiento en modo avión todavía abre el bundle almacenado en caché.
-
Firma de código para actualizaciones cuando sea requerido: Habilita la firma de código de EAS Update para aplicaciones de alta seguridad - verifica la rotación de certificados de firma en el runbook.
- ADR: Documenta si las actualizaciones deben estar firmadas y quién tiene las claves.
- Staging: Prueba actualizaciones firmadas en el canal de vista previa antes de producción.
-
Los nombres de canales se asignan a entornos, no a personas: development, preview, staging, production - no jane-test o hotfix-tuesday.
- Asigna: Los perfiles de compilación de
eas.json asignan channel por perfil.
- Documenta: Tabla de canal - audiencia - quién puede publicar.
-
El flujo de promoción es lineal: development - preview (QA) - production - no saltes vista previa para cambios JS "pequeños" que tocan pagos o autenticación.
- Asignación de ramas: Usa ramas de EAS si tu equipo prefiere nombres de ramas de Git asignados a canales.
- Rechaza: Actualización de
production directa desde una rama de feature sin soak de vista previa.
-
Las compilaciones de vista previa se emparejan con el canal de vista previa: QA instala el binario del perfil de preview de EAS y recibe OTA en el canal preview - coincide con el comportamiento de producción sin riesgo de tienda.
- Dispositivos físicos: Maestro smoke en artefactos de vista previa antes de OTA de producción.
- Rechaza: QA en Expo Go para aceptación de versión.
-
Las actualizaciones del canal de producción requieren regla de dos personas o publicación solo en CI: eas update --channel production manual desde laptops es propenso a errores - prefiere GitHub Action en versión etiquetada.
- Auditoría:
eas update:list revisado en ticket de versión.
- Break-glass: Documenta procedimiento de publicación de emergencia con requisito de postmortem.
-
Versionea version de app.config y números de compilación de tienda independientemente: Versión de marketing vs ios.buildNumber / android.versionCode - incrementa números de compilación en cada presentación de tienda.
- Changelog: Notas de versión visibles para el usuario vinculadas a la versión de tienda, no al bundle ID de OTA.
- Alinea: Si usas
runtimeVersion: { policy: "appVersion" }, los cambios de versión de aplicación afectan al targeting de OTA.
-
Los feature flags bloquean cargas útiles OTA arriesgadas: Los flags remotos pueden desactivar rutas JS defectuosas sin una segunda OTA - los flags no son un sustituto para pruebas de vista previa.
- Kill switch: Ops puede cambiar el flag antes de que se complete el rollback de OTA.
- Servidor: La autorización aún se aplica en el lado del servidor.
-
Seguro para OTA: JS, TS, activos, copia, estilos, estructura de navegación: Cambios puros de JavaScript que no llaman nuevos símbolos nativos.
- Prueba: Soak de canal de vista previa mínimo (definido por el equipo, a menudo 24-48 horas para rutas de ingresos).
- Rechaza: "Es solo una línea" que importa un nuevo paquete nativo.
-
Requerido en tienda: módulos nativos, plugins, permisos, scheme, entitlements: Cualquier cosa que cambie la salida de ios/ o android/ desde prebuild.
- Planifica: Coordina el tiempo de presentación de tienda con marketing - OTA no puede reemplazar la revisión para cambios nativos.
- Comunica: #release cuando los usuarios deben actualizar el binario para nuevas características.
-
Bytecode de Hermes y regresiones de tamaño de bundle pueden enviar OTA - trata como eventos de versión: Los bundles grandes ralentizan el inicio - observa presupuestos de rendimiento (ver Performance Budget Rules).
- Mide: Compara el tamaño del bundle antes de OTA de producción.
- Rollback: Las regresiones de solo tamaño califican si TTI cruza el presupuesto.
-
Los cambios de esquema de base de datos y contrato de API necesitan compatibilidad hacia atrás: Los usuarios móviles saltan actualizaciones - JS debe tolerar respuestas de API antiguas hasta que la adopción de tienda sea alta.
- Contract tests: Ejecuta en CI antes de publicar OTA.
- Rechaza: Cambio de API que rompe guardado solo por JS más reciente.
-
No hagas OTA de cambios que rompen la forma del almacenamiento local persistente sin migración: Los cambios de esquema MMKV/SQLite necesitan migración elegante o compuerta de versión - una mala migración rompe instalaciones.
- Prueba: Actualiza desde el bundle de producción anterior en dispositivo.
- Fallback: Limpia la ruta de caché con advertencia al usuario si la migración falla.
-
OTA de emergencia todavía pasa a través de vista previa cuando es posible: Un sev-1 verdadero puede saltarse soak - documenta excepción y requiere postmortem más verificación de rollback dentro de una hora.
- Monitorea: Sesiones libres de bloqueos y dashboards de tasa de error de autenticación abiertos durante push de emergencia.
- Comms: Página de estado y macros de soporte listos.
-
Define triggers de reversión antes del lanzamiento:
| Trigger | Propietario | Acción |
|---|
| La tasa libre de bloqueos cae > X% vs baseline | Mobile on-call | Republica bundle anterior o redirección de canal |
| Pico en tasa de fallo de autenticación/login | Backend + mobile | Rollback OTA + flag off |
| Caída en tasa de éxito de pagos | Revenue + mobile | Rollback de producción inmediato |
| Problema de seguridad P0 en JS | Security + mobile | Corrección OTA o rollback dentro del SLA |
- X: Establece por aplicación (a menudo 1-2% caída absoluta).
- Baseline: Comparación de 7 días rodantes a la misma hora.
-
Sabe cómo hacer rollback de una Actualización EAS: Republica bundle ID anterior a canal, o usa rollback de dashboard EAS - practica en vista previa trimestralmente.
- Registro: Guarda el último bundle ID conocido como bueno en notas de versión.
- Tiempo: Apunta a menos de 15 minutos desde la decisión hasta que se complete el rollback.
-
El rollback de tienda es más lento - planifica fallback binario: Mantén la versión anterior de tienda disponible; rollout en fases en App Store y rollout staged en Play Store cuando sea posible.
- Bug nativo: OTA no puede arreglarlo - detén rollout y envía binario parche.
- Comunicación: Mensaje en aplicación para actualización forzada cuando se aplica versión mínima.
-
Monitorea después de cada OTA de producción durante 24 horas: Dashboards de Sentry, analytics y error de API - on-call vigila sin asumir éxito en tiempo de publicación.
- Alerta: PagerDuty en triggers de bloqueo y pagos de la regla 19.
- Documenta: El ticket de versión enlaza dashboards usados.
-
Alertas de desajuste de runtime: Usuarios en binarios antiguos que nunca reciben actualizaciones - rastrea fallos de expo-updates check y versiones de runtime obsoletas en analytics.
- Fuerza actualización: Endpoint de versión nativa mínima cuando la seguridad requiere nuevo binario.
- Métricas: % de usuarios por versión de runtime semanalmente.
-
La checklist de versión tiene dos pistas: Checklist de presentación de tienda (nativa, capturas, revisión) y checklist de OTA (soak de vista previa, flags, ID de rollback) - adjunta ambas a tickets de versión.
- Autorización: QA, lead móvil y producto para OTA de producción en rutas de ingresos.
- Rechaza: OTA de producción el viernes sin on-call de fin de semana.
-
Retrospectiva posterior a la versión para cualquier rollback: Actualiza triggers, duración de vista previa o compuertas de CI - los rollbacks son lecciones gratis si están documentadas.
- Nivel 1 (1-6): Runtime y configuración de actualización - fundación; los errores aquí hacen que todos los canales sean poco confiables.
- Nivel 2 (7-12): Canales y promoción - previene que la audiencia equivocada reciba el bundle equivocado.
- Nivel 3 (13-18): Límite OTA vs tienda - evita enviar JS dependiente de nativo sobre OTA.
- Nivel 4 (19-25): Rollback y monitoreo - preparación operacional.
¿Cuál es la diferencia entre la política de runtimeVersion appVersion y fingerprint?
appVersion vincula runtime a la versión de marketing - simple para muchas aplicaciones. fingerprint hashea el estado del proyecto nativo - mejor cuando el código nativo cambia sin cambios de versión. Elige una política, documéntala y nunca mezcles inconsistentemente entre sabores.
¿Puedo arreglar un bloqueo nativo con OTA?
No - los bloqueos nativos necesitan una nueva compilación de tienda. OTA arregla solo errores de JavaScript y bugs de lógica.
¿Cuántos canales necesitamos?
Mínimo: desarrollo, vista previa, producción. Organizaciones más grandes agregan staging. Evita canales por desarrollador - usa compilaciones de vista previa con actualizaciones basadas en rama en su lugar.
¿eas update usa mi .env local?
En SDK 55+, eas update --environment usa solo variables de entorno EAS - .env local se ignora en corredores. Alinea con cómo eas build resuelve env.
¿Cuándo deberíamos forzar a los usuarios a reiniciar una actualización?
Obligatorio para correcciones de seguridad y cambios de contrato de API que rompen. Banner opcional para ajustes de UI. Documenta UX en estrategia de recarga de expo-updates.
¿Cómo interactúan los feature flags con OTA?
Los flags desactivan rutas de código en bundles ya enviados - más rápido que rollback de OTA para errores de lógica. Los flags no reemplazan pruebas de vista previa o autorización de servidor.
¿Cuál es un buen tiempo de soak de vista previa?
Mínimo 24 horas para rutas de autenticación y pago; más corto solo con fuerte cobertura automatizada y cobertura on-call. Excepciones Sev-1 documentadas post-hoc.
¿Las aplicaciones de white-label pueden compartir un canal de actualización?
No - cada bundle ID y proyecto EAS necesita canales y líneas de runtime distintos. El monorepo JS compartido puede publicar por aplicación con comandos eas update separados.
¿Cómo pruebo actualizaciones localmente?
Usa compilaciones de cliente de vista previa/dev apuntando al canal development. Las configuraciones de dev de expo-updates pueden anular la URL de actualización en staging controlado - no en aplicaciones de producción.
¿Qué va en el ticket de versión?
Versión de tienda, números de compilación, bundle ID de OTA, canal, último ID de rollback conocido como bueno, feature flags tocados, ventana de soak de vista previa y enlaces a dashboards.
¿Debería OTA de producción ser solo CI?
Fuertemente recomendado - las etiquetas disparan eas update con environment producción. La publicación de laptop break-glass requiere aprobador segundo y postmortem.
¿Cómo afecta la actualización de SDK a OTA?
La actualización de SDK cambia binarios nativos - nueva compilación de tienda, nueva línea runtimeVersion. Los runtimes antiguos dejan de recibir actualizaciones en la nueva línea nativa; planifica mensajería de actualización de usuario.
¿Qué si las versiones OTA y tienda divergen?
Esperado - los usuarios en compilaciones de tienda antiguas permanecen en su canal de runtime hasta que actualicen el binario. Rastrea distribución de runtime y aplica versión nativa mínima cuando sea necesario.
Versiones de Stack: Esta página fue escrita para React 19.2.3, React Native 0.86.0 y Expo SDK 57 (expo ~57.0.4).