Симптом: fastlane match завершает синхронизацию с ошибкой или сборка на удалённом Mac не находит сертификат.
Самое быстрое решение: сохраните полный исходный лог и команду запуска, определите этап сбоя и исправьте именно его. Не отзывайте сертификаты и не пересоздавайте всё хранилище до проверки доступа к Git, пароля расшифровки, Keychain и соответствия Provisioning Profile.
Эта диагностика предназначена для независимых iOS-разработчиков, которые впервые запускают fastlane match на удалённом Mac.
Она также пригодится небольшой команде после переноса сборки с локального компьютера.
Если вы поддерживаете постоянно работающий процесс упаковки, порядок проверок поможет не менять рабочие сертификаты без необходимости.
Сначала отделите сбой match от ошибки сборки
В сообщении «синхронизация не удалась» могут смешиваться разные этапы. Сначала найдите в логе последнюю успешно завершённую операцию и первую ошибку. Ошибка git clone указывает не на профиль подписи, а на доступ к хранилищу. Успешное получение файлов с последующей ошибкой расшифровки — другой случай. Ошибка xcodebuild, появившаяся после успешной установки материалов, сама по себе не доказывает, что fastlane match не синхронизировал сертификаты.
Сохраните исходный лог целиком, команду запуска и контекст выполнения: пользователь, способ запуска и выбранная схема сборки. Перед публикацией лога удалите пароли, токены, приватные адреса и другие секреты. Не начинайте с отзыва сертификатов: это может повлиять на другие сборки и не устранит неверную SSH-аутентификацию или другой Keychain.
| Наблюдение в журнале | Вероятный этап | Что проверять первым |
|---|---|---|
| Не удаётся получить репозиторий | Git-доступ и аутентификация | URL, SSH-ключ, права пользователя |
| Репозиторий доступен, но файлы не открываются | Расшифровка | Пароль match и его доступность в задании |
| Материалы получены, но подпись недоступна | Установка сертификата и Keychain | Учётную запись, Keychain и закрытый ключ |
match завершился, а xcodebuild отклоняет профиль |
Настройки подписи проекта | Bundle ID, target, профиль и сертификат |
fastlane описывает синхронизацию и параметры хранилища в документации match, а раздел устранения проблем с кодовой подписью помогает отличить ошибки установки материалов от последующих проблем Xcode. Сверяйте вывод именно с используемой командой и логом: сообщение, возникшее позднее, не следует автоматически приписывать match.
Проверьте Git-доступ и расшифровку по отдельности
Первый практический вопрос — смог ли удалённый Mac получить содержимое хранилища. Убедитесь, что используемый git_url указывает на правильный репозиторий, а SSH-аутентификация доступна тому же пользователю, от имени которого работает fastlane. Успешное подключение из вашего интерактивного терминала не подтверждает, что ключ доступен фоновому заданию или другому пользователю.
Если репозиторий не клонируется, проверьте доступ к нему и способ аутентификации до изменения настроек подписи. Если клонирование прошло, но match не может прочитать материалы, переходите к паролю шифрования. Это разные неисправности: успешный доступ к Git не подтверждает правильность пароля, а ошибка расшифровки не означает, что нужно менять SSH-ключ.
Сверьте используемые параметры git_url, git_branch и storage_mode с фактической конфигурацией проекта и описанием настроек match. Проверьте также, откуда задание получает пароль: переменная окружения, секрет CI или иной настроенный источник должны быть доступны процессу при запуске. Не выводите значение секрета в терминал и не добавляйте его в команду, которая сохраняется в общедоступном журнале.
Если на локальном Mac синхронизация проходит, а на удалённом — нет, сравнивайте не только файлы конфигурации, но и пользователя, окружение процесса и способ передачи секрета. Это помогает обнаружить различие между сеансами, не меняя содержимое общего хранилища.
Разделите сертификат, закрытый ключ и Keychain
Наличие файла сертификата ещё не означает, что система может подписать приложение. Проверьте отдельно три условия: файл был получен, соответствующая идентификация появилась в Keychain, закрытый ключ доступен процессу сборки. Для подписи требуется действительная идентификация, связанная с закрытым ключом; это различие поясняет документация Apple о сертификатах подписи и приватных ключах.
Запустите проверки в контексте того же пользователя и задания, которое собирает приложение:
whoami
security find-identity -v -p codesigning
security list-keychains -d user
Первая команда показывает учётную запись процесса; вторая позволяет проверить доступные идентификации подписи, а третья — список Keychain для пользователя. Сверяйте результаты с рекомендациями fastlane по распространённым проблемам подписи. Не делайте вывод по одному графическому сеансу: SSH, фоновый запуск и удалённый рабочий стол могут обращаться к разным пользовательским контекстам.
Если ожидаемая идентификация отсутствует, проверьте, завершилась ли установка материалов и в какой Keychain она выполнена. Если идентификация есть, но подпись всё равно не работает, установите, может ли именно процесс сборки использовать соответствующий ключ. Не экспортируйте секреты или закрытый ключ в открытый лог ради диагностики.
Короткий сценарий из практики переноса: разработчик проверил Keychain в удалённом рабочем столе, увидел сертификат и решил, что всё готово. Сборка, запущенная отдельным SSH-заданием, сертификат не обнаружила. Причина оказалась не в новом профиле, а в различии пользовательского контекста. Поэтому успешная проверка в одной сессии — не замена проверке внутри фактического задания.
Сопоставьте Provisioning Profile с каждым target
Если сертификат доступен, а Xcode сообщает о проблеме с профилем, проверьте соответствие конкретному target. Сверьте Bundle ID, тип подписи, выбранный сертификат и профиль, назначенный для этой сборки. Основное приложение и расширение могут иметь разные Bundle ID и профили; успешная подпись основного target не подтверждает настройки остальных.
| Что сопоставить | Где искать признак несоответствия | Следующий шаг |
|---|---|---|
| Bundle ID и target | Настройки подписи конкретного target | Сверить с App ID профиля |
| Тип профиля | Назначение профиля и конфигурация сборки | Проверить, подходит ли он выбранному сценарию |
| Сертификат | Допустимые сертификаты профиля | Убедиться, что установленная идентификация подходит |
| Путь к профилю | Настройки проекта и фактически выбранный файл | Проверить, что используется ожидаемый профиль |
Apple указывает порядок изменения, загрузки и удаления профилей в руководстве по управлению Provisioning Profile. Если профиль действительно нужно создать заново, сначала проверьте условия для нужного App ID и сертификата по официальной инструкции создания профиля App Store. Не используйте принудительное обновление как универсальный приём: оно не исправит неверный Bundle ID, выбранный target или недоступный закрытый ключ.
Для каждого target зафиксируйте ожидаемую пару «Bundle ID — профиль» и проверьте её в конфигурации проекта. Это особенно важно, если используются расширения, несколько приложений или разные схемы. Удаляйте или заменяйте профиль только после того, как подтвердили конкретное несоответствие.
Сверьте Xcode и фактические параметры команды
Разные результаты на одном Mac могут быть следствием разных настроек командной строки. Проверьте, какой Xcode выбрали fastlane и сборочное задание, и совпадает ли путь к инструментам с ожидаемым:
xcode-select -p
xcodebuild -version
Команды показывают выбранный путь к инструментам разработчика и версию Xcode. Их назначение и варианты использования описаны в справочнике командной строки Xcode. Снимите вывод непосредственно внутри задания, которое падает: результат из другого терминала не доказывает, что фоновый процесс использует те же инструменты.
Затем проверьте параметры fastlane. Сверьте тип подписи, список app_identifier и настройки проекта для каждой схемы. Если команда запускает несколько target, проверяйте их по отдельности, а не выводите успешность всех профилей из одного результата. Изменяйте одну причину за раз: так вы сможете связать новую ошибку или успешную сборку с конкретным исправлением.
Ветвление решения: продолжать проверку или обновлять материалы
- Если Git не клонируется, исправьте URL, SSH-аутентификацию или права доступа. Не трогайте сертификаты.
- Если Git работает, но содержимое не расшифровывается, проверьте источник пароля и среду процесса. Не пересоздавайте профили.
- Если сертификат не виден в задании, выясните, кто запускает сборку и какой Keychain доступен этому пользователю; затем повторите проверку подписи в том же контексте.
- Если сертификат доступен, но профиль не подходит, сопоставьте Bundle ID, target, тип профиля и сертификат. Обновляйте профиль только при подтверждённом несовпадении.
- Если match завершился без ошибки, а падает только Xcode, проверяйте выбранные инструменты, схему и настройки подписи проекта, а не повторяйте синхронизацию вслепую.
Такая последовательность отделяет причину от последующего симптома и уменьшает риск затронуть материалы, которые использует другая сборка.
Повторите проверку в том же окружении
После изменения одного подтверждённого параметра выполняйте контроль в том же порядке. Сначала повторите синхронизацию в контексте реального задания. Затем убедитесь, что ожидаемая идентификация подписи доступна и профиль соответствует target. После этого запустите именно целевую схему и проверьте, что итоговый архив действительно собран с нужной подписью.
Если исправление не помогло, сохраните новый полный лог и сравните его с исходным: изменился ли этап отказа, какая команда завершилась последней и под какой учётной записью шёл запуск. Не очищайте журналы до сравнения. При изменении симптома вернитесь к таблице диагностики и разберите новый этап, вместо того чтобы повторно менять уже проверенную часть конфигурации.
В команде полезно хранить краткую запись о способе запуска, пользователе задания, выбранном Xcode и результате контрольной сборки. Не включайте в эту запись пароли, закрытые ключи и содержимое секретов. Для удалённой среды заранее определите правила доступа к секретам и запишите их в руководстве по защите данных MangoVM. Если вы переносите подпись на постоянно работающий удалённый Mac, возможность связаться со службой поддержки описана на странице помощи MangoVM.
Частые вопросы
Почему fastlane match не расшифровывает хранилище на новом Mac?
Сначала подтвердите, что удалённый Mac клонирует тот же репозиторий, что и прежняя машина. После этого проверьте, доступен ли пароль шифрования именно процессу сборки. На новом Mac он может не попадать в среду SSH или фонового задания, хотя интерактивный запуск на прежнем компьютере проходил успешно. Не помещайте пароль в открытый лог и не пересоздавайте хранилище до проверки источника секрета.
Как проверить, что удалённый Mac получил закрытый ключ сертификата?
Проверьте список действительных идентификаций подписи командой security find-identity -v -p codesigning, запущенной от имени пользователя сборки. Файл сертификата в хранилище не подтверждает, что закрытый ключ установлен и доступен этому процессу. Если идентификация не отображается, сопоставьте результат с Keychain задания и проверьте, завершилась ли установка материалов fastlane match.
Что делать, если fastlane match сообщает о несовпадении Provisioning Profile?
Сверьте профиль с конкретным target: его Bundle ID, типом подписи и сертификатом. Отдельно проверьте расширения приложения — у них могут быть другие идентификаторы и профили. Если обнаружено реальное несовпадение, исправьте профиль через учётную запись разработчика и загрузите актуальный файл. Простое повторное получение профилей не устранит ошибку в настройках проекта.
Почему Keychain недоступен при запуске fastlane по SSH или из CI?
Проверяйте Keychain из того же процесса, который выполняет сборку. Сеанс удалённого рабочего стола может использовать другого пользователя или пользовательский набор хранилищ, чем SSH-команда либо фоновое задание. Сравните whoami, результат проверки идентификаций и список Keychain внутри задания. Исправляйте доступ для фактического пользователя, не считая успешный графический сеанс подтверждением.
Если локальная сборка стабильна, но удалённая регулярно останавливается из-за доступа к секретам, Keychain и различий в среде, сначала устраните эти причины и оцените, насколько часто вам нужен удалённый запуск. Использование личного компьютера позволяет оставить управление под рукой, но привязывает сборку к его доступности и локальной конфигурации; постоянно поддерживаемая машина требует отдельного обслуживания и контроля. Для временного переноса сборки или проверки стабильного удалённого окружения можно рассмотреть аренду реального Mac через MangoVM и изучить вариант удалённого Mac mini. Если вам постоянно нужна высокая загрузка или физические подключения, собственный Mac может оказаться практичнее; если же нужен временный доступ к macOS, аренда избавляет от покупки отдельной машины до того, как вы подтвердите необходимость постоянной инфраструктуры.
Часто задаваемые вопросы
Почему fastlane match не расшифровывает хранилище на новом Mac?
Чаще всего команда запускается в среде, где недоступен правильный пароль хранилища, либо используется другое значение переменной окружения, чем при успешном запуске на прежнем Mac. Сначала убедитесь, что репозиторий клонируется, затем проверьте источник секрета именно для того пользователя и задания, которое выполняет сборку. Не публикуйте пароль в логе и не создавайте новое хранилище до проверки.
Как проверить, что удалённый Mac получил закрытый ключ сертификата?
Наличие сертификата в каталоге или репозитории само по себе не доказывает, что закрытый ключ импортирован и доступен процессу сборки. В той же учётной записи выполните проверку идентификаторов подписи командой security find-identity -v -p codesigning. Если ожидаемая идентификация отсутствует или не является действительной, проверьте Keychain этого пользователя и повторите импорт в контексте задания, которое запускает сборку.
Что делать, если fastlane match сообщает о несовпадении Provisioning Profile?
Не обновляйте все профили вслепую. Сопоставьте Bundle ID конкретного target, тип подписи и сертификат, разрешённый профилем; расширения приложения проверьте отдельно. Затем изучите фактическое содержимое установленного профиля и настройки проекта. Если связь с нужным App ID или сертификатом действительно неверна, исправьте профиль в учётной записи разработчика и только после этого загрузите обновлённую версию.
Почему Keychain недоступен при запуске fastlane по SSH или из CI?
Интерактивный сеанс удалённого рабочего стола и фоновое задание могут выполняться с разными пользователями или наборами Keychain. Сравните учётную запись процесса, список доступных хранилищ ключей и результаты проверки подписи непосредственно внутри задания. Если сборка запускается по SSH, не считайте успешное открытие Keychain в графическом сеансе доказательством доступности ключа в SSH-контексте.
Читайте также
Проверьте подпись сборки на выделенном Mac от MangoVM
Используйте постоянную удалённую среду, чтобы последовательно проверить связку сертификата и профиля, доступ к связке ключей и настройки подписи.
