Como usar o Expo EAS para builds e deploys automatizados

1. Introdução ao Expo EAS e seus benefícios

O Expo EAS (Expo Application Services) é um conjunto de serviços em nuvem que revolucionou o workflow de desenvolvimento mobile com React Native. Diferente do workflow clássico do Expo, que exigia o uso do Expo Go para testes e limitava o acesso a módulos nativos, o EAS oferece um pipeline completo de build, submissão e atualização diretamente na infraestrutura da Expo.

As vantagens da automação com EAS são significativas: redução drástica de erros manuais, consistência entre builds de diferentes desenvolvedores, integração contínua com repositórios Git e rastreabilidade completa de versões. Os três serviços principais são:

  • EAS Build: compilação nativa de APK/AAB para Android e IPA para iOS na nuvem
  • EAS Submit: submissão automatizada para App Store Connect e Google Play Console
  • EAS Update: distribuição over-the-air de atualizações JavaScript sem nova build

2. Configuração inicial do projeto para EAS

Para começar, instale a CLI do EAS globalmente e autentique-se na sua conta Expo:

npm install -g eas-cli
eas login

No diretório raiz do seu projeto Expo, execute:

eas init

Isso criará o arquivo eas.json na raiz. Este arquivo define os perfis de build. Um exemplo completo:

{
  "cli": {
    "version": ">= 3.0.0"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "android": {
        "buildType": "apk"
      },
      "ios": {
        "simulator": true
      }
    },
    "production": {
      "android": {
        "buildType": "app-bundle"
      },
      "ios": {
        "autoIncrement": true
      },
      "env": {
        "API_URL": "https://api.producao.com"
      }
    }
  },
  "submit": {
    "production": {
      "android": {
        "track": "production"
      },
      "ios": {
        "appleId": "seu@email.com",
        "ascAppId": "1234567890"
      }
    }
  }
}

Para variáveis de ambiente sensíveis, use secrets:

eas secret:create --scope project --name API_KEY --value "sua-chave-secreta"

3. EAS Build: automatizando a compilação nativa

Configure os arquivos nativos automaticamente com:

eas build:configure

Isso gera as pastas android/ e ios/ com configurações personalizáveis. Para executar builds remotas:

# Build de desenvolvimento para teste em dispositivo físico
eas build --platform android --profile development

# Build de produção para Google Play
eas build --platform android --profile production

# Build de produção para iOS (requer Apple Developer Program)
eas build --platform ios --profile production

Monitore logs em tempo real com:

eas build:view BUILD_ID

Exemplo de personalização no app.json para versão:

{
  "expo": {
    "version": "1.2.3",
    "android": {
      "versionCode": 4
    },
    "ios": {
      "buildNumber": "1.2.3.4"
    }
  }
}

4. EAS Submit: deploy automatizado para lojas

Configure as credenciais das lojas. Para iOS, crie um App específico no App Store Connect e obtenha o ascAppId. Para Android, configure o service account JSON no Google Play Console.

Adicione perfis de submit no eas.json:

"submit": {
  "production": {
    "android": {
      "track": "production",
      "releaseStatus": "completed"
    },
    "ios": {
      "appleId": "developer@email.com",
      "ascAppId": "1234567890",
      "appleTeamId": "ABCDEF1234"
    }
  }
}

Execução dos comandos:

# Submeter Android após build
eas submit --platform android --profile production

# Submeter iOS após build
eas submit --platform ios --profile production

# Submeter build específico
eas submit --platform ios --id BUILD_ID

5. EAS Update: atualizações over-the-air (OTA)

Configure os canais de atualização no eas.json:

"update": {
  "development": {
    "channel": "development"
  },
  "staging": {
    "channel": "staging"
  },
  "production": {
    "channel": "production"
  }
}

Envie atualizações sem nova compilação:

# Branch production com mensagem descritiva
eas update --branch production --message "Corrige layout do formulário de login"

# Branch staging para testes internos
eas update --branch staging --message "Testa nova feature de pagamento"

# Rollback para versão anterior
eas update:rollback --branch production --target 3

Controle de versão via dashboard da Expo (https://expo.dev) permite visualizar histórico, reverter atualizações e gerenciar branches.

6. Integração com pipelines de CI/CD

Exemplo de workflow GitHub Actions para build automático:

name: Build e Deploy Automatizado

on:
  push:
    branches: [main]

jobs:
  build-and-submit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - uses: actions/setup-node@v3
        with:
          node-version: 18

      - name: Instalar dependências
        run: npm ci

      - name: Login Expo
        run: eas login --non-interactive --token ${{ secrets.EXPO_TOKEN }}

      - name: Build Android
        run: eas build --platform android --profile production --non-interactive

      - name: Submit Android
        run: eas submit --platform android --profile production --non-interactive

Para GitLab CI:

stages:
  - build
  - submit

build_android:
  stage: build
  script:
    - npm ci
    - eas build --platform android --profile production --non-interactive
  only:
    - main

submit_android:
  stage: submit
  script:
    - eas submit --platform android --profile production --non-interactive
  needs: ["build_android"]

7. Boas práticas e resolução de problemas comuns

Gerenciamento de cache: Acelere builds subsequentes com:

eas build --platform android --profile production --clear-cache false

Erros frequentes e soluções:

  1. Credenciais expiradas: Renove tokens no dashboard da Expo ou execute eas login novamente
  2. Conflitos de versão: Mantenha expo e eas-cli atualizados: npm update -g eas-cli
  3. Falhas de rede: Configure proxy no eas.json:
"cli": {
  "requireCommit": false,
  "promptToConfigurePushNotifications": false
}

Versionamento semântico: Automatize com scripts npm:

"scripts": {
  "version:patch": "npm version patch && eas build --platform all --profile production",
  "version:minor": "npm version minor && eas build --platform all --profile production"
}

Changelog automatizado: Integre com ferramentas como standard-version ou semantic-release para gerar changelogs automaticamente a cada build.

Referências