Noções Básicas de CI/CD Mobile
10 exemplos para entender verificações de PR, pipelines de lançamento e compilações noturnas para aplicativos Expo SDK 57 - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para entender verificações de PR, pipelines de lançamento e compilações noturnas para aplicativos Expo SDK 57 - 7 básicos e 3 intermediários.
CI/CD para React Native difere da web: você envia binários nativos (compilações de loja) e, opcionalmente, pacotes JavaScript OTA (Noções Básicas de OTA Updates). Compilações na nuvem via Noções Básicas de EAS Build mantêm as chaves de assinatura fora dos laptops.
npx create-expo-app@latest ShipApp --template blank-typescript
cd ShipApp
npx expo install eas-cli --save-dev
npx eas-cli@latest build:configurePadronize os scripts que a CI chamará:
{
"scripts": {
"lint": "expo lint",
"typecheck": "tsc --noEmit",
"test": "jest",
"format:check": "prettier --check ."
}
}Ferramentas: Estes exemplos visam Expo SDK 57 (
expo~57.0.4), React Native 0.86.0 e React 19.2.3. Snippets E2E assumem compilações de desenvolvimento ou de pré-visualização - não apenas Expo Go.
Equipes mobile executam três fluxos de automação distintos com diferentes metas de velocidade, custo e raio de explosão.
┌─────────────────────────────────────────────────────────────┐
│ Verificações de PR │ Todo PR │ 2–8 min │ Bloqueia mesclagem │
├──────────────────┼──────────────┼──────────┼───────────────┤
│ Pipeline de lançamento │ Tag / main │ 20–60 min│ Loja + OTA │
├──────────────────┼──────────────┼──────────┼───────────────┤
│ Noturno │ Cron 02:00 │ 30–90 min│ Sinal de desvio │
└─────────────────────────────────────────────────────────────┘| Fluxo | Gatilhos | Tarefas Típicas | Bloqueia |
|---|---|---|---|
| Verificações de PR | pull_request | lint, tsc, Jest | Mesclagem para main |
| Lançamento | push tag v*, manual | EAS build, Maestro smoke, submit | Promoção para loja |
| Noturno | schedule: cron | Compilação completa da matriz, testes de contrato | Apenas alertas |
Relacionado: Portões de Qualidade de CI - scripts que as verificações de PR chamam
A automação de PR responde: "Esta alteração é segura para mesclar?" - não "Está pronta para a App Store?"
# .github/workflows/pr-checks.yml
name: PR Checks
on:
pull_request:
branches: [main]
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20, cache: npm }
- run: npm ci
- run: npx expo customize tsconfig.json
- run: npm run format:check
- run: npm run lint
- run: npm run typecheck
- run: npm run test -- --ciquality - política, não sistema de honranpm run lint && npm run typecheck && npm testRelacionado: Noções Básicas de Testes Mobile - camadas da pirâmide que as verificações de PR cobrem
A automação de lançamento responde: "Construa e envie a versão que marcamos."
# .github/workflows/release.yml
name: Release
on:
push:
tags: ["v*"]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: expo/expo-github-action@v8
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
- run: npm ci
- run: npm run typecheck && npm run test -- --ci
- run: eas build --profile production --platform all --non-interactive// eas.json (excerto)
{
"build": {
"production": {
"autoIncrement": true,
"channel": "production"
}
}
}v2.4.0) - rastreabilidade tag ↔ binárioEXPO_TOKEN - nunca senhas pessoais em CI (GitHub Actions + EAS)production mapeia para credenciais de assinatura da loja no EASRelacionado: Perfis e Sabores de Build -
previewvsproduction
Quando o volume de PR é alto, verificações verdes individuais escondem falhas de integração entre branches. As compilações noturnas rodam em um cronograma sem bloquear mesclagens.
# .github/workflows/nightly.yml
name: Nightly Integration
on:
schedule:
- cron: "0 6 * * 1-5" # dias úteis 06:00 UTC
workflow_dispatch:
jobs:
nightly:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { ref: main }
- uses: expo/expo-github-action@v8
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
- run: npm ci
- run: npx expo-doctor
- run: npm run test -- --ci
- run: eas build --profile preview --platform android --non-interactive#mobile-ci) em caso de falha - não bloqueie mesclagens diurnasnpx expo-doctor - captura desvios de SDK que ninguém tocou nos PRs de hojeNem todo PR precisa de um binário nativo. Separe portões rápidos de compilações de pré-visualização opcionais.
| Sinal | Apenas verificação de PR | + Compilação de pré-visualização |
|---|---|---|
Mudança de cópia em Text | ✓ | ✗ |
Novo módulo nativo (expo-camera) | lint/tsc | ✓ |
| Refatoração de navegação | testes unitários | ✓ (Maestro smoke) |
| Mudança de plugin de configuração | tsc + doctor | ✓ |
# Pré-visualização controlada por rótulo - economiza créditos EAS
on:
pull_request:
types: [labeled]
jobs:
preview:
if: contains(github.event.pull_request.labels.*.name, 'needs-preview')
# ... eas build --profile previewpaths para diretórios que afetam o nativoneeds-previewCorreções apenas de JS são enviadas via eas update dentro do pipeline de lançamento - alterações nativas ainda precisam de eas build.
# .eas/workflows/release-ota.yml (excerto)
jobs:
quality:
steps:
- uses: eas/checkout
- uses: eas/install_node_modules
- run: npm run typecheck && npm run test -- --ci
update_production:
needs: [quality]
type: update
params:
channel: production
message: ${{ github.sha }}runtimeVersion deve corresponder ao binário da loja que os usuários instalaram - Política de Runtime Versioneas update --roll-back - Rollback RunbookO anti-padrão: QA testa uma compilação de laptop; as lojas recebem uma compilação de nuvem diferente.
❌ Compilação de laptop → Aprovação de QA → Recompilação CI → Loja
✅ ID de compilação EAS abc123 → Aprovação de QA → eas submit --id abc123 → Loja# Promova a compilação exata que o QA testou
eas submit --platform ios --id <BUILD_ID> --non-interactive
eas submit --platform android --id <BUILD_ID> --non-interactiveeas submit --latest é conveniente, mas arriscado se uma compilação mais recente foi enfileirada após o QARelacionado: EAS Submit - Handoff do App Store Connect e Play Console
Monorepos Turborepo não devem executar CI mobile quando apenas o site de marketing mudou.
on:
pull_request:
paths:
- "apps/mobile/**"
- "packages/ui/**"
- "package-lock.json"# Ou ação de filtro de caminho
- uses: dorny/paths-filter@v3
id: changes
with:
filters: |
mobile:
- 'apps/mobile/**'
- 'packages/**'
- if: steps.changes.outputs.mobile == 'true'
run: npm run typecheck -w apps/mobileturbo run lint typecheck test --filter=mobile distribui com cache - GitHub Actions + EASEquipes avançadas encadeiam qualidade → compilação → E2E → envio em um único arquivo de fluxo de trabalho.
# .eas/workflows/store-release.yml (esboço)
name: Store Release
on:
push:
tags: ["v*"]
jobs:
quality:
steps:
- uses: eas/checkout
- uses: eas/install_node_modules
- run: npm run lint && npm run typecheck && npm run test -- --ci
build_ios:
needs: [quality]
type: build
params: { platform: ios, profile: production }
smoke_ios:
needs: [build_ios]
type: maestro
params:
build_id: ${{ needs.build_ios.outputs.build_id }}
flow_path: [".maestro/smoke.yml"]
submit_ios:
needs: [smoke_ios]
type: submit
params:
platform: ios
build_id: ${{ needs.build_ios.outputs.build_id }}needs encadeia e impõe a ordem - o envio não pode ocorrer se o Maestro falhouLançamentos mobile raramente ocorrem sozinhos. Documente dependências de implantação em um calendário de lançamento.
Trem de lançamento da Semana 12
Ter - API Backend v3 implanta em staging (testes de contrato verdes)
Qua - eas build production (nativo + JS embarcado)
Qui - eas update production (hotfix JS se necessário, mesma runtimeVersion)
Sex - eas submit após Maestro + QA manual
Seg - Rollout escalonado 10% → 50% → 100%| Tipo de Mudança | Enviado via | Dependência do Backend |
|---|---|---|
| Cor do botão | OTA | Nenhum |
| Novo campo de API (opcional) | OTA | Backend ativo primeiro |
| Novo módulo nativo | Compilação de loja | Feature flag desativada até o binário estar ativo |
| API que quebra | Loja + backend na mesma janela | Congelamento de coordenação |
| Anti-padrão | Por que falha |
|---|---|
eas build em cada commit de PR | Queima créditos; loops de feedback de 20 minutos |
| Ignorar testes em tags de lançamento | Tags de "hotfix" enviam regressões |
| Arquivo de laptop para TestFlight | Não reproduzível; desvio de assinatura |
| OTA sem disciplina de canal | Pacote de staging atinge usuários de produção |
| Um pipeline para tudo | PR espera 45 minutos; equipe desabilita CI |
PR: lint, format, tsc, testes unitários, testes de contrato opcionais. Lançamento: EAS build, E2E smoke, submit, OTA para canal de produção.
Dias úteis para equipes ativas; semanalmente para aplicativos pequenos. Aumente a frequência após atualizações de SDK ou migrações de monorepo.
EAS Workflows honra [eas skip] em gatilhos de push. Prefira pré-visualizações controladas por rótulo em vez de tokens de skip rotineiros - a proteção de branch ainda deve exigir verificações de PR.
Muitas equipes usam GitHub Actions para verificações de PR e EAS Workflows para cadeias de build/teste/submit. Mantenha os scripts npm idênticos em ambos.
eas.jsonVersõ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).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026