Como configurar o Fastlane com seu aplicativo React Native

Luciano Lima
React Brasil
10 min readJul 25, 2018

--

Neste artigo iremos instalar, configurar e usar o fastlane para testar, compilar e distribuir nossos aplicativos iOS e Android de forma simples e automatizada. Não irei contemplar aplicativos criados com o CRNA/Expo.

No momento que este artigo foi escrito, o sistema operacional usado é o Mac OS High Sierra e foram usadas as seguintes versões dos aplicativos:

  • rbenv v1.1.1
  • ruby v2.5.1p57
  • bundler v1.16.2
  • fastlane v2.99.1
  • react-native v.0.56.0
  • react-native-cli v2.0.1

Let's go!

Photo by Ali Yahya on Unsplash — Deixe o PC trabalhar por você

Instalação do fastlane

Antes de mais nada, o fastlane é um programa de linha de comando feito em ruby. O Mac OS vem com o ruby instalado por padrão, porém ele necessita o tempo todo de autorização de root para instalar algumas gems. Por isso, antes de tudo vamos instalar o rbenv que nos permite ter várias versões do ruby instalada e evita que precisemos de acesso root para instalar as gems.

Instalando o rbenv

Para instalar o rbenv basta seguirmos o tutorial do repositório no github. Mas caso você esteja com preguiça, vou listar abaixo o procedimento:

No final, será exibido um comando que você deve colar no arquivo de configuração de seu terminal (.bashrc, .zshrc etc). Após ter finalizado essa etapa, basta reiniciar seu terminal. Para assegurar que o rbenv foi instalado e está devidamente configurado execute no terminal rbenv -v.

Instalando uma versão do ruby

Com o rbenv instalado e configurado, podemos agora adicionar uma versão do ruby para usarmos no lugar do que vem com o Mac OS.

A versão padrão do ruby que vem no Mac OS é a v2.3.7p456. Você pode tanto instalar a mesma versão como pode instalar uma mais nova. Neste artigo iremos instalar a última versão estável. Para listar as versões disponíveis no rbenv para instalação basta executar o seguinte comando:

Serão listadas não somente as versões do ruby, como de outros pacotes que eu nem sei para que servem, sorry! 😅

Escolha a versão que desejar. Para o nosso artigo escolherei a versão 2.5.1. Então agora basta executarmos no terminal rbenv install 2.5.1. E para tornarmos essa versão global executamos rbenv global 2.5.1.

Para checar se está tudo ok você pode fazer o seguinte:

Instalando o bundler

O bundler é, assim como gem, um gerenciador de pacotes. A diferença é que o gem gerencia pacotes de sua máquina e o bundler gerencia pacotes de sua aplicação.

Para instalarmos o bundler, basta executar no terminal

Finalmente… instalando o fastlane!

Agora vamos adicionar o fastlane ao nosso aplicativo. Primeira coisa é termos um aplicativo para adicionarmos o fastlane né? Vou criar um aplicativo para ilustrar nosso exemplo

O Fastlane precisa ser configurado por plataforma, mas as etapas são praticamente as mesmas. Levaremos em consideração a plataforma iOS para seguir com nosso artigo.

Esses comandos irão criar os arquivos Gemfile, Gemfile.lock e adicionar o Fastlane como dependência de nosso projeto. Outros comandos úteis ao longo do projeto:

Configurando o fastlane

Com o fastlane instalado, vamos agora iniciar a configuração:

Ao executarmos a inicialização do Fastlane, será criado um diretório fastlane onde ficarão os arquivos relacionados à sua configuração. Ele irá detectar automaticamente qual a plataforma que estamos configurando (no caso iOS) e fará algumas perguntas:

Inicialização do Fastlane

Escolheremos a opção 2, pois ao mandar o binário para o TestFlight, também estamos enviando-o para a App Store. 😁

As próximas perguntas serão relacionadas ao seu aplicativo. Você deverá informar o Scheme default (geralmente a primeira opção), o Bundle ID (com.example.app por exemplo) e uma conta válida do Apple Developer e do App Store Connect (antigo iTunes Connect) para que seja possível criar os certificados, provisions entre outros arquivos. Aconselho a criar um usuário específico para esse fim.

Com esse usuário que o Fastlane fará todo o processo burocrático de criação de certificados, provisions, envio para o TestFligh e publicação do app na loja.

Se o Bundle ID fornecido não existir no Apple Developer, o Fastlane irá perguntar se você deseja que ele crie para você. Caso seja possível, crie o Bundle ID no Apple Developer antes, porque lá você consegue identificar se ele está disponível ou não.

Caso não tenha um aplicativo criado no App Store Connect, o Fastlane também perguntará se deseja criar um app com o Bundle ID que você forneceu.

Ao fim do processo e algumas confirmações, o Fastlane terá criado 2 arquivos: Appfile e Fastfile. No arquivo Appfile, estão as configurações do aplicativo como Bundle ID, o Apple ID usado para conectar aos serviços da Apple, o ID do aplicativo na App Store Connect e o Team ID que seu usuário e o aplicativo fazem parte. Para ver outras configurações que podem ser adicionadas nesse arquivo veja em https://docs.fastlane.tools/advanced/#appfile.

No arquivo Fastfile, ficam as lanes, que são as ações que o Fastlane pode executar no seu app. Por padrão, ele vem com a lane Beta

Fastfile

Essa lane executa 3 actions:
increment_build_number como a própria action diz, incrementa o build number em 1
build_app compila o seu aplicativo através do CLI do Xcode
upload_to_testflight envia seu aplicativo para o App Store Connect

Essas actions estão todas detalhadas na documentação do Fastlane. Há inúmeras actions para diversas tarefas. Dêem uma boa olhada, tem muita coisa que pode ser automatizada. Inclusive, caso não queira enviar o binário para o TestFlight, há actions para enviar para o Crashlytics, HockeyApp, TestFairy, Appetize entre outros.

Criando certificados e provisions com Fastlane

A melhor parte do Fastlane, quando falamos de projetos iOS, é a automatização de criação de certificados e provisions. Para isso o Fastlane tem a action match.

Por quê o match é tão interessante, você pode estar se perguntando. É porque com ele, não há mais necessidade de ficar criando certificado para cada developer que o projeto tem. Ele permite ter um único certificado de desenvolvimento compartilhado entre todos os integrantes do time. Todos os certificados ficam guardados em um repositório git, assim não há problemas de perder/ter que gerar novamente, gera o provision atualizado para o certificado e os devices cadastrados e muitas outras coisas. Dá um saque lá na documentação.

Antes de tudo é necessário criar um repositório para armazenar os certificados e provisions. Pode chamá-lo de certificates. O ideal é que esse repositório seja privado, mas mesmo sendo público, os arquivos são criptografados antes de serem enviados para o repositório e você define a senha para descriptografá-los. Lembra do usuário que sugeri criarmos um pouco mais acima? Pois ele será bastante útil agora.

No terminal execute

Forneça o endereço do repositório que você criou. Uma dica de segurança é passar uma GIT url para que obrigue a todos os desenvolvedore do time usem SSH para acessar o repositório. Mas uma url HTTPS também serve. Será pedida a senha de criptografia dos arquivos. Ela será usada sempre que for instalar os certificados e provisions pela primeira vez em uma nova máquina.

O Fastlane terá criado ao final um arquivo Matchfile, que contém o endereço do repositório, o certificado default que ele irá baixar. Há algumas linhas comentadas no arquivo referente ao App ID e o usuário. Veja na documentação como poderá usar essas informações.

Com o Matchfile criado, agora iremos criar nossos certificados:

Os certificados e chaves privadas serão armazenados no Keychain, enquanto os provisions serão copiados para o diretório
~/Library/MobileDevice/Provisioning Profiles.

Pronto, a partir daí, em qualquer outra máquina que seja necessário ter os certificados instalados basta executar o comando abaixo e fornecer a senha definida na etapa de match init:

Assim os certificados mais recentes, bem como o provision será adicionado a sua máquina possibilitando compilar o aplicativo e rodar em um device. Um plus é adicionar o match no Fastfile para que ele sempre sincronize os certificados e provisions antes de compilar o projeto. Fica assim:

Explicando… quando iniciar a lane, serão baixados os certificados e provisions, do tipo appstore (produção) e com modo readonly, incrementado o build number em 1, extra adicionei um action sh que vai rodar o yarn install (para garantir que está tudo instalado), gym que é um alias para a action build_app e por fim a action testflight que é um alias para upload_to_testflight. Tudo isso rodando apenas um bundle exec fastlane ios beta.

Com isso fica mais claro perceber que dá para usar o Fastlane quase como um gerenciador de Continuous Integration, rodando testes, compilando, mandando avisos no Slack, entre outras coisas.

No Android…

Para o Android o Fastlane tem algmas limitações. É necessário antes de tudo criar um arquivo key.json que conterá os dados que permitirá o Fastlane acessar a conta do Google Play. Para gerar esse arquivo siga as etapas deste link. Vai gerar o arquivo json e você pode salvar ele como android/app/key.json.

Ao rodar o comando bundle exec fastlane init no diretório android, será solicitado o local onde está o arquivo. Digite app/key.json. Na próxima pergunta, o Fastlane deseja saber se você irá atualizar os dados do aplicativo através dele. Caso afirmativo, ele baixará os metadados e screenshots para o diretório fastlane.

Assim como no iOS, serão criados os arquivos Appfile e Fastfile. Uma diferença para a plataforma iOS é que o Fastlane não tem uma action match para o Android, onde possa gerenciar as keystores do aplicativo. Por conta disso, não há a necessidade de ter um arquivo Matchfile no diretório Android.

Veja os arquivo Appfile e compare com o da plataforma iOS. São parecidos pois contém apenas informações do aplicativo e acesso as contas das lojas.

Já o Fastfile muda um pouco. No Android, já vem 3 lanes configuradas:
test que roda os testes através do gradlew.
beta que compila e envia um APK para o Crashlytics.
deploy que compila e envia o APK para o Google Play.

Para ficar mais condizente com nossa realidade de aplicativo React Native podemos mudar o Fastfile para o seguinte:

Modificamos nossa lane de teste para rodar o test pelo yarn, via gradlew limpamos o projeto, compilamos e em cada lane enviamos para o Google Play.
Na lane beta para a Faixa Beta e na lane deploy para a Faixa de Produção, bastando para isso executar as lanes no terminal:

Informações Extras

Duas informações que esqueci de colocar e que acho que será interessante para quem ler depois. O Fastlane pode ser instalado via HomeBrew, mas tem um motivo para você não fazer isso. O brew instala o Fastlane globalmente e sempre a versão mais recente. Você não tem controle sobre qual versão suas lanes serão compatíveis.

Instalar via bundler permite você fixar uma versão específica além de ser melhor para quem trabalha em times com mais de um desenvolvedor. Além disso, por algum motivo obscuro, executar o Fastlane via bundler é mais rápido do que executar o Fastlane direto. Quem souber o porquê, comenta aí 😉.

Outro ponto que esqueci de comentar é que no caso dos certificados do iOS, você pode revogar e criar novos certificados a qualquer momento. Diferente do Android que você não pode perder de forma alguma o arquivo keystore, com o iOS, a única dependência é que o certificado esteja na conta onde foi criado o Bundle ID do aplicativo. Então a qualquer momento, pode excluir os certificados e criar novos que isso não vai impactar em nada na publicação do seu aplicativo na App Store Connect.

O Fastlane inclusive tem um comando para isso:

Com sua conta limpa, você pode gerar novos certificados e manter um controle maior sobre eles.

Bom, é isso pessoal! Vemos como adicionar, configurar, criar lanes e enviar os binários. Dá para perceber que simplifica bastante integrar o fastlane com algum servidor de CI/CD para automatizar vários processos. Inclusive futuramente falarei em um post: CI/CD de aplicativos React Native com CodePush + Fastlane + Wercker + Bitrise.

Se curtiu deixa uns claps aí. Qualquer sugestão, correção ou dúvida, pode deixar aí nos comentários. Até mais!

--

--

Luciano Lima
React Brasil

Desenvolvedor Web e Mobile. Amante de tecnologia e TI em geral. Além de ser fã de games e mangás!