Настройка Code Signing через Fastlane Match
Сертифікати iOS—джерело половини CI-інцидентів у мобільних командах. Розробник звільнився та унеси Distribution Certificate, який був створений тільки на його машині. Сертифікат істік в пятницю вечером перед релізом. У CI No matching provisioning profiles found—та ніхто не розуміє, чому локально собирается, а в пайплайні нема. Fastlane Match вирішує ці проблеми через єдиний зашифрований репозиторій для всієї команди.
Як працює Match
Match зберігає сертифікати (.cer, .p12) та provisioning profiles (.mobileprovision) в зашифрованому Git-репозиторії або S3/Google Cloud Storage. При запуску match на новій машині або в CI:
- Клонує репозиторій
- Расшифровує файли паролем (MATCH_PASSWORD)
- Імпортує сертифікат у тимчасову keychain
- Встановлює provisioning profile
Без ручного скачування з Apple Developer Portal.
Першопочаткова настройка
# Ініціалізація
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—тоді ротація паролів особистих акаунтів не зламає пайплайн.
Використання у CI
lane :release do
setup_ci # створює тимчасову keychain, встановлює MATCH_KEYCHAIN_NAME
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.
Ротація сертифікатів
Сертифікати Distribution живуть 1 рік. За 30 днів до істечення запустіть fastlane match --force_for_new_devices або fastlane match nuke + перестворення. nuke відзиває всі сертифікати даного типу—робіть тільки якщо розумієте наслідки. Після перестворення всі машини/CI автоматично отримають новий сертифікат при наступному match.
Кілька додатків та розширень
Якщо проект містить App Extensions (Share Extension, Notification Service Extension, Widget), для кожного target потрібен окремий provisioning profile з відповідним app_identifier. Match підтримує масив: app_identifier(["com.myapp", "com.myapp.share", "com.myapp.widget"]).
Альтернатива: Xcode Automatic Signing у CI
Apple додала xcodebuild -allowProvisioningUpdates—Xcode сам запрошує профіли через API. Працює, але вимагає Apple ID у keychain CI-агента та не підходить для GitHub Actions/GitLab CI без macOS self-hosted агента з постійним сховищем.
Процес
Створення окремого CI Apple ID → ініціалізація match репозиторія → match init з потрібними типами → тест на локальній машині → інтеграція в Fastfile → додавання секретів у CI → тест у пайплайні.
Срок: 1–3 дні. Більшість часу йде на першопочаткове створення сертифікатів та профілів, особливо якщо проект містить кількох targets. Стоимость рассчитывается индивидуально.







