Logo

dev-resources.site

for different kinds of informations.

Como configurar Fastlane para Firebase App Distribution (Android e iOS)

Published at
2/16/2021
Categories
fastlane
cicd
firebase
Author
yagoliveira92
Categories
3 categories in total
fastlane
open
cicd
open
firebase
open
Author
13 person written this
yagoliveira92
open
Como configurar Fastlane para Firebase App Distribution (Android e iOS)

Neste post iremos mostrar como configurar o Fastlane para distribuir apps Android e iOS através do Firebase App Distribution. Este artigo é um complemento deste post aqui. Iremos tratar a execução das lanes em um ambiente de CI/CD. É bem similar à execução direto no seu computador, mas em determinados momentos pode ficar confuso. As referências estão no final do artigo.

Configuração no iOS

Instalar Fastlane

Primeiro você deve instalar o fastlane no projeto do iOS fora do Ambiente de CI. A melhor forma é usar o Bundler.

  • Instale o Ruby no seu Mac. A versão do Ruby utilizada pelo Fastlane tem que estar entre a 2.4 e a 2.7;
  • Após, crie um arquivo chamado Gemfile sem extensão. É nesse arquivo que vamos colocar as gems (o Fastlane é uma Gem).
  • Colocado a gem do Fastlane, instalar usando o comando bundle na sua pasta raiz.
source "https://rubygems.org"

gem "fastlane", "~> 2.173"

Enter fullscreen mode Exit fullscreen mode

Feito o bundle e instalando o Fastlane executamos bundle exec fastlane init para iniciar o Fastlane no projeto. Esse comando criará os arquivos do Fastlane dentro do projeto. Algumas perguntas podem ser feitas durante o comando, responda conforme for solicitado (Ex.: ID do Projeto).

Pronto, iniciamos o Fastlane.

Escrevendo o Fastfile (iOS)

O Fastfile é o arquivo onde será colocado toda a sua pipeline. É nele que configuraremos as lanes que serão executadas para gerenciar os certificados, os perfis e enviar para o Firebase.

Primeiro, vamos definir a lane que será executada dentro do CI/CD. Ela que será responsável por chamar todas as demais lanes necessárias.

platform :ios do
    desc "Release app for App Distribution in Firebase"
    lane :send_firebase do

        build_app(
          scheme: 'Runner',
          archive_path: './build/Runner.xarchive',
          export_method: 'ad-hoc',
          output_directory: './build/Runner'
        )

        firebase_app_distribution(
          app: <FIREBASE_APP_ID>,
          groups: 'grupo-ios',
          firebase_cli_token: <FIREBASE_APP_DISTRIBUTION_TOKEN>,
          release_notes_file: 'fastlane/release-notes.txt',
          ipa_path: './build/Runner/Runner.ipa'
        )
    end
end
Enter fullscreen mode Exit fullscreen mode

Aqui podemos definir qual a plataforma que será executada (nesse caso, o iOS), uma descrição (facilita na hora de você ver o que está sendo executado), o nome da Lane e duas actions: o build_app e o firebase_app_distribution.

Como deve ter notado precisaremos de um firebase_cli_token para poder enviar o build para o App Distribution. Você pode criar esse token seguindo esse tutorial aqui.

Nosso projeto é feito em Flutter, a configuração do build_app ficou conforme gerado por ele. Modifique-o conforme sua necessidade.

Agora iremos realizar os outros passos para poder assinar o app e colocar os dispositivos cadastrados dentro do Perfil de Provisionamento.

Como estamos em um ambiente de CI precisamos criar uma keychain para poder instalar todos os certificados. Para isso executamos:

before_all do
  create_keychain(
    name: <KEYCHAIN_NAME>,
    password: <KEYCHAIN_PASSWORD>,
    default_keychain: true,
    unlock: true,
    timeout: 3600,
  )
end
Enter fullscreen mode Exit fullscreen mode

A action before_all irá forçar a criação da Keychain antes de quaisquer outra action ser executada, inclusive da sua lane.
Feito isso, podemos criar nossa Pipeline de forma que:

  • Atualizaremos os dispositivos
  • Criaremos ou faremos download dos certificados
  • Distribuiremos o app assinado

A atualização dos dispositivos é feita com a action register_devices:

lane :update_devices do
  register_devices(
    devices_file: './fastlane/devices.txt'
  )
  profiles
end
Enter fullscreen mode Exit fullscreen mode

Como podem ver, assim que é feito o registro dos dispositivos já chamamos a lane profiles. É nela que vamos criar (ou baixar) os certificados da Apple.

É recomendável que o próprio Fastlane crie e gerencie os certificados em ambiente de CI, porque ele fará todas as ligações entre o certificados, os dispositívos e os perfis de provisionamento. Para isso utilizaremos a action Match.

Para iniciar o Match deve-se executar bundle exec fastlane match init fora do ambiente de CI e seguir as instruções que constam na documentação, escolhendo a melhor forma de armazenar de forma segura esses certificados. São dados três opções: Repositório GIT, Google Cloud ou Amazon S3.
As informações de acesso dos certificados devem ficar armazenadas no Matchfile criado no comando acima.

Iniciando o Match, vamos adicionar a criação (ou o download) dos perfis no Fastfile

lane :profiles do |options|
  match(
    app_identifier: <APP_IDENTIFIER>,
    type: 'development',
    readonly: false,
    force_for_new_devices: true,
    force:options[:force],
    keychain_name: <KEYCHAIN_NAME>,
    keychain_password: <KEYCHAIN_PASSWORD>
  )

  match(
    app_identifier: <APP_IDENTIFIER>,
    type: 'adhoc',
    readonly: false,
    force_for_new_devices: true,
    force:options[:force],
    keychain_name: <KEYCHAIN_NAME>,
    keychain_password: <KEYCHAIN_PASSWORD>
  )
end
Enter fullscreen mode Exit fullscreen mode

Cada Match vai criar o certificado e perfil dos tipos development e adhoc. Usaremos o tipo adhoc para o build que será enviado ao App Distribution.

Certo, estamos quase lá. Agora vamos realizar a etapa onde o Fastlane irá acessar e criar os certificados dentro da AppStore Connect. Para isso iremos criar uma API Key dentro da AppStore Connect. Siga esse tutorial para poder criar a key

Com a Key criada vamos inserir no início da nossa Lane:

app_store_connect_api_key(
  key_id: <key_id>,
  issuer_id: <issuer_id>,
  key_filepath: <caminho_para_chave>,
  in_house: false,
)
Enter fullscreen mode Exit fullscreen mode

Ufa! Depois disso tudo teremos nosso Fastfile completo:

default_platform(:ios)

platform :ios do
    before_all do
      create_keychain(
        name: <KEYCHAIN_NAME>,
        password: <KEYCHAIN_PASSWORD>,
        default_keychain: true,
        unlock: true,
        timeout: 3600,
      )
    end

    lane :update_devices do
        register_devices(
          devices_file: './fastlane/devices.txt'
        )
        profiles
    end

    lane :profiles do |options|
        match(
          app_identifier: <APP_IDENTIFIER>,
          type: 'development',
          readonly: false,
          force_for_new_devices: true,
          force:options[:force],
          keychain_name: <KEYCHAIN_NAME>,
          keychain_password: <KEYCHAIN_PASSWORD>
        )

        match(
          app_identifier: <APP_IDENTIFIER>,
          type: 'adhoc',
          readonly: false,
          force_for_new_devices: true,
          force:options[:force],
          keychain_name: <KEYCHAIN_NAME>,
          keychain_password: <KEYCHAIN_PASSWORD>
        )
    end

    desc "Release app for App Distribution in Firebase"
    lane :send_firebase do

        app_store_connect_api_key(
          key_id: <KEY_ID>,
          issuer_id: <ISSUER_ID>,
          key_filepath: <KEY_PATH>,
          in_house: false,
        )

        update_devices

        build_app(
          scheme: 'Runner',
          archive_path: './build/Runner.xarchive',
          export_method: 'ad-hoc',
          output_directory: './build/Runner'
        )

        firebase_app_distribution(
          app: <FIREBASE_APP_ID>,
          groups: 'grupo-ios',
          firebase_cli_token: <FIREBASE_APP_DISTRIBUTION_TOKEN>,
          release_notes_file: 'fastlane/release-notes.txt',
          ipa_path: './build/Runner/Runner.ipa'
        )
    end
end

Enter fullscreen mode Exit fullscreen mode

Podemos ver todo nosso Pipeline dentro da Lane send_firebase:

  • Criação da Keychain
  • Conexão com a AppStore
  • Atualização dos Dispositivos
  • Criação / Download e Instalação dos Certificados e Perfis de Provisionamento
  • Build
  • Entrega para o App Distribution.

Configuração no Android

Instalação do Fastlane

Primeiro você deve instalar o fastlane no projeto do Android fora do Ambiente de CI. A melhor forma é usar o Bundler.

  • Instale o Ruby no seu PC. A versão do Ruby utilizada pelo Fastlane tem que estar entre a 2.4 e a 2.7;
  • Após, crie um arquivo chamado Gemfile sem extensão. É nesse arquivo que vamos colocar as gems (o Fastlane é uma Gem).
  • Colocado a gem do Fastlane, instalar usando o comando bundle na sua pasta raiz.
source "https://rubygems.org"

gem "fastlane", "~> 2.173"

Enter fullscreen mode Exit fullscreen mode

Feito o bundle e instalando o Fastlane damos bundle exec fastlane init para iniciar o Fastlane no projeto. Esse comando criará os arquivos do Fastlane dentro do projeto. Algumas perguntas podem ser feitas durante o comando, responda conforme for solicitado (Ex.: ID do Projeto).

Pronto, iniciamos o Fastlane.

Escrevendo o Fastfile (Android)

Diferente do iOS, no Android não precisamos de nenhum certificado ou coisas do aspecto para poder enviar nosso APK para o Firebase Distribution. Todo nosso Fastfile compreende:

default_platform(:android)

platform :android do
    desc "Release app for App Distribution in Firebase"
    lane :homologacao_firebase do
        firebase_app_distribution(
            app: <FIREBASE_APP_ID_HOMOLOGACAO>,
            groups: "grupo-android",
            firebase_cli_token: <FIREBASE_APP_DISTRIBUTION_TOKEN>,
            release_notes_file: "fastlane/release-notes.txt",
            apk_path: ".path/to/app.apk"
        )
    end
end
Enter fullscreen mode Exit fullscreen mode

Como deve ter notado precisaremos de um firebase_cli_token para poder enviar o build para o App Distribution. Você pode criar esse token seguindo esse tutorial aqui.

Pronto. Isso é tudo o que precisa para enviar o App Android ao Firebase App Distribution.

Ficamos por aqui. Quaisquer dúvida, sugestão ou erro que tenha encontrado terei total prazer em ajudar e corrigir.

Referências

Distribuir apps para Android para testadores com o fastlane, GOOGLE. Disponível em https://firebase.google.com/docs/app-distribution/android/distribute-fastlane#google-acc-fastlane;

Material de consulta sobre a CLI do Firebase, GOOGLE. Disponível em https://firebase.google.com/docs/cli#cli-ci-systems

Getting started with fastlane for iOS, FASTLANE DOCS. Disponível em https://docs.fastlane.tools/getting-started/ios/setup/

Getting started with fastlane for Android, FASTLANE DOCS. Disponível em https://docs.fastlane.tools/getting-started/android/setup/

Photo by John Torcasio on Unsplash

fastlane Article's
30 articles in total
Favicon
From days to minutes: Build and publish React Native apps using Fastlane and Github Actions
Favicon
[Boost]
Favicon
The Ultimate Guide to Automating Android APK Builds and Firebase Distribution with Fastlane 🚀
Favicon
From Manual to Automatic: The Magic of CI/CD Pipelines! 🤯
Favicon
Protegendo credenciais em automatização de builds no Fastlane com Variáveis de Ambiente
Favicon
GUI for fastlane?
Favicon
Steps to Add and Upload testflight Using Fastlane
Favicon
Simplifying Flutter Deployment with FastLane
Favicon
🚀 Added new YouTube series on "Flutter CI/CD with GitLab and Fastlane" !
Favicon
Automate publishing your android app to Google Play Store with Fastlane and Github Actions
Favicon
GitHub Actions CI/CD for Flutter Fastlane (iOS) with possible mistakes
Favicon
Criando uma conta e configurando um projeto no CodeMagic
Favicon
Automatically add new devices to the Apple Developer Portal (GitHub Actions & Fastlane)
Favicon
Fastlane: 深入浅出一看你就懂
Favicon
Fastlane: iOS 和 Android 的自动化构建工具
Favicon
Fastlane with React Native — Part-1
Favicon
Deploy iOS Application to AppCenter via Github Actions (Manual Code SignIn)
Favicon
Single point versioning with Fastlane for React Native
Favicon
Unable to use Fastlane on macOS Monterey 12.1
Favicon
Automating Flutter App Versioning Using Fastlane Plugin
Favicon
How To Automate App Releases using Fastlane and SemVer for Hybrid Applications
Favicon
Building and Deploying Flutter Apps from CI with Fastlane: How to Reuse Code Efficiently
Favicon
How to run Fastlane and GitLab with AppStore Connect API
Favicon
Automating mobile application deployments using Fastlane and CI/CD tools
Favicon
React Native e2e tests and Automatic Deploys (Detox + Fastlane + CircleCI)
Favicon
Deploy React Native app on Playstore with Fastlane and Github Actions ( 1 / 2 )
Favicon
Deploy React Native app on Playstore with Fastlane and Github Actions ( 2 / 2 )
Favicon
CI/CD in iOS Development
Favicon
Como configurar Fastlane para Firebase App Distribution (Android e iOS)
Favicon
Flutter + Fastlane + Github Actions

Featured ones: