Regras de Lançamento & OTA
Nomenclatura de canais EAS Update, política de versão de runtime, fluxo de promoção e gatilhos de rollback para Expo SDK 57. Atualizações OTA são poderosas e perigosas - JavaScript pode chegar à produção em minutos sem revisão da loja. Estas regras separam mudanças OTA seguras de lançamentos que quebram o nativo e definem quando fazer rollback.
- Estabeleça o Nível 1 antes do primeiro
eas update - runtimeVersion incorreta deixa usuários presos em bundles desatualizados silenciosamente.
- Aplique os Níveis 2–3 em cada lançamento e promoção OTA - a higiene de canais impede que JS de staging chegue aos usuários de produção.
- O Nível 4 é o playbook de incidentes - defina gatilhos de rollback antes de precisar deles às 2 da manhã.
- Emparelhe
eas update com monitoramento de crash e feature flags - OTA sem observabilidade é voo cego.
- Submissões de loja e promoções OTA usam checklists diferentes - nunca pule portões nativos para mudanças nativas.
-
Defina a política explícita de runtimeVersion em app.config: Use policy: "appVersion", "sdkVersion", ou "fingerprint" consistentemente - documente qual política a equipe usa no README.
- Correspondência: O
runtimeVersion dos artefatos de eas build deve corresponder ao que eas update tem como alvo.
- Rejeitar: Omitir
runtimeVersion e esperar que o EAS adivinhe corretamente entre os sabores.
-
Incremente o runtime quando dependências nativas mudarem: Novo módulo nativo, upgrade de SDK, ou mudança de plugin de configuração → novo build de loja e novo runtime - OTA sozinho não pode adicionar código nativo.
- Gate JS: Feature flags ocultam JS que chama novas APIs nativas até o limite de adoção da loja (ex: 90%).
- Veja: Regras de Módulo Nativo.
-
Configure updates.url e projectId para EAS Update: extra.eas.projectId e updates.url em app.config - verifique com npx expo config --type public.
- Por app: Sabores white-label precisam de
projectId e canais distintos por ID de bundle.
- Teste:
eas update:list mostra bundles recentes após um publish de teste.
-
Use eas update --environment <nome> no SDK 55+: Runners de atualização carregam variáveis do ambiente EAS nomeado - arquivos .env locais são ignorados, mantendo OTA alinhado com o ambiente de build.
- Produção:
eas update --channel production --environment production.
- Rejeitar: Publicar atualizações de produção de um laptop com
.env.local desatualizado.
-
Verifique atualizações no lançamento com uma política sensata: expo-updates checkAutomatically e fallbackToCacheTimeout - equilibre novidade com inicialização offline.
- UX: Mostre "Atualização disponível - reiniciar" para correções obrigatórias; recarregamento silencioso apenas para patches de baixo risco.
- Teste: Lançamento em modo avião ainda abre o bundle em cache.
-
Assinatura de código para atualizações quando necessário: Habilite a assinatura de código EAS Update para apps de alta segurança - verifique a rotação do certificado de assinatura no runbook.
- ADR: Documente se as atualizações devem ser assinadas e quem detém as chaves.
- Staging: Teste atualizações assinadas no canal preview antes da produção.
-
Nomes de canal mapeiam para ambientes, não pessoas: development, preview, staging, production - não jane-test ou hotfix-tuesday.
- Mapear: Perfis de build
eas.json atribuem channel por perfil.
- Documentar: Tabela de canal → público → quem pode publicar.
-
Fluxo de promoção é linear: development → preview (QA) → production - sem pular preview para mudanças JS "pequenas" que tocam pagamentos ou autenticação.
- Mapeamento de branch: Use branches EAS se a equipe prefere nomes de branch Git mapeados para canais.
- Rejeitar: Atualização direta para
production de um branch de feature sem "soak" em preview.
-
Builds de preview emparelham com canal de preview: QA instala binário do perfil EAS preview e recebe OTA no canal preview - corresponde ao comportamento de produção sem risco de loja.
- Dispositivos físicos: Maestro smoke em artefatos de preview antes do OTA de produção.
- Rejeitar: QA no Expo Go para aprovação de lançamento.
-
Atualizações do canal de produção exigem regra de duas pessoas ou publicação via CI: eas update --channel production manual de laptops é propenso a erros - prefira GitHub Action em release taggeada.
- Auditoria:
eas update:list revisado no ticket de release.
- Break-glass: Documente o procedimento de publicação de emergência com requisito de postmortem.
-
Versionar app.config version e números de build de loja independentemente: Versão de marketing vs ios.buildNumber / android.versionCode - incremente números de build a cada submissão de loja.
- Changelog: Notas de release visíveis para o usuário vinculadas à versão da loja, não ao ID do bundle OTA.
- Alinhar: Se usar
runtimeVersion: { policy: "appVersion" }, bumps de versão do app afetam o targeting OTA.
-
Feature flags controlam payloads OTA arriscados: Flags remotas podem desabilitar caminhos de JS ruins sem um segundo OTA - flags não substituem testes de preview.
- Kill switch: Ops pode desativar a flag antes que o rollback OTA seja concluído.
- Servidor: Autorização ainda é imposta no lado do servidor.
-
Seguro para OTA: JS, TS, assets, cópia, estilos, estrutura de navegação: Mudanças puramente JavaScript que não chamam novos símbolos nativos.
- Teste: Mínimo de "soak" no canal preview (definido pela equipe, geralmente 24–48 horas para caminhos de receita).
- Rejeitar: "É apenas uma linha" que importa um novo pacote nativo.
-
Requerido pela loja: módulos nativos, plugins, permissões, scheme, entitlements: Qualquer coisa que mude a saída de ios/ ou android/ após o prebuild.
- Planejar: Coordenar o tempo de lead da submissão da loja com o marketing - OTA não pode substituir a revisão para mudanças nativas.
- Comunicar: #release quando usuários precisam atualizar o binário para novas funcionalidades.
-
Regressões de bytecode Hermes e tamanho de bundle podem ser enviadas via OTA - trate como eventos de release: Bundles grandes atrasam a inicialização - observe orçamentos de performance (veja Regras de Orçamento de Performance).
- Medir: Compare o tamanho do bundle antes do OTA de produção.
- Rollback: Regressões apenas de tamanho qualificam se o TTI ultrapassar o orçamento.
-
Mudanças de esquema de banco de dados e contrato de API precisam de compatibilidade retroativa: Usuários mobile pulam atualizações - JS deve tolerar respostas de API antigas até que a adoção da loja seja alta.
- Testes de contrato: Executados em CI antes do publish OTA.
- Rejeitar: Mudança de API que quebra, protegida apenas pelo JS mais recente.
-
Não envie via OTA mudanças que quebram o formato do armazenamento local persistido sem migração: Aumentos de esquema MMKV/SQLite precisam de migração graciosa ou gate de versão - migração ruim pode quebrar instalações.
- Teste: Atualize de um bundle de produção anterior em um dispositivo.
- Fallback: Limpe o caminho do cache com aviso ao usuário se a migração falhar.
-
OTA de emergência ainda passa pelo preview quando possível: Sev-1 real pode pular o soak - documente a exceção e exija postmortem mais verificação de rollback em uma hora.
- Monitorar: Dashboards de sessões sem crash e taxa de erro de autenticação abertos durante o push de emergência.
- Comms: Página de status e macros de suporte prontos.
-
Defina gatilhos de rollback antes do lançamento:
| Gatilho | Responsável | Ação |
|---|
| Taxa de crash-free cai > X% vs baseline | Mobile on-call | Republicar bundle anterior ou redirecionamento de canal |
| Pico na taxa de falha de autenticação/login | Backend + mobile | Rollback OTA + desativar flag |
| Queda na taxa de sucesso de pagamento | Revenue + mobile | Rollback de produção imediato |
| Problema de segurança P0 em JS | Security + mobile | Correção OTA ou rollback dentro do SLA |
- X: Definido por app (geralmente queda absoluta de 1–2%).
- Baseline: Comparação contínua de 7 dias na mesma hora.
-
Saiba como fazer rollback de um EAS Update: Republicar o ID do bundle anterior no canal, ou usar o rollback do dashboard EAS - pratique em preview trimestralmente.
- Registrar: Mantenha o último ID de bundle conhecido como bom nas notas de release.
- Tempo: Alvo de < 15 minutos da decisão ao rollback completo.
-
Rollback de loja é mais lento - planeje fallback de binário: Mantenha a versão anterior da loja disponível; rollout faseado na App Store e rollout escalonado na Play Store quando possível.
- Bug nativo: OTA não pode corrigir - pare o rollout e envie binário de patch.
- Comunicação: Mensagem no app para upgrade forçado quando a versão mínima é imposta.
-
Monitore após cada OTA de produção por 24 horas: Sentry, analytics e dashboards de erro de API - on-call monitora sem assumir sucesso no momento do publish.
- Alerta: PagerDuty em gatilhos de crash e pagamento da regra 19.
- Documentar: Ticket de release vincula os dashboards usados.
-
Alertas de incompatibilidade de runtime: Usuários com binários antigos que nunca recebem atualizações - rastreie falhas de verificação de expo-updates e versões de runtime desatualizadas em analytics.
- Forçar upgrade: Endpoint de versão nativa mínima quando a segurança exige novo binário.
- Métricas: % de usuários por versão de runtime semanalmente.
-
Checklist de release são duas trilhas: Checklist de submissão de loja (nativo, screenshots, revisão) e checklist de OTA (soak em preview, flags, ID de rollback) - anexe ambos aos tickets de release.
- Aprovação: QA, líder mobile e produto para OTA de produção em caminhos de receita.
- Rejeitar: OTA de produção na sexta-feira sem on-call de fim de semana.
-
Retrospectiva pós-release para qualquer rollback: Gatilhos de atualização, duração do preview, ou gates de CI - rollbacks são lições gratuitas se documentadas.
- Nível 1 (1–6): Runtime e configuração de atualização - fundação; erros aqui tornam todos os canais não confiáveis.
- Nível 2 (7–12): Canais e promoção - impede que o público errado receba o bundle errado.
- Nível 3 (13–18): Limite OTA vs loja - evita enviar JS dependente de nativo via OTA.
- Nível 4 (19–25): Rollback e monitoramento - prontidão operacional.
Qual é a política de runtimeVersion appVersion vs fingerprint?
appVersion vincula o runtime à versão de marketing - simples para muitos apps. fingerprint faz hash do estado do projeto nativo - melhor quando mudanças nativas ocorrem sem bumps de versão. Escolha uma política, documente-a e nunca misture inconsistente entre os sabores.
Posso corrigir um crash nativo com OTA?
Não - crashes nativos exigem um novo build de loja. OTA corrige apenas erros de JavaScript e bugs de lógica.
Quantos canais precisamos?
Mínimo: development, preview, production. Organizações maiores adicionam staging. Evite canais por desenvolvedor - use builds de preview com atualizações baseadas em branch em vez disso.
O eas update usa meu .env local?
No SDK 55+, eas update --environment usa apenas variáveis de ambiente EAS - .env local é ignorado nos runners. Alinhe com como eas build resolve o env.
Quando devemos forçar os usuários a reiniciar para uma atualização?
Obrigatório para correções de segurança e mudanças que quebram o contrato de API. Banner opcional para ajustes de UI. Documente a UX na estratégia de recarregamento do expo-updates.
Como feature flags interagem com OTA?
Flags desabilitam caminhos de código em bundles já enviados - mais rápido que rollback OTA para erros de lógica. Flags não substituem testes de preview ou autorização do servidor.
Qual é um bom tempo de soak em preview?
Mínimo de 24 horas para caminhos de autenticação e pagamento; mais curto apenas com forte cobertura automatizada e cobertura on-call. Exceções Sev-1 documentadas post-hoc.
Apps white-label podem compartilhar um canal de atualização?
Não - cada ID de bundle e projeto EAS precisa de canais e linhas de runtime distintas. Um monorepo JS compartilhado pode publicar por app com comandos eas update separados.
Como testar atualizações localmente?
Use builds de preview/dev client apontando para o canal development. Configurações de dev do expo-updates podem sobrescrever a URL de atualização em staging controlada - não em apps de produção.
O que vai no ticket de release?
Versão da loja, números de build, ID do bundle OTA, canal, último ID de rollback conhecido como bom, feature flags tocadas, janela de soak em preview e links de dashboards.
A produção OTA deve ser apenas via CI?
Fortemente recomendado - tags disparam eas update com ambiente production. Publicação manual via laptop requer segundo aprovador e postmortem.
Como o upgrade de SDK afeta o OTA?
Upgrade de SDK muda binários nativos - novo build de loja, nova linha de runtimeVersion. Runtimes antigos param de receber atualizações na nova linha nativa; planeje a comunicação de upgrade para usuários.
E se as versões OTA e da loja divergirem?
Esperado - usuários com builds de loja antigos permanecem em seu canal de runtime até que atualizem o binário. Monitore a distribuição de runtime e imponha a versão nativa mínima quando necessário.
Versões da Stack: Esta página foi escrita para React 19.2.3, React Native 0.86.0, e Expo SDK 57 (expo ~57.0.4).