Como configurar o Fastlane com seu aplicativo React Native
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!
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:
// instala o rbenv
brew install rbenv// configurar o rbenv
rbenv init
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:
rbenv install --list
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:
// checar a versão do ruby
ruby -v// checar a versão atual via rbenv
rbenv version// ver todas as versões instaladas
rbenv versions// saber onde estão localizados os binários
which -a ruby
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
gem install bundler
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
react-native init FastlaneExampleApp
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.
cd FastlaneExampleApp/ios
bundle init
bundle add fastlane
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:
// instalar as dependências
bundle install// atualizar as dependências para a última versão
bundle update
Configurando o fastlane
Com o fastlane instalado, vamos agora iniciar a configuração:
bundle exec fastlane init
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:
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
Essa lane executa 3 actions:increment_build_number
como a própria action diz, incrementa o build number em 1build_app
compila o seu aplicativo através do CLI do Xcodeupload_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
bundle exec fastlane match init
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:
// Cria o certificado e provision de desenvolvimento
bundle exec fastlane match development// Cria o certificado e provision de distribuição
bundle exec fastlane match appstore
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:
bundle exec fastlane match --readonly
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:
1 default_platform(:ios)
2 platform :ios do
3 desc "Push a new beta build to TestFlight"
4 lane :beta do
5 match(
6 type: "appstore",
7 git_url: "git@github.com:owner/certificates.git",
8 readonly: true
9 )
10 increment_build_number(xcodeproj: "FastlaneExampleApp.xcodeproj")
11 sh "cd ../.. && yarn install"
12 gym(scheme: "FastlaneExampleApp", silent: true)
13 testflight
14 end
15 end
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:
1 default_platform(:android)
2
3 platform :android do
4 desc "Runs all the tests"
5 lane :test do
6 sh "cd ../../ && yarn test"
7 end
8
9 desc "Submit a new Beta Build to Google Play"
10 lane :beta do
11 test
12 gradle(task: "clean")
13 gradle(task: "assembleRelease")
14 supply(track: "beta")
15 end
16
17 desc "Deploy a new Release version to the Google Play"
18 lane :deploy do
19 test
20 gradle(task: "clean")
21 gradle(task: "assembleRelease")
22 supply
23 end
24 end
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:
// Rodar os testes através do yarn
bundle exec fastlane android test// Compilar e subir o APK para faixa beta
bundle exec fastlane android beta// Compilar e subir o APK para produção
bundle exec fastlane android deploy
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:
// Remove todos os certificados e provisions de desenvolvimento
bundle exec fastlane match nuke development// Remove todos os certificados e provisions de distribuição
bundle exec fastlane match nuke distribution
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!