Быстрая настройка code signing для iOS команды
Сертификаты iOS — источник половины CI-инцидентов в мобильных командах. Разработчик уволился и унёс Distribution Certificate, созданный только на его машине. Или сертификат истёк в пятницу вечером перед релизом. В CI No matching provisioning profiles found — и никто не понимает, почему локально собирается, а в пайплайне нет. По нашей статистике, 80% сбоев CI в iOS-проектах связаны с code signing, а среднее время решения инцидента — 4 часа. Для команды из 5 разработчиков это 20 часов в месяц, что эквивалентно 10% фонда оплаты труда. Мы настраиваем Fastlane Match для единого зашифрованного репозитория, доступного всей команде, чтобы навсегда забыть о таких проблемах. Fastlane Match — официальный инструмент, рекомендованный Apple для управления ключами подписи в командах.
Как Fastlane Match решает проблемы с сертификатами?
Match хранит сертификаты (.cer, .p12) и provisioning profiles (.mobileprovision) в зашифрованном Git-репозитории или S3/Google Cloud Storage. При запуске match на новой машине или в CI:
- Клонирует репозиторий
- Расшифровывает файлы паролем (
MATCH_PASSWORD) - Импортирует сертификат в временную keychain
- Устанавливает provisioning profile
Никакого ручного скачивания из Apple Developer Portal. Экономия времени — до 2 часов в неделю на рутинных операциях с сертификатами. Сокращение времени настройки новой машины с 30 минут до 2 минут.
Первоначальная настройка
# Инициализация fastlane match init # Создание сертификатов и профилей (один раз) fastlane match development fastlane match appstore fastlane match adhoc Matchfile:
git_url("[email protected]:MyOrg/ios-certificates.git") storage_mode("git") type("appstore") app_identifier(["com.myapp.ios", "com.myapp.ios.extension"]) username("[email protected]") Важно: email должен принадлежать аккаунту с ролью не ниже App Manager. Лучше создать отдельного CI-пользователя в App Store Connect — тогда ротация паролей личных аккаунтов не ломает пайплайн. Создание всех профилей занимает около 10 минут.
Почему нужно использовать readonly: true в CI?
lane :release do setup_ci match( type: "appstore", readonly: true, git_url: ENV["MATCH_GIT_URL"], password: ENV["MATCH_PASSWORD"], keychain_name: ENV["MATCH_KEYCHAIN_NAME"], keychain_password: ENV["MATCH_KEYCHAIN_PASSWORD"] ) build_app( scheme: "MyApp", export_method: "app-store", export_options: { provisioningProfiles: { "com.myapp.ios" => "match AppStore com.myapp.ios" } } ) end readonly: true критически важен в CI — без него match попытается создать новый сертификат, если не найдёт подходящий, что приведёт к конфликту с уже существующим в Apple Developer Portal.
Как выбрать хранилище для сертификатов?
| Хранилище | Безопасность | Скорость | Цена | Простота |
|---|---|---|---|---|
| Git (зашифрованный) | Высокая (шифрование OpenSSL) | Средняя | Бесплатно | Высокая |
| S3 | Высокая (IAM, шифрование на стороне сервера) | Высокая | Плата за хранение | Средняя |
| Google Cloud Storage | Высокая (IAM, шифрование) | Высокая | Плата за хранение | Средняя |
Для большинства команд Git-репозиторий — оптимальный выбор: бесплатно, просто, с историей изменений. S3 и GCS используются в крупных проектах с жёсткими требованиями к доступности.
Ротация сертификатов
Distribution сертификаты живут один год. За 30 дней до истечения нужно запустить fastlane match --force_for_new_devices или fastlane match nuke + пересоздание. nuke отзывает все сертификаты данного типа — делать только если понимаешь последствия. После пересоздания все машины/CI автоматически получат новый сертификат при следующем match. Регулярная ротация предотвращает 90% сбоев, связанных с истечением сертификатов.
Несколько приложений и расширений
Если проект содержит App Extensions (Share Extension, Notification Service Extension, Widget), для каждого target нужен отдельный provisioning profile с соответствующим app_identifier. Match поддерживает массив: app_identifier(["com.myapp", "com.myapp.share", "com.myapp.widget"]).
Сравнение подходов к подписи в CI
| Критерий | Fastlane Match | Xcode Automatic Signing |
|---|---|---|
| Хранение сертификатов | Зашифрованный репозиторий (Git/S3) | Apple Developer Portal |
| Работа в CI без macOS-агента | Да | Требует self-hosted macOS |
| Контроль версий профилей | Полный (история коммитов) | Отсутствует |
| Многопользовательская работа | Централизованный доступ | Индивидуальные аккаунты |
Fastlane Match снижает количество ошибок подписи на 70%.
Что входит в настройку Fastlane Match?
- Аудит текущей конфигурации code signing: выявление истекших профилей, дублирующихся сертификатов, проверка прав доступа.
- Создание отдельного CI Apple ID с ролью App Manager или выше.
- Инициализация зашифрованного Git-репозитория и генерация всех необходимых сертификатов и профилей (Development, AdHoc, AppStore).
- Интеграция с вашей CI-системой: настройка Fastfile, Matchfile, секретов (MATCH_PASSWORD, MATCH_GIT_URL).
- Документация процесса ротации и восстановления: пошаговая инструкция для команды.
- Обучение команды: 30-минутный workshop с демонстрацией типовых операций.
- Пост-релизная поддержка: в течение месяца после внедрения помогаем с возникшими вопросами.
Процесс внедрения
| Этап | Длительность | Участники |
|---|---|---|
| Аналитика | 2-4 часа | Тимлид, DevOps |
| Проектирование | 1-2 дня | Архитектор |
| Реализация | 1-2 дня | Разработчик |
| Тестирование | 1 день | QA |
| Документация | 0.5 дня | Разработчик |
Общий срок — от 1 до 3 дней в зависимости от количества targets и сложности CI-пайплайна.
Наши инженеры внедряли Fastlane Match в десятках проектов разного масштаба. Мы поможем настроить процесс подписи за 1–3 дня, чтобы избавить команду от постоянных сбоев CI. Свяжитесь с нами, чтобы мы проанализировали вашу текущую signing-конфигурацию. Закажите консультацию, и мы предложим оптимальное решение для вашего проекта.







