Интеграция Fastlane в iOS-проект

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

Задача: автоматизировать запуск тестов на pull-request, сборку и ее отправку на TestFlight при мерже в ветку develop и подготовку скриншотов.
Установка
Для работы с fastlane нам нужно установить:

  • XCode command line tools, используя команду xcode-select --install
  • Сам fastlane, используя команду sudo gem install fastlane -N,если у вас установлены RubyGems и brew cask install fastlane, если у вас установлен HomeBrew
После установки переходим в папку с проектом и прописываем fastlane init.
Существует 3 предустановленных конфигурации:

  1. Для создания скриншотов
  2. Для отправки билдов в testflight
  3. Для публикации приложения в App Store

Мы выберем ручную конфигурацию.

После этого в папке проекта появится папка fastlane, в которой находятся 2 файла:
  • Fastfile, в котором находятся все конфигурации fastlane к этому проекту
  • Appfile, в котором находится информация о профиле (bundle_id, app_Identifier, team_id)

Все доступные команды хранятся на официальном сайте Fastlane.
Я расскажу про некоторые из них:

  • cert - работа с сертификатами. Скачивает и устанавливает нужные нам сертификаты для подписи собираемых приложений
  • sigh - работа с provisioning profiles. Также скачивает и устанавливает provisioning profiles
  • increment_build_number - увеличивает номер билда на 1, либо устанавливает выбранное значение
  • scan - тестирование
  • gym - сборка архива и .ipa файла
  • slack - интеграция со Slack
  • testflight - отправка сборки на testflight

Пропишем первую конфигурацию, которая будет запускать тесты, при пулл-реквесте.
Параметры конфигурации:

  • Clean - очистка проекта перед сборкой
  • Code_coverage - вывод процента покрытия тестами приложения
  • Scheme - схема проекта
  • Output_directory - путь до директории, в которой будет находится сгенерированный отчет
  • Skip_slack - флаг для игнорирования отправки нотификаций в Slack

Пропишем конфигурацию для загрузки приложения в testflight:
При запуске данной конфигурации скачаются и установятся сертификаты и provisioning profiles, увеличится номер последней сборки на TestFlight, соберется и загрузится сборка в TestFlight, а также отправится нотификация в Slack с номером версии.
Если у вас стоит двухфакторная аутентификация, то нужно добавить в окружение переменнyю с названием FASTLANE_APPLE_
APPLICATION_SPECIFIC_
PASSWORD
. Для получения пароля:
  1. Переходим на сайт Apple
  2. Генерируем новый пароль для приложения
  3. Копируем и вставляем этот пароль в нашу переменную
Иногда, при повторном запуске сборки может возникнуть ошибка "Database is locked Possibly there are two concurrent builds running in the same filesystem location". При возникновении данной ошибки стоит изменить систему сборки на "Legacy Build".
Также при возникновении ошибки будем отправлять нотификацию в Slack с описанием ошибки:
Нотификации в Slack
Для подключения Slack нотификаций нужно добавить бота к вашему каналу.
Заходим на сайт Slack, указываем название и workspace. Далее добавляем Incoming Webhooks, выбираем канал и получаем URL, который мы добавляем в конфигурацию fastlane.
Теперь мы можем отправлять нотификации в Slack!
Установка CI
В качестве CI мы будем использовать gitlab-runner. Мы добавим конфигурацию, чтобы при pull-request запускались тесты, а также при пуше в master заливалась версия на testflight. Для работы CI нам потребуется добавить конфигурацию в папку проекта .gitlab-ci.yml.
  • Переменные
    • LC_ALL, LANG - нужные переменные для работы с fastlane
    • GIT_STRATEGY - при каждом запуске проекта будем клонировать проект
  • before-script - скрипты, которые выполняются перед выполнением наших этапов, в данном случае установим поды в проект
  • stages - этапы, которые будет последовательно проходить CI при выполнении нужных условий
И далее пошли наши этапы:

  1. pull-request - этап, который запускается, если мы делаем merge-request в develop ветку, после удачного прохождения которого можно скачать отчет о пройденных и непройденных тестах
  2. testflight-upload - этап, который запускается, если мы пушим в master
Развернуть gitlab-runner можно на любом ПК, достаточно зарегистрировать его на нем.
Пример настроенного gitlab-runner на ПК
Если одна из конфигураций подошла по требования, то появляется новая "работа", прикрепленная к этому коммиту.
Пример удачного прохождения "работы"
Если при прохождении конфигурации возникла ошибка, то вы получаете оповещение на почту о неудачном прохождении.
Вывод
GitLab в связке с Fastlane хорошо подходит для автоматизации сборки приложения и тестирования. Все это должно сэкономить время разработчиков. Упрощается процесс загрузки сборки на testflight, теперь его можно запустить через Git и он не привязан к компьютеру конкретного разработчика.
Спасибо за внимание!