Automatizando tarefas com o fastlane

Automatizando tarefas com o fastlane

O fastlane é um conjunto de ferramentas que automatiza o processo de compilação, testes, entrega para homologação e publicação de aplicativos para iOS. Também permite que o processo seja realizado em uma máquina remota, que possa ser iniciado por pessoas que não sejam os desenvolvedores ou que possa ser agendado para executar em horários predeterminados.

Durante o desenvolvimento de software temos que executar tarefas repetitivas e demoradas para realizar a publicação e entrega. No caso do desenvolvimento para a plataforma iOS temos que cadastrar o aplicativo no Developer Portal para gerar o App ID, cadastrar os certificados para ambiente de testes e para a Apple Store, cadastrar o aplicativo no iTunes Connect, cadastrar todos os usuários de testes do aplicativo, compilar o projeto, subir a build para o portal e realizar a liberação para o TestFlight ou App Store.

Cada vez que realizarmos uma atualização temos que repetir várias etapas e muitas vezes temos que realizar a tarefa mais de uma vez ao dia. A compilação de um grande projeto demora vários minutos e isto gera uma grande quantidade de tempo perdido do desenvolvedor que poderia utilizar este tempo implementando novas funcionalidades. Automatizar estas tarefas trará um grande ganho de produtividade e aí que entra o fastlane.

As ferramentas que compõem o fastlane são:

  • deliver: Upload screenshots, metadata, e seu aplicativo para a App Store.
  • snapshot: Tira screenshots localizados do seu aplicativo iOS para cada device de forma automatizada.
  • frameit: Põe os seus screenshots no frame correto do device de forma rápida.
  • pem: Gera e renova seus profiles de push notification automaticamente.
  • sigh: Porque você prefere gastar o seu tempo construindo coisas do que brigar com provisionamento.
  • produce: Cria novos aplicativos iOS no iTunes Connect e Developer Portal usando linha de comando.
  • cert: Cria e mantém os certificados de assinatura de código do iOS automaticamente.
  • spaceship: Biblioteca Ruby para acesso ao Apple Dev Center e iTunes Connect.
  • pilot: A melhor maneira de gerenciar seus usuários de teste e builds do TestFlight do seu terminal.
  • boarding: A maneira mais fácil de convidar os seus usuários betas do TestFlight.
  • gym: Compilar seus aplicativo iOS nunca foi tão fácil.
  • match: Sincronize os seus certificados e perfis facilmente com o seu time usando Git.
  • scan: O jeito mais fácil de rodar testes para os seus aplicativos iOS e Mac.

Na imagem abaixo podemos ver um exemplo de como seria o fluxo para realizar o teste do aplicativo, a liberação para a equipe de qualidade e a publicação na App Store.

fastlane-tree

Instalação

O fastlane requer Mac OS 10.9 ou mais recente, Ruby 2.0 ou mais recente (você pode conferir com o comando Ruby -v) e o Xcode.
Além do Xcode você deve instalar as ferramentas de linha de comando do Xcode digitando o comando xcode-select --install no console.

Será aberta uma janela para instalação e você deve aceitar com os termos de serviços.

Instalacao-xcode-select
Contrato-de-Licenca
Transferencia-xcode-select
Xcode-select-instalado

Para instalar o fastlane rode o comando abaixo no terminal sudo gem install fastlane --verbose. O comando irá instalar o fastlane e todas as suas dependências.

MacBook-Air-de-Mateus:Calculator mateusfsilva$ sudo gem install fastlane --verbose
Password:
HEAD https://api.rubygems.org/api/v1/dependencies
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=fastlane
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=activesupport,addressable,bundler,cert,credentials_manager,deliver,fastlane_core,frameit,gym,krausefx-shenzhen,match,multipart-post,pem,pilot,plist,produce,scan,screengrab,sigh,slack-notifier,snapshot,spaceship,supply,terminal-notifier,terminal-table,word_wrap,xcode-install,xcodeproj,xcpretty
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=i18n,json,minitest,thread_safe,tzinfo
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=claide,colored
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=babosa,commander,excon,fastimage,gh_inspector,highline,multi_json,rouge,rubyzip
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=dotenv,faraday,faraday-cookie_jar,faraday_middleware,google-api-client,multi_xml,net-sftp,security
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=http-cookie,mini_magick,net-ssh,xcpretty-travis-formatter
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=domain_name,googleauth,httpclient,hurley,memoist,mime-types,representable,retriable
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=unf
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=unf_ext
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=jwt,logging,os,signet
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=little-plugger,mime-types-data
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=uber
200 OK
Getting SRV record failed: DNS result has no information for _rubygems._tcp.api.rubygems.org
GET https://api.rubygems.org/quick/Marshal.4.8/fastlane-1.104.0.gemspec.rz
302 Moved Temporarily
GET https://rubygems.global.ssl.fastly.net/quick/Marshal.4.8/fastlane-1.104.0.gemspec.rz
200 OK
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/LICENSE
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/README.md
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/bin/fastlane
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/bin/?
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/.DS_Store
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/AppfileTemplate
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/AppfileTemplateAndroid
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/AvailablePlugins.md.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/DefaultFastfileTemplate
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/FastfileTemplateAndroid
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/completions/completion.bash
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/completions/completion.sh
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/completions/completion.zsh
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/custom_action_template.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/mailgun_html_template.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/report_template.xml.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/s3_html_template.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/s3_plist_template.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/assets/s3_version_template.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/.DS_Store
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/action.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/action_collector.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/README.md
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/actions_helper.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/adb.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/adb_devices.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/add_git_tag.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/appaloosa.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/appetize.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/appetize_viewing_url_generator.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/appium.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/appledoc.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/appstore.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/apteligent.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/artifactory.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/backup_file.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/backup_xcarchive.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/badge.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/build_and_upload_to_appetize.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/bundle_install.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/carthage.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/cert.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/changelog_from_git_commits.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/chatwork.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/clean_build_artifacts.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/clean_cocoapods_cache.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/clear_derived_data.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/clipboard.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/cloc.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/cocoapods.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/commit_version_bump.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/copy_artifacts.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/crashlytics.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/create_keychain.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/create_pull_request.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/danger.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/debug.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/default_platform.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/delete_keychain.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/deliver.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/deploygate.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/device_grid/README.md
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/dotgpg_environment.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/download.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/download_dsyms.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/dsym_zip.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/ensure_git_branch.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/ensure_git_status_clean.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/ensure_no_debug_code.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/ensure_xcode_version.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/erb.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/fastlane_version.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/flock.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/frameit.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/gcovr.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/get_build_number.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/get_build_number_repository.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/get_github_release.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/get_info_plist_value.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/get_ipa_info_plist_value.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/get_version_number.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/git_add.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/git_branch.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/git_commit.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/git_pull.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/git_tag_exists.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/gradle.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/gym.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/hg_add_tag.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/hg_commit_version_bump.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/hg_ensure_clean_status.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/hg_push.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/hipchat.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/hockey.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/ifttt.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/import.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/import_certificate.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/import_from_git.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/increment_build_number.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/increment_version_number.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/install_on_device.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/install_xcode_plugin.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/installr.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/ipa.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/is_ci.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/jazzy.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/jira.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/lane_context.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/last_git_commit.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/last_git_tag.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/latest_testflight_build_number.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/lcov.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/mailgun.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/make_changelog_from_jenkins.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/match.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/nexus_upload.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/notification.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/notify.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/number_of_commits.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/oclint.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/onesignal.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/opt_out_usage.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/pem.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/pilot.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/pod_lib_lint.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/pod_push.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/podio_item.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/produce.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/prompt.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/push_git_tags.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/push_to_git_remote.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/puts.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/read_podspec.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/recreate_schemes.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/register_devices.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/reset_git_repo.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/reset_simulators.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/resign.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/restore_file.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/rocket.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/rsync.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/s3.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/say.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/scan.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/scp.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/screengrab.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/set_build_number_repository.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/set_changelog.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/set_github_release.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/set_info_plist_value.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/set_pod_key.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/setup_jenkins.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/sigh.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/skip_docs.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/slack.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/slather.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/snapshot.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/sonar.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/splunkmint.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/ssh.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/supply.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/swiftlint.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/team_id.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/team_name.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/testfairy.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/testflight.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/tryouts.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/twitter.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/typetalk.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/unlock_keychain.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/update_app_group_identifiers.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/update_app_identifier.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/update_fastlane.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/update_icloud_container_identifiers.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/update_info_plist.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/update_project_code_signing.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/update_project_provisioning.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/update_project_team.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/update_urban_airship_configuration.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/update_url_schemes.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/upload_symbols_to_crashlytics.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/upload_symbols_to_sentry.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/verify_build.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/verify_pod_keys.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/verify_xcode.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/version_bump_podspec.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/version_get_podspec.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/xcode_install.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/xcode_select.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/xcode_server_get_assets.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/xcodebuild.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/xcov.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/xctool.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/xcversion.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/actions/zip.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/auto_complete.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/cli_tools_distributor.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/command_line_handler.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/commands_generator.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/configuration_helper.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/core_ext/bundler_monkey_patch.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/documentation/actions_list.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/documentation/docs_generator.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/erb_template_helper.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/fast_file.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/fastlane_folder.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/features.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/helper/README.md
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/helper/adb_helper.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/helper/crashlytics_helper.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/helper/gem_helper.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/helper/git_helper.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/helper/gradle_helper.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/helper/podspec_helper.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/helper/sh_helper.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/helper/xcversion_helper.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/junit_generator.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/lane.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/lane_list.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/lane_manager.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/new_action.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/one_off.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/other_action.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/.DS_Store
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/plugin_fetcher.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/plugin_generator.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/plugin_generator_ui.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/plugin_info.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/plugin_info_collector.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/plugin_manager.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/plugin_search.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/plugin_update_manager.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/plugins.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/%gem_name%.gemspec.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/.gitignore
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/.rspec
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/.rubocop.yml
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/.travis.yml
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/Gemfile
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/LICENSE.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/README.md.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/Rakefile
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/circle.yml
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/fastlane/Fastfile.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/fastlane/Pluginfile.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%.rb.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/actions/%plugin_name%_action.rb.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/helper/%plugin_name%_helper.rb.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/version.rb.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/spec/%plugin_name%_action_spec.rb.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/template/spec/spec_helper.rb.erb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/plugins/templates/.DS_Store
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/runner.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/setup/crashlytics_beta.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/setup/crashlytics_beta_command_line_handler.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/setup/crashlytics_beta_info.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/setup/crashlytics_beta_info_collector.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/setup/crashlytics_beta_ui.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/setup/crashlytics_beta_user_email_fetcher.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/setup/crashlytics_project_parser.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/setup/setup.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/setup/setup_android.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/setup/setup_ios.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/supported_platforms.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/tools.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/fastlane-1.104.0/lib/fastlane/version.rb
/Users/mateusfsilva/.rbenv/versions/2.3.1/bin/fastlane
/Users/mateusfsilva/.rbenv/versions/2.3.1/bin/?
Successfully installed fastlane-1.104.0
Parsing documentation for fastlane-1.104.0
Parsing sources...
100% [237/237]  lib/fastlane/version.rb
Done installing documentation for fastlane after 5 seconds
1 gem installed
MacBook-Air-de-Mateus:Calculator mateusfsilva$ 

Configurando o fastlane

O projeto que usaremos como exemplo será o Calculator que é a primeira tarefa do curso Developing iOS 9 Apps with Swift da Universidade Stanford que está disponível no iTunes U.

OBS: Eu alterei o nome do projeto de Calculator para BrainCalc porque a Apple bloqueia nomes iguais a de aplicativos nativos do iOS ?.

Configuramos o fastlane rodando o comando fastlane init no diretório raiz do projeto.

Siga as instruções apresentadas na tela.

MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ fastlane init
[12:28:45]: Detected iOS/Mac project in current directory...
[12:28:45]: This setup will help you get up and running in no time.
[12:28:45]: fastlane will check what tools you're already using and set up
[12:28:45]: the tool automatically for you. Have fun!
[12:28:45]: Created new folder './fastlane'.
[12:28:45]: $ xcodebuild clean -showBuildSettings -project ./BrainCalc.xcodeproj
Your Apple ID (e.g. fastlane@krausefx.com): mateus.freitas@yahoo.com
[12:29:02]: Verifying if app is available on the Apple Developer Portal and iTunes Connect...
[12:29:02]: Starting login with user 'mateus.freitas@yahoo.com'

+----------------+----------------------------------------------------------------------------------------+
|                                             Detected Values                                             |
+----------------+----------------------------------------------------------------------------------------+
| Apple ID       | mateus.freitas@yahoo.com                                                               |
| App Name       | BrainCalc                                                                              |
| App Identifier | com.mateusfsilva.BrainCalc                                                             |
| Project        | /Users/mateusfsilva/desenvolvimento/iOS/mateusfsilva.com/BrainCalc/BrainCalc.xcodeproj |
+----------------+----------------------------------------------------------------------------------------+

[12:29:16]: This app identifier doesn't exist on iTunes Connect yet, it will be created for you
[12:29:16]: This app identifier doesn't exist on the Apple Developer Portal yet, it will be created for you
Please confirm the above values (y/n)
y
[12:29:24]: Created new file './fastlane/Appfile'. Edit it to manage your preferred app metadata information.
[12:29:24]: Creating the app on iTunes Connect and the Apple Developer Portal
[12:29:25]: $ xcodebuild clean -showBuildSettings -project ./BrainCalc.xcodeproj


+----------------+----------------------------+
|          Summary for produce 1.2.0          |
+----------------+----------------------------+
| app_name       | BrainCalc                  |
| app_identifier | com.mateusfsilva.BrainCalc |
| username       | mateus.freitas@yahoo.com   |
| sku            | 1475594965                 |
| language       | English                    |
| skip_itc       | false                      |
| skip_devcenter | false                      |
| team_id        | DJUND43ZC7                 |
+----------------+----------------------------+

[12:29:30]: Creating new app 'BrainCalc' on the Apple Dev Center
[12:29:33]: Created app ZJ9Z7W5FCS
[12:29:34]: Finished creating new app 'BrainCalc' on the Dev Center
[12:29:37]: Creating new app 'BrainCalc' on iTunes Connect
[12:29:45]: Waiting for the newly created application to be available on iTunes Connect...
[12:29:55]: Waiting for the newly created application to be available on iTunes Connect...
[12:30:15]: Waiting for the newly created application to be available on iTunes Connect...
[12:30:25]: Waiting for the newly created application to be available on iTunes Connect...
[12:30:37]: Waiting for the newly created application to be available on iTunes Connect...
[12:30:47]: Waiting for the newly created application to be available on iTunes Connect...
[12:30:58]: Waiting for the newly created application to be available on iTunes Connect...
[12:31:08]: Waiting for the newly created application to be available on iTunes Connect...
[12:31:26]: Waiting for the newly created application to be available on iTunes Connect...
[12:31:37]: Waiting for the newly created application to be available on iTunes Connect...
[12:31:47]: Waiting for the newly created application to be available on iTunes Connect...
[12:31:57]: Waiting for the newly created application to be available on iTunes Connect...
[12:32:08]: Successfully created new app 'BrainCalc' on iTunes Connect with ID 1161777550
[12:32:08]: Loading up 'deliver', this might take a few seconds
[12:32:08]: Login to iTunes Connect (mateus.freitas@yahoo.com)
[12:32:11]: Login successful

+--------------------+----------------------------+
|             deliver 1.14.0 Summary              |
+--------------------+----------------------------+
| screenshots_path   | ./fastlane/screenshots     |
| metadata_path      | ./fastlane/metadata        |
| username           | mateus.freitas@yahoo.com   |
| app_identifier     | com.mateusfsilva.BrainCalc |
| skip_binary_upload | false                      |
| skip_screenshots   | false                      |
| skip_metadata      | false                      |
| force              | false                      |
| submit_for_review  | false                      |
| automatic_release  | false                      |
| dev_portal_team_id | DJUND43ZC7                 |
+--------------------+----------------------------+

[12:32:12]: Writing to 'fastlane/metadata/en-US/description.txt'
[12:32:12]: Writing to 'fastlane/metadata/en-US/keywords.txt'
[12:32:12]: Writing to 'fastlane/metadata/en-US/release_notes.txt'
[12:32:12]: Writing to 'fastlane/metadata/en-US/support_url.txt'
[12:32:12]: Writing to 'fastlane/metadata/en-US/marketing_url.txt'
[12:32:12]: Writing to 'fastlane/metadata/en-US/name.txt'
[12:32:12]: Writing to 'fastlane/metadata/en-US/privacy_url.txt'
[12:32:12]: Writing to 'fastlane/metadata/copyright.txt'
[12:32:12]: Writing to 'fastlane/metadata/primary_category.txt'
[12:32:12]: Writing to 'fastlane/metadata/secondary_category.txt'
[12:32:12]: Writing to 'fastlane/metadata/primary_first_sub_category.txt'
[12:32:12]: Writing to 'fastlane/metadata/primary_second_sub_category.txt'
[12:32:12]: Writing to 'fastlane/metadata/secondary_first_sub_category.txt'
[12:32:12]: Writing to 'fastlane/metadata/secondary_second_sub_category.txt'
[12:32:12]: Successfully created new configuration files.
[12:32:12]: Downloading all existing screenshots...
[12:32:13]: Successfully downloaded all existing screenshots
[12:32:13]: Successfully created new Deliverfile at path 'fastlane/Deliverfile'
[12:32:13]: $ xcodebuild -list -project ./BrainCalc.xcodeproj
[12:32:15]: 'snapshot' not enabled.
[12:32:15]: 'cocoapods' not enabled.
[12:32:15]: 'carthage' not enabled.
[12:32:15]: Created new file './fastlane/Fastfile'. Edit it to manage your own deployment lanes.
[12:32:15]: fastlane will send the number of errors for each action to
[12:32:15]: https://github.com/fastlane/enhancer to detect integration issues
[12:32:15]: No sensitive/private information will be uploaded
[12:32:15]: Successfully finished setting up fastlane
MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ 

A instalação irá solicitar o seu id Apple para verificar se o seu aplicativo existe no iTunes Connect e no Apple Developer Portal. Caso não existam ele os criará para você.

App-ID
App-iTunes-Connect

Além disto a instalação executa as seguintes tarefas:

  • Cria a pasta fastlane.
  • Cria o arquivo fastlane/Appfile que armazena o seu Apple ID e Bundle Identifier.
  • Cria o arquivo fastlane/Fastfile que irá armazenar os seus lanes.

A instalação dectecta as ferramentas que você está usando como CocoaPods, Carthage e outros.

O fastlane permiti criar diferentes builds, por exemplo:

  • Novas releases na App Store
  • Builds beta para o TestFlight ou HockeyApp
  • Rodar testes
  • Distribuições internas

O seu arquivo fastlane/Fastfile estará similar a este.

# Customise this file, documentation can be found here:
# https://github.com/fastlane/fastlane/tree/master/fastlane/docs
# All available actions: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md
# can also be listed using the `fastlane actions` command

# Change the syntax highlighting to Ruby
# All lines starting with a # are ignored when running `fastlane`

# If you want to automatically update fastlane if a new version is available:
# update_fastlane

# This is the minimum version number required.
# Update this, if you use features of a newer version
fastlane_version "1.104.0"

default_platform :ios

platform :ios do
  before_all do
    # ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."


  end

  desc "Runs all the tests"
  lane :test do
    scan
  end

  desc "Submit a new Beta Build to Apple TestFlight"
  desc "This will also make sure the profile is up to date"
  lane :beta do
    # match(type: "appstore") # more information: https://codesigning.guide
    gym(scheme: "BrainCalc") # Build your app - more options available
    pilot

    # sh "your_script.sh"
    # You can also use other beta testing services here (run `fastlane actions`)
  end

  desc "Deploy a new version to the App Store"
  lane :release do
    # match(type: "appstore")
    # snapshot
    gym(scheme: "BrainCalc") # Build your app - more options available
    deliver(force: true)
    # frameit
  end

  # You can define as many lanes as you want

  after_all do |lane|
    # This block is called, only if the executed lane was successful

    # slack(
    #   message: "Successfully deployed new App Update."
    # )
  end

  error do |lane, exception|
    # slack(
    #   message: exception.message,
    #   success: false
    # )
  end
end


# More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md
# All available actions: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md

# fastlane reports which actions are used
# No personal data is recorded. Learn more at https://github.com/fastlane/enhancer

Criando um novo lane

Vamos criar um lane para simular a execução do fastlane. Adicione o código abaixo no Fastfile.

  # You can define as many lanes as you want
  lane :example do
    say "Funciona! Meu primeiro lane personalizado."
  end

Salve o arquivo e execute o comando fastlane example no terminal.

MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ fastlane example
[12:51:29]: -------------------------------------------------
[12:51:29]: --- Step: Verifying required fastlane version ---
[12:51:29]: -------------------------------------------------
[12:51:29]: fastlane version valid
[12:51:29]: ------------------------------
[12:51:29]: --- Step: default_platform ---
[12:51:29]: ------------------------------
[12:51:29]: Driving the lane 'ios example' ?
[12:51:29]: -----------------
[12:51:29]: --- Step: say ---
[12:51:29]: -----------------
[12:51:29]: $ say 'Funciona! Meu primeiro lane personalizado.'

+------+-------------------------------------+-------------+
|                     fastlane summary                     |
+------+-------------------------------------+-------------+
| Step | Action                              | Time (in s) |
+------+-------------------------------------+-------------+
| 1    | Verifying required fastlane version | 0           |
| 2    | default_platform                    | 0           |
| 3    | say                                 | 3           |
+------+-------------------------------------+-------------+

[12:51:33]: fastlane.tools finished successfully ?
MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ 

Se tudo ocorreu bem você ouvirá a Siri dizer “Funciona! Meu primeiro lane personalizado.”.

Adicionando uma action

Existem várias actions que podemos utilizar no nosso lane. Você encontrará uma lista das actions no Actions documentations.

Vamos adicionar a action para incrementar o número da build da nossa Calculadora. A documentação da action pode ser encontrada aqui.

Primeiramente temos que configurar o nosso projeto para permitir utilizar a ferramenta agvtool do Xcode. A action utiliza esta ferramenta internamente.

Nas propriedades do projeto selecione o target, na aba Build Settings filtre pela palavra Versioning e altere as propriedades Current Project Version para 1 e a Versioning System para Apple Generic.

Versioning-Build-Settings

Na aba Info certifique-se que as propriedades Bundle versions string, short e Bundle version estão preenchidas.

Versao-target-Info

Agora vamos alterar o Fastfile para utilizar a action increment_build_number. Vou adicionar a action na seção before_all para ser executado sempre que eu executar uma lane.

  before_all do
    # ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."

    increment_build_number # automatically increment by one
  end

Executando testes com o scan

Crie um target de tests e crie alguns testes para testarmos o lane test e nossa action increment_build_number.

Utilizaremos o lane test que utiliza a ferramenta scan para rodar os testes do projeto. O scan utiliza as informações do fastlane para executar o teste bastando apenas utilizar o comando scan. Mas também podemos passar parâmetros para ele como por exemplo os devices que queremos efetuar os testes.

scan(
  devices: ["iPhone 6s", "iPad Air"]
)

Alternativamente podemos criar um arquivo Scanfile para armazenar as nossas configurações de teste. Execute o comando scan init no diretório do projeto.

MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ scan init
[13:10:09]: Successfully created 'fastlane/Scanfile'. Open the file using a code editor.
MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ 

Altere o arquivo para ficar conforme o exemplo abaixo.

# For more information about this configuration visit
# https://github.com/fastlane/fastlane/tree/master/scan#scanfile

# In general, you can use the options available
# scan --help

# Remove the # in front of the line to enable the option

scheme "BrainCalc"

devices ["iPhone SE"]

output_types "html"

open_report true

clean true

Execute o test com o comando fastlane test.

MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ fastlane test
[13:12:11]: -------------------------------------------------
[13:12:11]: --- Step: Verifying required fastlane version ---
[13:12:11]: -------------------------------------------------
[13:12:11]: fastlane version valid
[13:12:11]: ------------------------------
[13:12:11]: --- Step: default_platform ---
[13:12:11]: ------------------------------
[13:12:11]: Driving the lane 'ios test' ?
[13:12:11]: ------------------------------------
[13:12:11]: --- Step: increment_build_number ---
[13:12:11]: ------------------------------------
[13:12:11]: $ cd /Users/mateusfsilva/desenvolvimento/iOS/mateusfsilva.com/BrainCalc && agvtool next-version -all && cd -
[13:12:13]: ▸ Setting version of project BrainCalc to:
[13:12:13]: ▸ 2.
[13:12:13]: ▸ Also setting CFBundleVersion key (assuming it exists)
[13:12:13]: ▸ Updating CFBundleVersion in Info.plist(s)...
[13:12:13]: ▸ Updated CFBundleVersion in "BrainCalc.xcodeproj/../BrainCalc/Info.plist" to 2
[13:12:13]: ▸ Updated CFBundleVersion in "BrainCalc.xcodeproj/../BrainCalcTests/Info.plist" to 2
[13:12:13]: ▸ /Users/mateusfsilva/desenvolvimento/iOS/mateusfsilva.com/BrainCalc
[13:12:14]: ------------------
[13:12:14]: --- Step: scan ---
[13:12:14]: ------------------
[13:12:14]: $ xcodebuild -list -project ./BrainCalc.xcodeproj
[13:12:16]: $ xcodebuild clean -showBuildSettings -scheme BrainCalc -project ./BrainCalc.xcodeproj
[13:12:17]: $ xcodebuild -list -project ./BrainCalc.xcodeproj
[13:12:18]: $ xcodebuild clean -showBuildSettings -scheme BrainCalc -project ./BrainCalc.xcodeproj

+-----------------------+--------------------------------------------------------------------------+
|                                     Summary for scan 0.13.0                                      |
+-----------------------+--------------------------------------------------------------------------+
| scheme                | BrainCalc                                                                |
| devices               | ["iPhone SE"]                                                            |
| output_types          | html                                                                     |
| open_report           | true                                                                     |
| clean                 | true                                                                     |
| project               | ./BrainCalc.xcodeproj                                                    |
| derived_data_path     | /Users/mateusfsilva/Library/Developer/Xcode/DerivedData/BrainCalc-hdt... |
| code_coverage         | false                                                                    |
| address_sanitizer     | false                                                                    |
| skip_build            | false                                                                    |
| output_directory      | ./fastlane/test_output                                                   |
| buildlog_path         | ~/Library/Logs/scan                                                      |
| skip_slack            | false                                                                    |
| slack_only_on_failure | false                                                                    |
| use_clang_report_name | false                                                                    |
| fail_build            | true                                                                     |
+-----------------------+--------------------------------------------------------------------------+

[13:12:19]: $ set -o pipefail && env NSUnbufferedIO=YES xcodebuild -scheme BrainCalc -project ./BrainCalc.xcodeproj -destination 'platform=iOS Simulator,id=E3807C1D-0F0B-4181-8F59-CF9B8851B738' -derivedDataPath '/Users/mateusfsilva/Library/Developer/Xcode/DerivedData/BrainCalc-hdtlohzifcfhxbgzbsaorhzfdpbr' clean build test | tee '/Users/mateusfsilva/Library/Logs/scan/BrainCalc-BrainCalc.log' | xcpretty
[13:12:19]: ▸ Loading...
[13:12:20]: ▸ Cleaning BrainCalc/BrainCalc [Debug]
[13:12:20]: ▸ Check Dependencies
[13:12:21]: ▸ Clean Succeeded
[13:12:21]: ▸ Building BrainCalc/BrainCalc [Debug]
[13:12:21]: ▸ Check Dependencies
[13:12:21]: ▸ Compiling CalculatorBrain.swift
[13:12:22]: ▸ Compiling CalculatorViewController.swift
[13:12:22]: ▸ Compiling AppDelegate.swift
[13:12:23]: ▸ Compiling BrainCalc_vers.c
[13:12:23]: ▸ Linking BrainCalc
[13:12:23]: ▸ Compiling Main.storyboard
[13:12:27]: ▸ Compiling LaunchScreen.storyboard
[13:12:27]: ▸ Processing Info.plist
[13:12:28]: Running Tests: ▸ Touching BrainCalc.app
[13:12:28]: ▸ Signing /Users/mateusfsilva/Library/Developer/Xcode/DerivedData/BrainCalc-hdtlohzifcfhxbgzbsaorhzfdpbr/Build/Products/Debug-iphonesimulator/BrainCalc.app
[13:12:28]: ▸ Build Succeeded
[13:12:28]: ▸ 2016-10-04 13:12:28.692 xcodebuild[89823:4008603]  IDETestOperationsObserverDebug: Writing diagnostic log for test session to:
[13:12:28]: ▸ /Users/mateusfsilva/Library/Developer/Xcode/DerivedData/BrainCalc-hdtlohzifcfhxbgzbsaorhzfdpbr/Logs/Test/7C5CF4B1-6C0C-4EBD-84B9-D58419EF2266/Session-BrainCalcTests-2016-10-04_131228-zigSyA.log
[13:12:28]: ▸ 2016-10-04 13:12:28.692 xcodebuild[89823:4008321] [MT] IDETestOperationsObserverDebug: (917E9841-E85A-460B-89BF-E43DC39F0394) Beginning test session BrainCalcTests-917E9841-E85A-460B-89BF-E43DC39F0394 at 2016-10-04 13:12:28.690 with Xcode 8A218a on target  {
[13:12:28]: ▸ SimDevice: SimDevice : iPhone SE (E3807C1D-0F0B-4181-8F59-CF9B8851B738) : state={ Shutdown } deviceType={ SimDeviceType : com.apple.CoreSimulator.SimDeviceType.iPhone-SE } runtime={ SimRuntime : 10.0 (14A345) - com.apple.CoreSimulator.SimRuntime.iOS-10-0 }
[13:12:28]: ▸ } (10.0 (14A345))
[13:12:28]: ▸ Building BrainCalc/BrainCalc [Debug]
[13:12:28]: ▸ Check Dependencies
[13:12:29]: ▸ Building BrainCalc/BrainCalcTests [Debug]
[13:12:29]: ▸ Check Dependencies
[13:12:29]: ▸ Processing Info.plist
[13:12:29]: ▸ Compiling BrainCalcTests.swift
[13:12:29]: ▸ Compiling BrainCalcTests_vers.c
[13:12:29]: ▸ Linking BrainCalcTests
[13:12:31]: Running Tests: ▸ Touching BrainCalcTests.xctest
[13:12:31]: ▸ Signing /Users/mateusfsilva/Library/Developer/Xcode/DerivedData/BrainCalc-hdtlohzifcfhxbgzbsaorhzfdpbr/Build/Products/Debug-iphonesimulator/BrainCalc.app/PlugIns/BrainCalcTests.xctest
[13:12:55]: ▸ All tests
[13:12:55]: ▸ Test Suite BrainCalcTests.xctest started
[13:12:55]: ▸ CalculatorTests
[13:12:55]: ▸ ✓ testA (0.011 seconds)
[13:12:55]: ▸ ✓ testB (0.006 seconds)
[13:12:55]: ▸ ✓ testC (0.001 seconds)
[13:12:55]: ▸ ✓ testD (0.007 seconds)
[13:12:55]: ▸ ✓ testE (0.002 seconds)
[13:12:55]: ▸ ✓ testJ (0.002 seconds)
[13:12:55]: ▸ ✓ testK (0.015 seconds)
[13:12:55]: ▸ ✓ testL (0.002 seconds)
[13:12:55]: ▸ 	 Executed 8 tests, with 0 failures (0 unexpected) in 0.046 (0.076) seconds
[13:12:55]: ▸
[13:12:55]: ▸ Test Succeeded
+--------------------+-------+
|        Test Results        |
+--------------------+-------+
| Number of tests    | 8     |
| Number of failures | 0     |
+--------------------+-------+

[13:12:56]: Successfully generated report at '/Users/mateusfsilva/desenvolvimento/iOS/mateusfsilva.com/BrainCalc/fastlane/test_output/report.html'

+------+-------------------------------------+-------------+
|                     fastlane summary                     |
+------+-------------------------------------+-------------+
| Step | Action                              | Time (in s) |
+------+-------------------------------------+-------------+
| 1    | Verifying required fastlane version | 0           |
| 2    | default_platform                    | 0           |
| 3    | increment_build_number              | 2           |
| 4    | scan                                | 42          |
+------+-------------------------------------+-------------+

[13:12:57]: fastlane.tools finished successfully ?
MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ 

Ao final do teste será aberta o arquivo html com o resultado do teste.

Scan-tests-results

Note que a build do aplicativo foi incrementada.

Build-increment

Enviando o projeto para o TestFlight

O próximo passo é utilizar o fastlane para enviar nosso aplicativo para testes. Utilizaremos o TestFlight para que a equipe de testes ou os usuários pilotos possam testar o aplicativo. Utilizaremos mais duas ferramentas do fastlane o Gym e o Pilot.

O gym é a ferramenta utilizada para gerar o pacote do aplicativo. Ele irá gerar o ipa assinado e o arquivo dSYM comprimido. Todos os builds ficam disponíveis no Xcode Organizer. E tudo isto apenas com o comando gym(scheme: "BrainCalc").

O pilot é a ferramenta responsável por enviar o ipa para o iTunes Connect e liberar o build para os usuários do TestFlight. Além disso ele também pode gerenciar os usuários inscritos no TestFlight.

Vamos adicionar um usuário de teste com o comando pilot add email@server.com.

MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ pilot add mateus.freitas@yahoo.com
[13:17:04]: Login to iTunes Connect (mateus.freitas@yahoo.com)
[13:17:15]: Login successful
[13:17:16]: Existing tester mateus.freitas@yahoo.com
[13:17:17]: Successfully added tester to app com.mateusfsilva.BrainCalc
MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ 

Consultando os usuários com o pilot list.

MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ pilot list
[13:17:51]: Login to iTunes Connect (mateus.freitas@yahoo.com)
[13:17:57]: Login successful
+----------------+--------------------+---------------------------+
|                        Internal Testers                         |
+----------------+--------------------+---------------------------+
| First          | Last               | Email                     |
+----------------+--------------------+---------------------------+
| Mateus Gustavo | de Freitas e Silva | mateus.freitas@yahoo.com  |
+----------------+--------------------+---------------------------+

+-------+------+-------+
|   External Testers   |
+-------+------+-------+
| First | Last | Email |
+-------+------+-------+
+-------+------+-------+
MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ 

Todos os aplicativos do ecosistema fastlane utilizam as informações do Apple ID, senha (armazenada de forma segura no Acesso às Chaves do Mac), schema, etc de forma compartilhada.

Vamos para a liberação do build para teste no TesteFlight.

Utilizaremos o lane beta para isto. execute o comando fastlane beta

MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ fastlane beta
[13:49:30]: -------------------------------------------------
[13:49:30]: --- Step: Verifying required fastlane version ---
[13:49:30]: -------------------------------------------------
[13:49:30]: fastlane version valid
[13:49:30]: ------------------------------
[13:49:30]: --- Step: default_platform ---
[13:49:30]: ------------------------------
[13:49:30]: Driving the lane 'ios beta' ?
[13:49:30]: ------------------------------------
[13:49:30]: --- Step: increment_build_number ---
[13:49:30]: ------------------------------------
[13:49:30]: $ cd /Users/mateusfsilva/desenvolvimento/iOS/mateusfsilva.com/BrainCalc && agvtool next-version -all && cd -
[13:49:31]: ▸ Setting version of project BrainCalc to:
[13:49:31]: ▸ 5.
[13:49:31]: ▸ Also setting CFBundleVersion key (assuming it exists)
[13:49:31]: ▸ Updating CFBundleVersion in Info.plist(s)...
[13:49:31]: ▸ Updated CFBundleVersion in "BrainCalc.xcodeproj/../BrainCalc/Info.plist" to 5
[13:49:31]: ▸ Updated CFBundleVersion in "BrainCalc.xcodeproj/../BrainCalcTests/Info.plist" to 5
[13:49:31]: ▸ /Users/mateusfsilva/desenvolvimento/iOS/mateusfsilva.com/BrainCalc
[13:49:32]: -----------------
[13:49:32]: --- Step: gym ---
[13:49:32]: -----------------
[13:49:32]: $ xcodebuild -list -project ./BrainCalc.xcodeproj
[13:49:35]: $ xcodebuild clean -showBuildSettings -scheme BrainCalc -project ./BrainCalc.xcodeproj

+----------------------+-----------------------+
|            Summary for gym 1.10.0            |
+----------------------+-----------------------+
| scheme               | BrainCalc             |
| project              | ./BrainCalc.xcodeproj |
| destination          | generic/platform=iOS  |
| output_name          | BrainCalc             |
| clean                | false                 |
| output_directory     | .                     |
| silent               | false                 |
| use_legacy_build_api | false                 |
| buildlog_path        | ~/Library/Logs/gym    |
+----------------------+-----------------------+

[13:49:36]: $ set -o pipefail && xcodebuild -scheme BrainCalc -project ./BrainCalc.xcodeproj -destination 'generic/platform=iOS' -archivePath /Users/mateusfsilva/Library/Developer/Xcode/Archives/2016-10-04/BrainCalc\ 2016-10-04\ 13.49.36.xcarchive archive | tee /Users/mateusfsilva/Library/Logs/gym/BrainCalc-BrainCalc.log | xcpretty
[13:49:36]: ▸ Building BrainCalc/BrainCalc [Release]
[13:49:36]: ▸ Check Dependencies
[13:49:45]: ▸ Compiling BrainCalc_vers.c
[13:49:45]: ▸ Compiling BrainCalc_vers.c
[13:49:45]: ▸ Linking BrainCalc
[13:49:46]: ▸ Linking BrainCalc
[13:49:46]: ▸ Compiling Main.storyboard
[13:49:49]: ▸ Compiling LaunchScreen.storyboard
[13:49:49]: ▸ Processing Info.plist
[13:49:49]: ▸ Generating 'BrainCalc.app.dSYM'
[13:49:50]: ▸ Touching BrainCalc.app
[13:49:55]: ▸ Signing /Users/mateusfsilva/Library/Developer/Xcode/DerivedData/BrainCalc-hdtlohzifcfhxbgzbsaorhzfdpbr/Build/Intermediates/ArchiveIntermediates/BrainCalc/InstallationBuildProductsLocation/Applications/BrainCalc.app
[13:49:56]: ▸ Touching BrainCalc.app.dSYM
[13:49:57]: ▸ Archive Succeeded
[13:49:58]: $ /usr/bin/xcrun /Users/mateusfsilva/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/gym-1.10.0/lib/assets/wrap_xcodebuild/xcbuild-safe.sh -exportArchive -exportOptionsPlist '/var/folders/hz/r4mn_6fd42ncl8r6mhkx_sdm0000gn/T/gym_config20161004-92976-13q8r99.plist' -archivePath /Users/mateusfsilva/Library/Developer/Xcode/Archives/2016-10-04/BrainCalc\ 2016-10-04\ 13.49.36.xcarchive -exportPath '/var/folders/hz/r4mn_6fd42ncl8r6mhkx_sdm0000gn/T/gym_output20161004-92976-i1t2gt'
[13:50:21]: Compressing 1 dSYM(s)
[13:50:21]: $ cd '/Users/mateusfsilva/Library/Developer/Xcode/Archives/2016-10-04/BrainCalc 2016-10-04 13.49.36.xcarchive/dSYMs' && zip -r '/Users/mateusfsilva/desenvolvimento/iOS/mateusfsilva.com/BrainCalc/BrainCalc.app.dSYM.zip' *.dSYM
[13:50:21]: ▸ updating: BrainCalc.app.dSYM/ (stored 0%)
[13:50:21]: ▸ updating: BrainCalc.app.dSYM/Contents/ (stored 0%)
[13:50:21]: ▸ updating: BrainCalc.app.dSYM/Contents/Info.plist (deflated 52%)
[13:50:21]: ▸ updating: BrainCalc.app.dSYM/Contents/Resources/ (stored 0%)
[13:50:21]: ▸ updating: BrainCalc.app.dSYM/Contents/Resources/DWARF/ (stored 0%)
[13:50:21]: ▸ updating: BrainCalc.app.dSYM/Contents/Resources/DWARF/BrainCalc (deflated 67%)

[13:50:21]: Successfully exported and compressed dSYM file
[13:50:21]: Successfully exported and signed the ipa file:
[13:50:21]: /Users/mateusfsilva/desenvolvimento/iOS/mateusfsilva.com/BrainCalc/BrainCalc.ipa
[13:50:21]: -------------------
[13:50:21]: --- Step: pilot ---
[13:50:21]: -------------------
[13:50:21]: Login to iTunes Connect (mateus.freitas@yahoo.com)
[13:50:31]: Login successful
[13:50:32]: Ready to upload new build to TestFlight (App: 1161777550)...
[13:50:32]: Going to upload updated app to iTunes Connect
[13:50:32]: This might take a few minutes. Please don't interrupt the script.
[13:53:38]: iTunes Transporter successfully finished its job
[13:53:38]: ------------------------------------------------------------------------------------------------------
[13:53:38]: Successfully uploaded package to iTunes Connect. It might take a few minutes until it's visible online.
[13:53:38]: ------------------------------------------------------------------------------------------------------
[13:53:38]: Successfully uploaded the new binary to iTunes Connect
[13:53:38]: If you want to skip waiting for the processing to be finished, use the `skip_waiting_for_build_processing` option
[13:53:38]: Waiting for iTunes Connect to process the new build
[13:54:17]: Waiting for iTunes Connect to finish processing the new build (1.0 - 5)
[13:54:49]: Waiting for iTunes Connect to finish processing the new build (1.0 - 5)
[13:55:27]: Waiting for iTunes Connect to finish processing the new build (1.0 - 5)
[13:56:00]: Waiting for iTunes Connect to finish processing the new build (1.0 - 5)
[13:56:47]: Waiting for iTunes Connect to finish processing the new build (1.0 - 5)
[13:57:20]: Waiting for iTunes Connect to finish processing the new build (1.0 - 5)
[13:57:58]: Waiting for iTunes Connect to finish processing the new build (1.0 - 5)
[13:58:34]: Waiting for iTunes Connect to finish processing the new build (1.0 - 5)
[13:59:14]: Waiting for iTunes Connect to finish processing the new build (1.0 - 5)
[13:59:48]: Waiting for iTunes Connect to finish processing the new build (1.0 - 5)
[14:00:18]: Successfully finished processing the build
[14:00:18]: You can now tweet:
[14:00:18]: iTunes Connect #iosprocessingtime 7 minutes
[14:00:18]: Distributing new build to testers
[14:00:20]: Successfully distributed build to beta testers ?

+------+-------------------------------------+-------------+
|                     fastlane summary                     |
+------+-------------------------------------+-------------+
| Step | Action                              | Time (in s) |
+------+-------------------------------------+-------------+
| 1    | Verifying required fastlane version | 0           |
| 2    | default_platform                    | 0           |
| 3    | increment_build_number              | 1           |
| 4    | gym                                 | 48          |
| 5    | pilot                               | 599         |
+------+-------------------------------------+-------------+

[14:00:20]: fastlane.tools just saved you 11 minutes! ?
MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ 

Ocasionalmente o pilot pode falhar durante a espera da atualização do iTunnes Connect. Mas o build aparecerá no site para ser liberado no TestFlight.

Pilot-build-iTunes-Connect

Caso apareça a mensagem de erro “You must provide an answer for this question.”, basta acrescentar a property App Uses Non-Exempt Encryption com o value NO no Info.plist do projeto (ITSAppUsesNonExemptEncryption).

[13:39:40]: You must provide an answer for this question.

+------+-------------------------------------+-------------+
|                     fastlane summary                     |
+------+-------------------------------------+-------------+
| Step | Action                              | Time (in s) |
+------+-------------------------------------+-------------+
| 1    | Verifying required fastlane version | 0           |
| 2    | default_platform                    | 0           |
| 3    | increment_build_number              | 1           |
| 4    | gym                                 | 46          |
| 5    | pilot                               | 418         |
+------+-------------------------------------+-------------+

[13:39:40]: fastlane finished with errors

Looking for related GitHub issues on fastlane/fastlane...

➡️  You must provide an answer for this question. You must provide an answer for this question
   https://github.com/fastlane/fastlane/issues/4720 [closed] 1 ?
   19 May 2016

➡️  Error - You must provide an answer for this question
   https://github.com/fastlane/fastlane/issues/4002 [closed] 10 ?
   13 May 2016

➡️  Pilot doesn't have submission_information option to accept Export Compliance for TestFlight Internal testing build distribution
   https://github.com/fastlane/fastlane/issues/3982 [closed] 4 ?
   a day ago

and 3 more at: https://github.com/fastlane/fastlane/search?q=The%20request%20could%20not%20be%20completed%20because:%0A%09You%20must%20provide%20an%20answer%20for%20this%20question.&type=Issues&utf8=✓

[!] The request could not be completed because:
	You must provide an answer for this question.
MacBook-Air-de-Mateus:BrainCalc mateusfsilva$ 

App-Uses-Non-Exempt-Encryption

O usuário receberá um e-mail com os dados necessários para a instalação do TestFlight e do aplicativo.

iTunes-Connect-new-build TestFlight-email TestFlight-app-code BrainCalc-on-TestFlight BrainCalc

Criando um site para cadastro de usuários pilotos

Agora que automatizamos o nosso teste com o scan, a geração de build com o gym e a publicação no iTunes Connect e TestFlight com o pilot vamos automatizar o cadastro de usuário de teste. Para isto utilizaremos mais uma ferramenta do fastlane. O boarding.

O boarding é a ferramenta que gera uma página web onde os usuários podem se cadastrar para testar nossos aplicastivos. Toda a terafa de cadastrar estes usuários no iTunes Connect e associá-los com o TestFlight é feita pelo boarding de forma automática. Vamos criar uma página para a nossa Calculadora no Heroku.

Entre no site do Heroku, logue com o seu usuário.

Huroku-App-Page

Depois digite este endereço no browser. Será aberta a janela a seguir.

Huroku-Boarding-Create

Preencha as informações de login, senha e App ID (ou App Bundle Identifier) do iTunes Connect e clique em Deploy for Free. Será iniciado o deploy do aplicativo web.

Caso queira proteger o cadastro com uma senha você pode defini-la no campo ITC_TOKEN. Assim somente os usuários que possuírem a senha conseguirão se cadastrar.

Heroku-Boarding-Creating

Heroku-Boarding-Created

Após a finalização do deploy, clique no botão View que será aberta a página de cadastro de usuários.

Invite-App-Heroku

Cadastre um usuário e poderá vê-lo nos usuários do TestFlight. Na próxima vez que publicar uma nova build o usuário receberá um e-mail e uma notificação no TestFlight.

Invite-App-Confirmation-Heroku

iTunes-Connect-Tester-Created

Preparando para liberação na App Store

Outra grande funcionalidade do fastlane, do deliver especificamente, é o envio de metadata e screenshots para o iTunes Connect. Durante o fastlane init são criados os diretórios metadata e screenshots dentro da pasta fastlane. Você pode editar os arquivos para que o deliver atualize as informações no portal. Caso você configure o fastlane em um projeto que já esteja no iTunes Connect os arquivos de metadata virão preenchidos com as informações já cadastradas e todos os screenshots serão baixados para a pasta screenshots.

A grande vantagem do metadata é a facilidade de localização da informação. Você pode criar uma pasta com o código pt-BR e adicionar as informações que aparecerão na App Store brasileira. Isto serve para outras localidades tornando o processo de localização um simples envio de arquivos texto para os tradutores e a adição dos arquivos localizados na pasta metadata.

No caso dos screenshots eles também podem ser separados por localização e podem ser automatizados com as ferramentas snapshot e frameit.

fastlane-metadata-01
fastlane-metadata-02
fastlane-metadata-03

Conclusão

O fastlane é uma ferramenta bem útil na automatização de tarefas repetitivas no desenvolvimento iOS. A ferramenta possui diversas opções de configuração que podem ser consultadas na documentação disponível no GitHub, que vem recebendo constantes melhorias. Também está disponível no GitHub exemplos de configurações utilizadas por algumas empresas entre elas Mozilla, SoundCloud e Wikipedia.

A lista de actions disponíveis, a possibilidade de rodar seu próprio arquivo .sh e a possibilidade de criar suas próprias actions o tornam uma ferramenta bastante flexiva e permite a integração com outros programas utilizados no seu ciclo de desenvolvimento. O fastlane também é uma ferramenta fundamental para implementar entrega contínua já que permite o rápido teste e liberação de novas versões.

Espero que tenham gostado do artigo. Se tiver dúvidas, críticas ou sugestões de novos assuntos deixe sua mensagem abaixo. Se gostou compartilhe. Caso queira falar comigo você pode me encontrar no twitter @mateusfsilva.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s