Skip to content

Runbook: Pipeline EAS (build + submit às lojas)

A cada push na branch main — depois que lint, format, test e typecheck passam — o job eas-publish do ci.yml dispara um build nativo de Android + iOS (perfil production) nos servidores do EAS e, ao terminar, submete automaticamente às lojas (--auto-submit).

Primeiro envio / configuração manual das lojas: ver publicacao-lojas-mobile.

Arquivos envolvidos

  • .github/workflows/ci.yml — job eas-publish (build + submit).
  • eas.json — perfis build.production (autoIncrement) e submit.production (Android no track internal).
  • app.jsonextra.eas.projectId, owner: contrasync, runtimeVersion.policy: appVersion.

Projeto EAS: @contrasync/contrasync-app (409313df-bb14-45e4-a689-87c83d3edf7d).

Setup (uma vez)

1. Token de acesso do Expo (obrigatório p/ o CI)

O login do eas na máquina local não vale no GitHub Actions. Crie um token robô:

  1. Acesse https://expo.dev/accounts/contrasync/settings/access-tokens.
  2. Gere um token e copie o valor.
  3. No GitHub: Settings → Secrets and variables → Actions → New repository secret, nome EXPO_TOKEN.

2. Credenciais de assinatura do build

  • Android: o EAS gera/gerencia o keystore automaticamente no primeiro eas build. Nada a fazer.
  • iOS: rode uma vez localmente eas build --platform ios --profile production e deixe o EAS gerenciar os certificados/provisioning (precisa de uma conta Apple Developer paga). Ficam guardados no EAS e o CI reaproveita.

3. Credenciais de submissão às lojas (para o --auto-submit)

As lojas exigem que o primeiro envio de cada app seja manual (criar o registro do app na Play Console / App Store Connect). Depois disso:

  • Android (Play Store):

    1. Crie uma Service Account no Google Cloud com acesso à Play Console e baixe o JSON.
    2. Armazene no EAS: eas credentials → plataforma Android → Google Service Account Key for Play Store submissions → upload do JSON.
    3. O submit.production.android.track está em internal; altere para production no eas.json quando quiser publicar direto.
  • iOS (App Store Connect):

    1. Em App Store Connect, gere uma App Store Connect API Key (.p8) e anote Key ID + Issuer ID.
    2. Armazene no EAS: eas credentials → plataforma iOS → App Store Connect API Key → upload.

Com as credenciais guardadas no EAS, o --auto-submit --non-interactive do CI funciona sem arquivos secretos no repositório.

Operação

O job usa --no-wait: ele apenas enfileira o build no EAS e encerra rápido (não gasta minutos do Actions esperando ~30-40 min de build). O build e o submit prosseguem no servidor do EAS; falhas aparecem no dashboard/notificações do Expo, não no GitHub. Remova --no-wait se quiser que o job do Actions falhe junto com o build.

Notas

  • build.production.autoIncrement + cli.appVersionSource: remote incrementam o versionCode/buildNumber a cada build — sem conflito de versão nas lojas.
  • Por publicar a cada push na main, o track Android padrão é internal (teste interno) para evitar enviar todo commit direto à produção. Considere migrar o gatilho para tags de release se quiser builds de produção mais controlados.

Troubleshooting

iOS: Apple 403 detected - Access forbidden / PLA Update available

Mensagem completa:

✖ Failed to register bundle identifier com.contrasync
Apple 403 detected - Access forbidden.
Unable to process request - PLA Update available - You currently don't
have access to this membership resource. To resolve this issue, agree to
the latest Program License Agreement in your developer account.

Não é erro de configuração — a Apple bloqueia qualquer operação (inclusive registrar o bundle id) enquanto houver um Program License Agreement (PLA) novo pendente de aceite.

Como resolver:

  1. Acesse https://developer.apple.com/account com o Apple ID que é o Account Holder do time. ⚠️ Só o titular consegue aceitar o PLA — papéis Admin/Developer não conseguem.
  2. Aceite o contrato no banner "Review Agreement / Updated Agreement" no topo da página.
  3. Confira também em https://appstoreconnect.apple.comBusiness → Agreements, Tax, and Banking se há contrato pendente.
  4. Confirme que a assinatura do Apple Developer Program está ativa (paga, não expirada).
  5. Rode o build de novo: eas build --platform ios --profile production.