Mobile

CI/CD mobile com React Native, Expo e GitLab: como automatizar build e release sem perder controle

Guia pratico para montar pipeline mobile com Expo/EAS e GitLab, separando build, submissao, segredos, credenciais e gate de producao.

Guia de leitura

O que esta leitura cobre

Use os pontos abaixo como mapa para navegar pelo artigo, comparar sintomas, riscos e proximos passos antes de aplicar qualquer decisao tecnica.

  1. 011. Antes de colocar no CI, o app precisa fechar a primeira configuracao local
  2. 022. Pipeline mobile comeca na separacao de perfis, nao no YAML
  3. 033. O segredo mais importante do fluxo nao fica no codigo
  4. 044. Quando a Apple entra no meio, o CI tambem precisa de caminho para reparar credenciais
  5. 055. Build, submissao e publicacao nao sao a mesma etapa

Muita equipe consegue colocar um app React Native no ar localmente, gerar uma build manual e ate publicar uma versao de teste. O problema aparece quando isso precisa virar rotina previsivel. O que antes era uma sequencia de cliques, credenciais espalhadas e anotacoes no chat passa a influenciar prazo, risco operacional e qualidade do release. Sem um fluxo de CI/CD, a equipe descobre tarde demais que gerou o binario errado, misturou ambiente, expos segredo no lugar errado ou liberou producao sem um gate claro.

Em app corporativo, a pipeline nao serve apenas para poupar trabalho manual. Ela existe para padronizar o que ja deveria ser verdade toda vez: build profile correto, credenciais coerentes, logs de execucao, submissao rastreavel, aprovacao humana nos pontos sensiveis e evidencia de qual release candidate realmente foi para a loja. Quando isso falha, o dano nao fica no DevOps. Ele respinga em suporte, backend, produto e no proprio usuario final.

Este guia organiza um caminho pratico para estruturar CI/CD mobile com React Native, Expo, EAS e GitLab. A proposta e automatizar bastante sem transformar a publicacao do app em um botao perigoso. O foco aqui e separar build, submissao e liberacao, proteger segredos, reduzir retrabalho na loja e amarrar melhor o ciclo entre codigo, binario e operacao.

1. Antes de colocar no CI, o app precisa fechar a primeira configuracao local

A documentacao oficial da Expo e clara: para rodar eas build em modo nao interativo no CI, o projeto precisa primeiro passar por uma build bem-sucedida localmente em cada plataforma que voce quer suportar. Isso inicializa o projeto no EAS, gera projectId, cria ou ajusta eas.json, popula metadados nativos como android.packageName e ios.bundleIdentifier e garante que as credenciais de build existam.

Esse detalhe parece pequeno, mas muda bastante o fluxo. Se a equipe joga o projeto direto no GitLab sem ter fechado essa base local, a pipeline vira lugar de descoberta de configuracao faltante. Em vez de automatizar, ela comeca a falhar por falta de preparo do app. Por isso vale tratar o artigo ambientes e build profiles no app como pre-requisito da pipeline.

2. Pipeline mobile comeca na separacao de perfis, nao no YAML

Antes de pensar em estagios e jobs, e preciso deixar claro quais binarios sua operacao realmente precisa. Em geral, app corporativo trabalha com pelo menos tres trilhas:

  • development: build de trabalho tecnico e integracao nativa;
  • preview: build para validacao funcional e homologacao;
  • production: build candidata a beta, review e loja.

Sem essa separacao, a pipeline vira um atalho perigoso para gerar apps parecidos demais e com destino confuso. O ideal e que eas.json e a configuracao do app expressem isso com clareza, de modo que o GitLab apenas acione o perfil certo. Se o perfil esta errado, o erro nao e do CI. E do desenho de release.

Tambem vale decidir cedo se a pipeline vai produzir apenas o binario ou se vai acionar submissao para TestFlight e Google Play. Misturar tudo em um unico job costuma reduzir visibilidade justamente no momento em que a equipe mais precisa entender o que aconteceu.

3. O segredo mais importante do fluxo nao fica no codigo

Para autenticar a pipeline com a conta Expo, a Expo recomenda usar um personal access token em EXPO_TOKEN. Esse token nao deve entrar em .env versionado, muito menos em EXPO_PUBLIC_. Ele pertence a configuracao de CI e precisa ser tratado como credencial operacional.

No GitLab, as variaveis de CI/CD podem ser do tipo Variable ou File, com escopo por ambiente, alem das opcoes de protecao e mascaramento. Essa combinacao ajuda bastante em app mobile porque alguns itens sao texto simples, enquanto outros, como uma chave Apple em arquivo .p8, combinam melhor com variavel do tipo arquivo. Na pratica, um desenho seguro costuma seguir esta linha:

  • EXPO_TOKEN como variavel mascarada e protegida;
  • segredos apenas de producao restritos a branch ou tag protegida;
  • arquivos sensiveis, como chave de App Store Connect, armazenados como variavel do tipo arquivo;
  • escopo por ambiente quando preview e production exigem configuracoes distintas.

Se a equipe ainda esta amadurecendo esse tema, vale revisar tambem segredos e variaveis de ambiente. O principio e o mesmo: segredo operacional nao entra no bundle, nao entra no repositorio e nao vira improviso de ultima hora.

4. Quando a Apple entra no meio, o CI tambem precisa de caminho para reparar credenciais

A Expo tambem documenta um caso importante para iOS: se a pipeline precisar reparar credenciais, como um provisioning profile que precisa ser assinado novamente, o CI pode precisar de uma chave da App Store Connect. Nesse fluxo entram variaveis como EXPO_ASC_API_KEY_PATH, EXPO_ASC_KEY_ID, EXPO_ASC_ISSUER_ID, EXPO_APPLE_TEAM_ID e EXPO_APPLE_TEAM_TYPE.

Isso nao significa que toda pipeline precisa carregar esse bloco desde o primeiro dia. Significa que o time deve saber onde esse requisito aparece, para nao descobrir no meio de um release urgente que a automatizacao iOS depende de credencial que ninguem organizou. Quando essa chave existe, o GitLab tende a funcionar melhor com a API key armazenada como variavel de arquivo.

5. Build, submissao e publicacao nao sao a mesma etapa

Um erro comum em times pequenos e tratar tudo como uma unica palavra: publicar. Na pratica, o fluxo tem pelo menos tres camadas diferentes:

  1. gerar o binario;
  2. submeter o binario a uma trilha de teste ou a uma loja;
  3. liberar de fato para revisao ampla ou para a base final.

A Expo separa bem isso entre EAS Build e EAS Submit. A documentacao do EAS Submit destaca que ele envia binarios Android e iOS para Google Play e App Store Connect pela linha de comando, reduz upload manual e pode ser disparado por CLI, depois de uma build ou por servico de CI/CD. Em outras palavras: o build nao precisa carregar a responsabilidade de distribuir sozinho.

Esse desenho permite pipelines mais legiveis. Por exemplo:

  • um job gera preview build para validacao interna;
  • outro job gera release candidate;
  • um job separado sobe Android para internal testing;
  • outro envia iOS para TestFlight;
  • o passo de loja oficial continua protegido por aprovacao humana.

Essa separacao conversa diretamente com beta real antes da loja, porque o objetivo nao e mandar tudo para producao mais rapido. E validar melhor antes de abrir a comporta.

6. O comando automatizado precisa ser previsivel e silencioso

Para CI em outros servicos, a Expo documenta o uso de npx eas-cli build --platform all --non-interactive --no-wait. O modo nao interativo evita prompts em pipeline, enquanto --no-wait encerra o job depois de acionar a build, deixando o processamento pesado no EAS.

Isso e util quando o objetivo do GitLab e registrar a intencao do build, validar se a autenticacao e o perfil estao corretos e apontar para a URL da execucao no dashboard do EAS. Em vez de travar runner por tempo demais, a equipe passa a acompanhar a build pelo proprio painel da Expo e cruza isso com a rastreabilidade da pipeline.

Ao mesmo tempo, previsibilidade aqui significa nao exagerar. Nem todo push precisa gerar binario de producao. Um fluxo maduro costuma reservar build mais cara para merge na branch principal, tag de release ou acionamento manual controlado.

7. Um desenho simples de pipeline para app corporativo costuma ser suficiente

Na pratica, muitos times pequenos conseguem operar bem com uma linha parecida com esta:

  • validar: lint, TypeScript, testes unitarios e checagens de contrato;
  • build preview: gera binario de homologacao quando a branch principal recebe mudancas relevantes;
  • build release candidate: gera binario de producao para teste real;
  • submit beta: envia Android para internal testing e iOS para TestFlight;
  • gate de producao: job manual protegido para submissao final ou ampliacao do rollout.

Esse modelo ja entrega varias vantagens sem virar engenharia demais: separa intencao, organiza evidencias, deixa rastreavel qual commit gerou qual binario e cria pontos claros para suporte, QA e produto entrarem no fluxo.

Quando o app depende de backend em evolucao, vale cruzar isso com compatibilidade entre app e API. A pipeline so ajuda de verdade quando a estrategia de versao tambem esta clara.

8. A parte sensivel do release merece gate humano, nao automatismo cego

A documentacao do GitLab permite exigir confirmacao para jobs manuais com manual_confirmation e tambem proteger manual jobs por ambiente. Isso ajuda bastante em mobile porque a etapa mais arriscada nem sempre e gerar binario. Muitas vezes o risco real esta em subir o binario certo para a trilha errada, reenviar para loja cedo demais ou liberar um passo de producao sem que backend e suporte estejam alinhados.

Por isso, vale tratar jobs de producao como jobs manuais protegidos, associados ao ambiente production e reservados a quem realmente pode aprovar release. Quando o GitLab usa ambiente protegido, fica mais claro quem pode acionar aquela etapa. E quando o job manual e bloqueante, a pipeline tambem comunica melhor que ainda ha uma aprovacao operacional pendente.

Esse ponto costuma ser subestimado. Em app mobile, erro de liberacao nao some com rollback instantaneo do mesmo jeito que em web. Entao vale gastar um pouco mais de cuidado antes do clique final.

9. Credencial de assinatura e credencial de submissao precisam estar organizadas

A documentacao de credenciais da Expo lembra que apps distribuidos em loja precisam estar assinados. No Android, isso passa por keystore e pelo fluxo de App Signing do Google Play. No iOS, passa pelos certificados e perfis de distribuicao correspondentes. A grande armadilha aqui e confundir autenticacao da pipeline com assinatura do aplicativo. Sao camadas diferentes.

Em outras palavras:

  • EXPO_TOKEN autentica a pipeline com a conta Expo;
  • credenciais Android e iOS permitem gerar binario assinado;
  • credenciais de App Store Connect ou Play Console entram na parte de submissao;
  • permissoes de GitLab controlam quem pode disparar o que.

Quando tudo isso fica misturado em um unico lugar ou na memoria de uma pessoa, a operacao ganha fragilidade demais.

10. EAS Submit ajuda, mas a loja continua tendo suas regras

O EAS Submit reduz upload manual, mas nao elimina as exigencias de cada ecossistema. A propria documentacao da Expo lembra que o Google exige pelo menos um primeiro envio manual antes de liberar algumas automacoes via API. Tambem e importante separar envio de revisao. O binario pode chegar a uma trilha ou ao App Store Connect, mas o time ainda precisa fechar metadata, review notes, privacidade e estrategia de rollout.

Por isso, depois que a pipeline consegue subir binario para teste ou loja, a proxima camada continua sendo editorial e operacional. E ali entram app review, privacidade e metadata e publicacao oficial.

11. Observabilidade precisa andar junto da pipeline

Uma pipeline boa nao termina quando o build sobe. Ela tambem precisa facilitar a leitura do que aconteceu depois. O minimo esperado e que cada release candidate fique ligado a commit, perfil, trilha de distribuicao e observabilidade. Assim, quando surgir crash, falha de login ou regressao de upload, o time sabe rapidamente qual binario investigar.

Na pratica, isso pede pelo menos:

  • versao e build number rastreaveis no app e no suporte;
  • registro claro de qual job gerou qual release candidate;
  • monitoramento de crash, erro de API e funil apos distribuicao;
  • capacidade de segurar ou ampliar rollout conforme os sinais.

O artigo observabilidade do app em producao entra aqui como parte do mesmo sistema. CI/CD sem leitura pos-release vira esteira de binario, nao esteira de confianca.

12. Checklist minimo para um CI/CD mobile que nao vire improviso caro

  1. Fechar uma build local bem-sucedida antes de levar eas build para o CI.
  2. Definir build profiles claros para development, preview e production.
  3. Guardar EXPO_TOKEN e demais credenciais apenas nas variaveis de CI.
  4. Usar variavel mascarada, protegida e com escopo quando fizer sentido.
  5. Separar build de submissao para evitar jobs gigantes e pouco legiveis.
  6. Decidir quais eventos geram preview, release candidate e submit beta.
  7. Proteger jobs de producao com confirmacao manual e ambiente protegido.
  8. Rastrear commit, build number, trilha e responsavel pela liberacao.
  9. Amarrar a pipeline a beta real, review de loja e observabilidade.

13. Quando vale um diagnostico tecnico

Se hoje a equipe ainda depende de um notebook especifico, de login espalhado ou de uma sequencia dificil de repetir para publicar o app, o problema nao esta so no YAML. Falta um processo tecnico comum entre app, backend, credenciais e release. Nessa hora, um diagnostico tecnico ajuda a desenhar a pipeline com menos improviso e mais previsibilidade, sem tentar copiar estruturas enormes que nao combinam com o porte do time.

O melhor CI/CD mobile nao e o mais sofisticado. E o que permite gerar, validar, submeter e liberar o app certo com o minimo de duvida operacional.

Referencias editoriais: Expo - Trigger builds from CI, Expo - EAS Submit, Expo - App credentials, GitLab Docs - CI/CD variables e GitLab Docs - Control how jobs run.

Glossario conectado

Termos tecnicos desta leitura

Alguns conceitos aparecem com frequencia neste tema. Abrir o glossario ajuda a comparar definicoes, exemplos e leituras relacionadas sem sair do contexto do artigo.

MobileBuild profileConfiguracao de build usada para definir como um binario sera gerado em cada ambiente, como development, preview ou production.DevOpsCI/CDPraticas de integracao e entrega continuas para automatizar build, testes e deploy com mais previsibilidade.MobileEAS SubmitServico da Expo para enviar binaries Android e iOS para Google Play Console e App Store Connect pela linha de comando, padronizando a etapa final de submissao.MobileEXPO_TOKENPersonal access token usado para autenticar a pipeline com a conta Expo ao executar comandos do EAS em CI.MobilePreview buildBuild interna ou de homologacao distribuida para teste real, normalmente apontando para ambiente de validacao e usada antes do release final.DevOpsManual jobJob de pipeline que exige acionamento humano explicito antes de rodar, util para etapas sensiveis como deploy ou submissao final.
Continue a análise

Próximos passos para aprofundar o tema.

Veja conteúdos próximos e materiais práticos para transformar a leitura em uma revisão mais objetiva.

Mobile

Contrato de API para app React Native: Spring Boot sem retrabalho no mobile

Guia pratico para desenhar APIs Spring Boot que funcionam bem com apps React Native, cobrindo erros, paginacao, retry, idempotencia e versao.

Ler artigo
Mobile

Seguranca em app React Native corporativo: tokens, dados sensiveis e API

Guia pratico para proteger tokens, dados locais, logs, deep links e chamadas de API em apps corporativos React Native.

Ler artigo
Mobile

Navegacao autenticada no app React Native: rotas por perfil sem bagunca

Guia pratico para organizar login, sessao, rotas protegidas, perfil de acesso e deep links em apps corporativos React Native.

Ler artigo

Converse sobre seu cenário técnico.

Envie sua dúvida ou contexto para avaliarmos o melhor caminho.

Prefere falar direto?

Tambem atendemos pelo WhatsApp em (12) 98855-9188.

Falar no WhatsApp

Ao enviar, você concorda que a RM Porto Tech utilize seus dados para responder ao contato solicitado.

WhatsApp(12) 98855-9188