Автоматизируем сборку iOS приложений с помощью Fastlane

в 13:58, , рубрики: continious integration, continuous delivery, fastlane, iOS, Блог компании Сбербанк, разработка мобильных приложений, разработка под iOS, Тестирование мобильных приложений
Автоматизируем сборку iOS приложений с помощью Fastlane - 1

Как часто нам, iOS разработчикам, приходится собирать приложение для загрузки в iTunes Connect App Store Connect? В процессе этапа активного бета-тестирования приложения нужно оперативно фиксить баги и поставлять обновленную сборку для тестирования. А также необходимо скачивать сертификаты, Provision profiles, прокликивать много разных галочек и кнопочек при каждой выкладке нового билда.

К счастью, есть такой замечательный инструмент, как fastlane, который помогает нам автоматизировать ручные действия мобильного разработчика.

В этом посте я расскажу: что такое fastlane и как быстро начать его использовать в своих iOS проектах.

Введение

Что это? 

Fastlane  -  это инструмент для автоматизации процессов сборки и выкладки мобильных iOS и Android приложений, которая включает в себя также генерирование скриншотов, запуск Unit/UI тестов, отправка сообщений в Slack, подключение к Crashlytics и многие другие полезные вещи, которые упрощают жизнь. 

Какой профит?

На первоначальную настройку базовых команд для автоматизации выкладки приложения, например, для публикации в App Store или на TestFlight, уйдет не более двух часов, однако в будущем это сэкономит уйму времени, т.к. весь процесс будет запускаться одним вызовом из командной строки.

ВНИМАНИЕ: Для выполнения всех шагов необходима подписка Apple Developer, так как доступ в App Store Connect отсутствует для бесплатных аккаунтов.

Установка

Устанавливаем сам fastlane

Для начала установим/обновим до последней версии Xcode Command Tools: 

$ xcode-select --install

Устанавливаем gem fastlane:

$ sudo gem install fastlane -NV 
# или через brew
$ brew cask install fastlane

Добавляем в проект 

В корневой директории проекта запускаем:

$ sudo fastlane init

Fastlane предложит нам варианты предустановленных скриптов в зависимости от того, что мы хотим:

Автоматизируем сборку iOS приложений с помощью Fastlane - 2

Мы выберем 4 вариант, т.к. будем прописывать все необходимые команды под свою ситуацию:

Автоматизируем сборку iOS приложений с помощью Fastlane - 3

Готово! Папка fastlane и файл gemfile успешно установлена к нам в проект.

Перед тем, как продолжим

Если в shell профайле locale не UTF-8, то будут возникать проблемы со сборкой и загрузкой билдов. Заходим в файл вашего shell profile (~/.bashrc, ~/.bash_profile, ~/.profile или ~/.zshrc) и добавляем следующие строчки:

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

Теперь все готово к написанию непосредственных шагов автоматизации сборки.

Как это работает

Для начала выясним, что делает fastlane: основные его команды и как мы описываем то, что нужно сделать.

Команды (Actions)

В fastlane входит много полезных команд, упрощающих жизнь разработчику:

  • cert: автоматически скачивает и устанавливает необходимые сертификаты (Distribution, Development) для подписи собираемых приложений;
  • increment_build_number: увеличивает номер билда на 1, либо изменяет на значение, заданное в параметре build_number
  • sigh: автоматически скачивает и устанавливает все необходимые provision profiles;
  • snapshot: запускает UI-тесты и делает скриншоты, которые можно использовать при отправке на review в App Store;
  • gym: собирает архив и, здесь же, конечный ipa вашего приложения;
  • scan: все просто  —  запускает таргет тестов;
  • deliver: отправляет ipa, скриншоты, метаданные прямиком в App Store;
  • pilot: загружает свежий ipa на бета тест в TestFlight. Также с помощью этой команды можно управлять тестировщиками.
  • и многие другие

Fastfile

Папка fastlane содержит в себе Fastfile и Appfile. В Appfile мы будем прописывать необходимые для сборки и публикации значения: Bundle IDs, App ID, Team ID и другие. В Fastfile мы будем описывать наши скрипты. После первоначальной установки он выглядит так:

default_platform(:ios)

platform :ios do
  desc "Description of what the lane does"
  lane :custom_lane do
    # add actions here: https://docs.fastlane.tools/actions
  end
end

  • default_platform(:ios)  -  задаем платформу по умолчанию, чтобы не указывать ее из командной строки.
  • platform :ios do … end  -  здесь описываются "lanes" для платформы iOS.
  • desc "Description of what the lane does"  -  краткое описание "lane". Список всех "lanes" с описаниями можно посмотреть с помощью команды $ fastlane lanes.
  • lane :custom_lane do … end: Lane (путь, полоса) — это, проще говоря, метод. У него есть имя, параметры и тело. В теле мы будем вызывать необходимые нам команды для сборки, выкладки, запуска тестов и др. Lanes вызываются из командной строки вызовом $ fastlane [lane_name] [parameters] . Именно с вызова одной из lanes начинается выполнение автоматизированных шагов.

Автоматизируем выгрузку на TestFlight

Начнем с задания понятного имени нашему lane'у. Переименуем custom_lane в testflight_lane. Теперь понятно, что результатом выполнения этого скрипта будет загруженная свежая сборка в TestFlight.

default_platform(:ios)

platform :ios do
  desc "Builds, achieves and uploads ipa to TestFlight"
  lane :testflight_lane do
    # Actions
  end
end

Конфигурируем Appfile

Для того, чтобы каждый раз при запуске скрипта не вводить bundle приложения и Apple ID, выпишем их в Appfile:

app_identifier "ru.ee.shishko.TheHatGame"
apple_id "ee.shishko@gmail.com"

Сертификаты и Provision Profiles

Добавим команды cert и sigh для установки сертификатов и provision profiles соответственно:
(Внимание: если вашего приложения нет в App Store Connect, то необходимо добавить команду produce с параметром app_name)

default_platform(:ios)

platform :ios do
  desc "Builds, achieves and uploads ipa to TestFlight"
  lane :testflight_lane do
      # Если приложение не создавалось в App Store Connect: 
      # produce (
      #     app_name: "MyAppName"
      # )

      cert
      sigh
  end
end

Запустим наш скрипт с помощью команды $ fastlane testflight_lane 

При запуске Fastlane попросит у нас ввести пароль от аккаунта, вводим его. Потребуется это только один раз  -  fastlane его запомнит и при следующих запусках вводить ничего не потребуется.
Вот так выглядит вывод, когда fastlane успешно завершает выполнение скрипта:

Автоматизируем сборку iOS приложений с помощью Fastlane - 4

Теперь сертификат и provision profiles скачены и установлены. Осталось проставить во вкладе General нужного таргета:

Автоматизируем сборку iOS приложений с помощью Fastlane - 5

Сборка приложения

Добавим команду increment_build_number для увеличения номера билда. Если у вас главный .xcodeproj файл лежит не в корневой папке, то указываем для него путь в параметре xcodeproj:

default_platform(:ios)

platform :ios do
  desc "Builds, achieves and uploads ipa to TestFlight"
  lane :testflight_lane do
      cert
      sigh
      increment_build_number

      # Если главный .xcodeproj не в корневой директории проекта, то:
      #
      # increment_build_number(
      #   xcodeproj: "./path/to/MyApp.xcodeproj" 
      # )
  end
end

Для работы увеличения номера билда, необходимо зайти в Build Settings/Versioning и выставить Versioning System в Apple Generic и Current Project Version в 1:

Автоматизируем сборку iOS приложений с помощью Fastlane - 6

Добавим команду gym, которая собирает ipa файл нашего приложения:

Автоматизируем сборку iOS приложений с помощью Fastlane - 7

Среди параметров можно указать, куда будет положен ipa (output_directory), имя ipa (output_name), scheme (scheme), делать ли Clean (clean) и некоторые другие. Мы ничего не будем указывать в параметрах  —  fastlane выставит параметры по-умолчанию, соберет и подпишет ipa, но опять же: при желании и необходимости всё можно указать подробно:

default_platform(:ios)

platform :ios do
  desc "Builds, achieves and uploads ipa to TestFlight"
  lane :testflight_lane do
      cert
      sigh
      increment_build_number
      gym
      # С заданием конкретных параметров:
      #
      # gym(
      #  workspace: "TheHatGame.xcworkspace",
      #  scheme: "TheHatGame",
      #  configuration: "Release",
      #  clean: true,
      #  output_directory: "./build",
      #  output_name: "TheHatGame.ipa",
      #  codesigning_identity: "iPhone Distribution: Evgeny Shishko"
      # )
  end
end

Выгрузка на TestFlight

Для загрузки ipa в TestFlight будем использовать Pilot:

Автоматизируем сборку iOS приложений с помощью Fastlane - 8

С помощью Pilot можно:

  • выгружать и распространять сборки;
  • добавлять и удалять бета тестеров;
  • получать информацию о тестировщиках и используемых ими устройств;
  • экспортировать информацию о тестировщиках в .csv для того, чтобы импортировать их в другой проект.

Мы будем использовать основную его функцию: отправка сборок в Apple Store Connect.

Добавим в testflight_lane вызов upload_to_testflight с параметрами skip_submission (будем использовать только для загрузки ipa файла) и skip_waiting_for_build_processing (не дожидаемся окончания processing'a):

default_platform(:ios)

platform :ios do
  desc "Builds, achieves and uploads ipa to TestFlight"
  lane :testflight_lane do
      cert
      sigh
      increment_build_number
      gym
      upload_to_testflight(
           skip_submission: true,
           skip_waiting_for_build_processing: true
      )
  end
end

Запускаем итоговый скрипт

Сохраняем наши изменения и запускаем из консоли:

$ fastlane testflight_lane

На этапе отправки в testflight в консоли потребуется ввести app-specific пароль (который требуется для авторизации в Application Loader). Найти его можно в личном кабинете Apple ID, сгенерировав его по нажатию на "Generate Password":

Автоматизируем сборку iOS приложений с помощью Fastlane - 9

После ввода пароля свежая сборка будет успешно загружена в TestFlight и выполнение fastlane на этом закончится:

Автоматизируем сборку iOS приложений с помощью Fastlane - 10

Статус новой версии можно посмотреть в App Store Connect:

Автоматизируем сборку iOS приложений с помощью Fastlane - 11

Заключение

На этом всё! Хотел бы обратить внимание, что в данной статье мы в самом общем случае попробовали возможности fastlane. В связи c этим прикрепляю опрос: будут ли интересны вам, посты про подробное использование упомянутых и других полезных команд в fastlane и продвинутых фишек в настройке скриптов?

Приложение с представленной настройкой fastlane можно найти здесь.

Автор: deimous

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js