Безопасность 14 апреля 2026

2026: автоматическая и ручная подпись кода Xcode на headless арендованном облачном Mac CI

MacXCode Engineering Team 14 апреля 2026 ~14 мин чтения

Команды iOS, перенёсшие архивы на арендованный облачный Mac Apple Silicon в Гонконге, Японии, Корее, Сингапуре или США, всё ещё теряют часы на подписи. Редко виноват «сломанный» Xcode — чаще выбор CODE_SIGN_STYLE, безобидный на ноутбуке, сталкивается с headless SSH, общими связками ключей и CI без кнопки «Всегда разрешать». Этот гайд 2026 сравнивает автоматическую и ручную подпись для удалённых билдеров, даёт матрицу решений, чек-лист связка ключей + xcodebuild и ссылки на удалённый build и iOS Archive, оптимизацию удалённой подписи и экспорт IPA + API App Store Connect для следующего шага релизного поезда.

Зафиксируйте в change management, кто может менять профили: автоматика делегирует часть решений Xcode и сервисам Apple; ручной режим замораживает байты профиля в git или объектном хранилище. Оба требуют действительных сертификатов в связке ключей.

Почему подпись «взрывается» на headless облачных Mac (а локально «всё ок»)

  • Нет GUI-доверия — первый доступ к закрытому ключу или сертификату распространения должен быть предварительно разрешён; иначе xcodebuild ждёт диалог, который не появится.
  • Общая login.keychain — при 5 параллельных пайплайнах гонки проявляются как errSecInternalError или несовпадение идентичностей.
  • Ритм профилей — профили распространения всё ещё обновляются примерно раз в 12 месяцев; забытые авто-пайплайны зелёные до дня отказа.
  • Extension targets — ручные карты без bundle id App Clip / Share extension падают поздно в codesign, теряя 18–40 минут компиляции.
Перед каждым archive выведите: security find-identity -v -p codesigning, при политике — defaults read com.apple.dt.Xcode, и разрешённый CODE_SIGN_STYLE из xcodebuild -showBuildSettings.

Авто vs вручную: что Xcode реально значит в CI

Автоматическая делегирует выбор профилей Xcode и API Apple; ручная фиксирует UUID профилей на цель. Оба варианта требуют валидных сертификатов — меняется кто может мутировать входы подписи во время сборки.

Измерение Авто Вручную
Дрейф профилей Обновление через -allowProvisioningUpdates при наличии учётных данных CI должна загрузить новые .mobileprovision или быстро упасть
Комплаенс Сложнее доказать байты профиля в логах аудита Проще — версионированные артефакты
Мульти-target Xcode синхронизирует bundle id при чистых team settings Нужны явные карты для каждого встроенного target
Headless Хорошо при ASC API + автоматической разблокировке связки Хорошо при запрете мутации профилей в рантайме

Матрица решений

Сценарий Стиль Заметки
Быстрый стартап, одно приложение Авто + ASC API Связка ключей на ветку или одноразовые учётные записи macOS.
Банк / регулируемое предприятие Вручную + подписанные профили в хранилище артефактов Отключить -allowProvisioningUpdates в CI.
White-label, много bundle id Вручную Генерировать plist из метаданных CI.
Общий bare-metal Mac mini M4 24 ГБ Любой Разделять пользователей macOS между продуктами.
Пропускная способность: разблокировка login-связки на 3600 секунд покрывает большинство архивов до 25 минут; при 40+ минутах поднимайте до 7200 или делите target.

Дисциплина связки ключей

  1. Одна подписывающая личность на роль CI.
  2. Разделение файлами~/Library/Keychains/ci-signing.keychain-db и KEYCHAIN_PATH.
  3. Неинтерактивная разблокировка — документировать security unlock-keychain.
  4. Блокировка после job — по желанию на multi-tenant.

partition list

security set-key-partition-list -S apple-tool:,apple: -s -k "" -D "iPhone Distribution: Your Team" ~/Library/Keychains/login.keychain-db

Флаги xcodebuild

  • CODE_SIGN_IDENTITY — явно в Release.
  • DEVELOPMENT_TEAM — совпадение с team id профиля.
  • PROVISIONING_PROFILE_SPECIFIER — предпочтительно в ручном режиме.
  • -allowProvisioningUpdates — сильный для авто; часто запрещён в enterprise.

Особенности общих облачных Mac

Билдер в Сингапуре, разработчики в Европе: задержка редко ломает подпись, но дрейф часов ломает TLS к Apple при > ~120 секунд. Держите ntp здоровым. Разовые импорты сертификатов — через VNC, затем снова чистый SSH CI.

FAQ

Вопрос Ответ
Смешивать стили по target? Технически да, практически нет.
Проверка экспортной подписи? См. экспорт IPA + ASC API.
Регион MacXCode ближе к ASC? Тестировщики и юрисдикция; узлы на pricing, база SSH в help.

Почему Mac mini M4 на bare metal важен

Подпись нагружает CPU при крупных Swift-бинарниках и повторном запечатывании фреймворков. Mac mini M4 с unified memory снижает swap на удалённые диски. Сеть регионов HK / JP / KR / SG / US MacXCode сохраняет одинаковую SSH-автоматизацию.

Итог: авто, если безопасно обновлять учётные данные; вручную, если нужны замороженные байты профиля. Сначала наведите порядок в связке ключей. План ёмкости: pricing; чеклисты связи: help.

Выделенные M4-билдеры для предсказуемой подписи

NVMe 1 / 2 ТБ · HK · JP · KR · SG · US · SSH / VNC