Gerência de Projetos Dev & TI

6 fev, 2018

iOS Provisioning Profiles automatizados com Fastlane cert e sigh

Publicidade

Mexer com provisioning profiles para o iOS é complicado, mas é uma tarefa que todo mundo vai fazer quando precisar testar em aparelhos físicos. Eu simplifiquei e resumi o processo o máximo possível nesse artigo (sugiro a leitura antes), mas ainda dá muito trabalho fazer todo o processo manualmente. O processo tem muita repetição: certificados expiram, profiles expiram, novos dispositivos precisam ser cadastrados, etc. E se pudéssemos automatizar todo esse processo chato? É exatamente o que vou mostrar com o fastlane.

fastlane

O que é o fastlane? A definição do site diz:

fastlane é a forma mais fácil de automatizar beta tests e distribuições de aplicativos Android e iOS. Ele cuida de todas as tarefas entediantes, como gerar screenshots, lidar com assinatura do app e distribuir sua aplicação.

Eles não estão exagerando. O fastlane é realmente poderoso e uma mão na roda, ele faz tudo o que promete mesmo. É a ferramenta perfeita para quem desenvolve aplicativos e precisa lidar com essas tarefas.

Neste artigo, eu decidi automatizar o processo que eu descrevi de criação de iOS provisioning profiles para testar aplicativos. Em vez de acessar o portal para fazer tudo (e correr o risco de gerar aquela bagunça de arquivos), quero que o fastlane faça tudo certinho pra mim. Para isso, vou usar essencialmente dois “processos” dele: o cert e o sigh.

Instalação

Atualmente, o fastlane não roda no Windows, mas se você desenvolve para iOS, provavelmente tem um Mac à sua disposição. Além disso, o fastlane funciona perfeitamente com ferramentas de CI, como o Visual Studio App Center.

O jeito mais fácil de instalar o fastlane, é utilizando o Homebrew no seu Mac. Se não tiver o Homebrew instalado, faça isso agora, vai facilitar sua vida para sempre no Mac.

brew cask install fastlane

Se precisar de outra maneira de instalá-lo, veja as possibilidades na documentação.

Caso você já tenha o fastlane instalado, ele vai solicitar que você o atualize com o comando:

sudo gem install fastlane

Depois disso você também precisa setar duas variáveis de ambiente essenciais para que o fastlane funcione corretamente:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

Com o fastlane instalado você já pode começar a configurar suas rotinas.

Funcionamento

O fastlane usa o conceito de “lanes” (faixas) para automatizar suas rotinas. A ideia é que você tenha lanes para cada tipo de distribuição do seu app, e defina todas as tarefas que precisam ser executadas. Por exemplo, na lane “dev” eu quero apenas assinar meu app para testar no meu device, já na lane “beta” eu quero assinar o app com AdHoc, fazer upload pro HockeyApp e notificar o Slack do meu time.

Para começar a configurar e instrumentar o fastlane, precisamos criar uma pasta fastlane na raíz do nosso projeto. Dentro dela utilizaremos arquivos de convenção. Esses arquivos são arquivos Ruby (linguagem em que o fastlane é feito), bem simples.

Appfile

Este arquivo é opcional, mas é muito útil. Quase toda tarefa do fastlane precisa do seu e-mail no portal developer da Apple e do seu App ID. Para não repetir essa informação toda vez, o fastlane permite que você as defina num arquivo Appfile (sem extensão mesmo) dentro da pasta fastlane, ele sempre usará as informações desse arquivo para executar os comandos do seu projeto.

Um Appfile simples pode começar assim:

# The Appfile can be used to specify information that's used across all fastlane
# tools, like your username or the app's bundle identifier.
#
# For more details, check out the documentation at:
# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Appfile.md
 
app_identifier "br.com.meuappid"
apple_id "meuemailnoportal@gmail.com"

Com isso, o fastlane já tem as infos básicas para acessar o portal da Apple. Ele pedirá sua senha, quando necessário, e fará todo o processo que você pedir.

Fastfile

O arquivo mais importante do fastlane é o Fastfile, ele também é um arquivo Ruby que fica na pasta fastlane, e é nele em que as lanes são definidas. Veja um exemplo simples de arquivo Fastfile:

# More documentation about how to customize your build
# can be found here:
# https://docs.fastlane.tools
fastlane_version "2.71.1"
 
default_platform :ios
 
# Fastfile actions accept additional configuration, but
# don't worry, fastlane will prompt you for required
# info which you can add here later
lane :dev do
  # sync code signing
  match
  # build your iOS app
  build_app(export_method: "ad-hoc")
end
 
lane :beta do
  # build your iOS app
  build_app(
    export_method: "ad-hoc"
  )
 
  # upload to HockeyApp
  hockey(
    api_token: "YOUR_API_TOKEN"
  )
 
  slack(
     slack_url: "https://hooks.slack.com/services/IDS"
  )
end

Nele podemos ver algumas coisas interessantes. É possível definir valores padrões para todas as lanes, como a plataforma padrão, e a versão do fastlane necessária. Além disso, é possível definir várias lanes no mesmo arquivo, instrumentando todas as ações necessárias.

Você pode começar um arquivo Fastfile vazio ou pode utilizar o getting started da própria Fabric, neste link.

Muitas das configurações feitas para o fastlane podem ser feitas com variáveis de ambiente, muito útil para ferramentas CI. Caso tenha interesse em ver quais variáveis estão disponíveis, consulte a documentação.

Por que usar (só) cert e sigh?

Antes de começar a mostrar como configurei o cert e o sigh, algumas explicações:

Como disse anteriormente, neste artigo estou interessado em gerar certificados e iOS provisioning profiles que possa compartilhar com meu time automaticamente, somente isso. O fastlane também é capaz de gerar o App ID automaticamente, utilizando o produce, mas eu não quis fazer isso no momento.

O fastlane possui outro processo chamado match, que é muito mais mágico. Em 99% dos cenários, você vai preferir o match, pois ele já engloba o cert e o sigh e faz muito mais, como gerenciar o versionamento dos arquivos de certificados, chaves .p12 e iOS provisioning profiles. No meu cenário ele não era o que eu precisava, por isso resolvi utilizar o cert e o sigh separadamente.

Por último, você deve ter ouvido que várias ferramentas usam o fastlane, uma delas é o próprio Visual Studio for Mac, e ela funciona perfeitamente, porém, no meu caso, essa integração não me servia. O motivo é que os arquivos gerados não são exportados, portanto não seria possível compartilhá-los com as pessoas do meu time ou outras máquinas sem que eu exportasse tudo manualmente.

cert

O cert é o processo que gera e instala os certificados necessários para o desenvolvimento do seu app. Configurá-lo é bem simples, na minha lane de dev ele ficou assim:

lane :dev do
  cert(
      development: true,
      output_path: "keys/iOS/Development/"
  )
end

Eu só o instruí para criar um certificado para desenvolvimento, e depois exportar os arquivos gerados para a pasta que especifiquei. Com isso configurado, basta chamar o fastlane passando a lane que quero rodar:

fastlane dev

Ele pede minha senha do portal da Apple e executa:

O que o fastlane fez pra mim:

  • Verificou se existia um certificado válido que eu pudesse usar;
  • Como não existia, ele criou um;
  • Instalou o certificado no meu Keychain para que eu pudesse usá-lo;
  • Exportou os arquivos na pasta que pedi para que eu pudesse versioná-los e compartilhá-los com meu time.

Tudo isso levou 4 segundos! E a graça é que ele não fez nenhuma bagunça e já deixou tudo pronto para utilização no meu app. Além disso, lembre-se que ele é capaz de perceber que um certificado está expirado, e automaticamente criar outro, ou seja, no futuro, quando isso ocorrer, eu só preciso executar o mesmo comando novamente! Isso é maravilhoso.

Na versão 2.71.1, o fastlane está exportando somente o arquivo .cer. Isso é um bug e deve ser corrigido nas versões futuras.

sigh

O sigh é o processo que gera e instala os iOS provisioning profiles, lembrando que este é o arquivo que amarra o App ID, devices e certificados. O App ID eu criei manualmente, mas e os devices? Eu não quero cadastrá-los manualmente. O fastlane também nos ajuda! Ele possui a rotina register_devices.

Eu decidi configurá-lo com um arquivo de texto. Dessa forma, quando quisesse adicionar novos devices eu só precisava editar este arquivo. Criei o arquivo devices.txt, conforme o padrão do arquivo pedido pela Apple aqui. Os campos são separados por TAB (\t).

Device ID   Device Name
A123456789012345678901234567890123456789    iPhone SE Maria
B123456789012345678901234567890123456789    iPhone 5 João

Na minha lane eu apenas adicionei esta instrução, após o cert:

register_devices(
      devices_file: "fastlane/devices.txt"
  )

Por último, configurei o sigh para fazer a criação do provisioning profile pra mim.

sigh(
      development: true,
      output_path: "keys/iOS/Development/",
      cert_id: "CERT_ID_PASSO_ANTERIOR",
      provisioning_name: "Meu Profile",
      filename: "DevelopmentProvisioningProfile.mobileprovision"
  )

Novamente estou instruindo o fastlane a criar um iOS provisioning profile de desenvolvimento, passando a pasta onde ele deverá exportá-lo. Também fixei o nome do arquivo gerado, e pedi para ele vincular apenas o certificado gerado do passo anterior. Não é necessário fixar o certificado, se você não fizer isso, ele vai vincular todos os certificados do seu portal no seu profile.

Pronto, agora é só executar a lane de novo e esperar ele gerar tudo, inclusive o device. Isso tudo leva menos de 10 segundos, e eu tenho todos os arquivos na minha pasta para que eu possa versioná-los.

Juntando tudo

O resultado final da minha lane de dev ficou assim:

# More documentation about how to customize your build
# can be found here:
# https://docs.fastlane.tools
fastlane_version "2.71.1"
 
default_platform :ios
 
lane :dev do
  cert(
      development: true,
      output_path: "keys/iOS/Development/"
  )
  register_devices(
      devices_file: "fastlane/devices.txt"
  )
  sigh(
      development: true,
      output_path: "keys/iOS/Development/",
      cert_id: "MEU_CERT_ID",
      provisioning_name: "Meu Profile",
      filename: "DevelopmentProvisioningProfile.mobileprovision"
  )
end

Agora é só abrir as opções de build do iOS no Visual Studio for Mac (ou no XCode caso seu projeto não seja Xamarin) e selecionar o signing identity gerado:

Em conjunto com o Appfile, tudo que eu faço quando meus certificados ou profiles expiram ou se corrompem, ou uso uma nova máquina, ou preciso adicionar um novo device é:

fastlane dev

E tudo é feito automaticamente! Como eu vivi sem isso antes?

Conclusão

O fastlane é incrivelmente prático, e é tão fácil de configurar que você se pergunta como não utilizou isso desde sempre. Com ele, gerar certificados, iOS provisioning profiles e cadastrar devices não é mais chato, e leva menos de um minuto. O ganho de produtividade e organização é altíssimo.

O fastlane ainda faz muito mais do que isso, ele tira fotos do seu app, gera imagens para lojas, faz upload automático dos binários para as lojas e muito mais. Por hora, era isso que eu precisava, provavelmente nos próximos passos devo usar outras rotinas e volto a compartilhar.

E no seu projeto, no que o fastlane pode ajudar?

Imagem usada no post: Pexels

***

Este artigo foi produzido em parceria com a Lambda3. Leia outros conteúdos no blog da empresa: blog.lambda3.com.br