Как GitLab с fastlane собирает, подписывает и публикует приложения для iOS в App Store.
Недавно у нас был пост о том, как быстро собрать и запустить приложение Android с GitLab и fastlane. Здесь мы увидим, как собрать и запустить приложение iOS и опубликовать его в TestFlight. Зацените, как круто я вношу изменение на iPad Pro с GitLab Web IDE, беру сборку и получаю обновление тестовой версии приложения на том же iPad Pro, где я его разработал.
Здесь мы возьмем простое приложение для iOS на Swift, с которым я записывал видео.
Пара слов о конфигурации Apple Store
Нам понадобится приложение в App Store, сертификаты распространения и профиль инициализации, чтобы связать все вместе.
Самое сложное тут — настроить права на подпись в App Store. Надеюсь, с этим вы разберетесь сами. Если вы новичок, я укажу нужное направление, но здесь мы не будем говорить о тонкостях управления сертификатами Apple, к тому же они постоянно меняются. Этот пост поможет приступить к делу.
Мои приложения
Нужно приложение в App Store Connect, чтобы у вас был ID для конфигурации .xcodebuild
. Профиль и ID приложения объединяют сборки кода, цены и доступность, а еще конфигурацию TestFlight для распространения тестовых приложений среди пользователей. Не делайте общедоступное тестирование, хватит и приватного, если у вас маленькая группа, простая настройка и не нужны дополнительные разрешения от Apple.
Профиль инициализации
Кроме сетапа приложения вам нужны ключи распространения и разработки iOS, созданные в разделе Certificates, Identifiers & Profiles (Сертификаты, идентификаторы и профили) в консоли Apple Developer. Все эти сертификаты можно объединить в профиле инициализации.
Пользователям, которые будут проходить аутентификацию, нужна возможность создавать сертификаты, иначе на этапах cert и sigh вы увидите ошибку.
Другие варианты
Кроме этого простого метода, есть и другие способы настроить сертификаты и профили. Так что, если работаете иначе, возможно, придется перестраиваться. Самое главное — вам понадобится конфигурация .xcodebuild
, которая будет указывать на нужные файлы, а связка ключей должна быть доступна на компьютере сборки для пользователя, под чьим именем работает раннер. Для цифровой подписи мы используем fastlane, и если есть проблемы или вы хотите узнать больше, изучите их подробную документацию о цифровых подписях.
В этом примере я использую подход cert и sigh, но для реального применения, наверное, лучше подойдет match.
Подготовка GitLab и fastlane
Подготовка CI Runner
Собрав все эти данные, переходим к конфигурации GitLab-раннера на устройстве MacOS. К несчастью, делать приложения iOS реально только в MacOS. Но все может измениться, и если ждете подвижек в этой области, — следите за проектами, вроде xcbuild и isign, и нашей внутренней задачей gitlab-ce#57576.
Настроить раннер очень просто. Следуйте актуальным инструкциям по настройке GitLab Runner в macOS.
Примечание. Раннер должен использовать исполняющую программу shell
. Это обязательно для сборки iOS в macOS, чтобы работать напрямую как пользователь, а не через контейнеры. Если вы используете shell
, сборка и тестирование выполняются от имени пользователя раннера, прямо на хосте сборки. Это не так безопасно, как контейнеры, так что лучше пролистайте документацию по безопасности, чтобы ничего не упустить.
sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-amd64
sudo chmod +x /usr/local/bin/gitlab-runner
cd ~
gitlab-runner install
gitlab-runner start
Связка ключей Apple должна быть настроена на этом хосте с доступом к ключам, которые нужны Xcode для сборки. Самый простой способ это протестировать — войти как пользователь, который запустит сборку, и попробовать выполнить сборку вручную. Если система запросит доступ к связке ключей, выберите «Всегда разрешать», чтобы CI работал. Возможно, стоит войти и понаблюдать за первой парой пайплайнов, — убедиться, что они больше не просят связки ключей. Беда в том, что Apple не упрощает нам работу с автоматическим режимом, но когда вы его наладите, все будет нормально.
fastlane init
Чтобы использовать fastlane в проекте, запустите fastlane init
. Просто следуйте инструкциям по установке и запуску fastlane, особенно в разделе про Gemfile, ведь нам нужен быстрый и предсказуемый запуск через автоматический конвейер CI.
В каталоге проекта запустите эти команды:
xcode-select --install
sudo gem install fastlane -NV
# Alternatively using Homebrew
# brew cask install fastlane
fastlane init
fastlane запросит базовую конфигурацию, а потом создаст в проекте папку fastlane с тремя файлами:
1. fastlane/Appfile
Тут ничего сложного. Просто проверьте, что Apple ID и ID приложения указаны правильно.
app_identifier("com.vontrance.flappybird") # The bundle identifier of your app
apple_id("your-email@your-domain.com") # Your Apple email address
2. fastlane/Fastfile
Fastfile
определяет шаги сборки. Мы используем много встроенных возможностей fastlane, так что здесь все тоже понятно. Создаем одну линию, которая получает сертификаты, выполняет сборку и загружает ее в TestFlight. Можете разделить этот процесс на разные задания, если нужно. Все эти операции (get_certificates
, get_provisioning_profile
, gym
и upload_to_testflight
) уже входят в fastlane.
Действия get_certificates
и get_provisioning_profile
связаны с подходом подписания cert и sigh. Если вы используете match или что-то еще, внесите изменения.
default_platform(:ios)
platform :ios do
desc "Build the application"
lane :flappybuild do
get_certificates
get_provisioning_profile
gym
upload_to_testflight
end
end
3. fastlane/Gymfile
Это необязательный файл, но я создал его вручную, чтобы изменить выходной каталог по умолчанию и поместить выходные данные в текущую папку. Это упрощает CI. Если интересно, читайте о gym
и его параметрах в документации.
https://docs.fastlane.tools/actions/gym/
Наш .gitlab-ci.yml
Итак, у нас есть CI-раннер для проекта, и мы готовы испытать пайплайн. Посмотрим, что у нас в .gitlab-ci.yml
:
stages:
- build
variables:
LC_ALL: "en_US.UTF-8"
LANG: "en_US.UTF-8"
GIT_STRATEGY: clone
build:
stage: build
script:
- bundle install
- bundle exec fastlane flappybuild
artifacts:
paths:
- ./FlappyBird.ipa
Все отлично! Мы задаем формат UTF-8 для fastlane, как и требуется, используем стратегию clone
с исполняющей программой shell
, чтобы у нас было чистое рабочее пространство для каждой сборки, и просто вызываем flappybuild
fastlane, как видно выше. В итоге мы получаем сборку, подпись и деплой последней сборки в TestFlight.
Еще получаем артефакт и сохраняем его со сборкой. Заметьте, что формат .ipa
— это подписанный исполняемый файл ARM, который не запускается в симуляторе. Если хотите выходные данные для симулятора, просто добавьте таргет сборки, который его производит, а потом включите его в путь к артефакту.
Другие переменные среды
Здесь есть пара переменных среды, на которых все работает.
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD
и FASTLANE_SESSION
Для аутентификации в App Store и загрузки в TestFlight нужна аутентификация для fastlane. Для этого создайте пароль для приложения, который будет использоваться в CI. Подробности здесь.
Если у вас двухфакторная аутентификация, создайте переменную FASTLANE_SESSION
(инструкции там же).
FASTLANE_USER
и FASTLANE_PASSWORD
Чтобы cert и sigh вызывали профиль иницализации и сертификаты по запросу, нужно задать переменные FASTLANE_USER
и FASTLANE_PASSWORD
. Подробности здесь. Это не нужно, если вы используете другой метод подписания.
В заключение
Посмотреть, как все это работает, можно в моем простом примере.
Надеюсь, это было полезно, и я вдохновил вас работать со сборками iOS в проекте GitLab. Вот еще советы по CI для fastlane, на всякий случай. Может, захотите использовать CI_BUILD_ID
(для инкрементных сборок), чтобы автоматически инкрементировать версию.
Еще одна крутая возможность fastlane — автоматические скриншоты для App Store, которые очень просто настроить.
Расскажите в комментариях о своем опыте и поделитесь идеями по улучшению GitLab для разработки приложений iOS.