DEV Community 👩‍💻👨‍💻

Cover image for Como configurar Fastlane para Firebase App Distribution (Android e iOS)
Yago Souza Oliveira
Yago Souza Oliveira

Posted on

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

Top comments (0)

Stop sifting through your feed.

Find the content you want to see.

Change your feed algorithm by adjusting your experience level and give weights to the tags you follow.