2026 Нотаризация Apple в CI на Mac в облаке: учётные данные notarytool, типичные отказы и матрица «headless SSH против короткой графической сессии»

Многие команды стабилизируют xcodebuild archive на арендованных Mac-узлах, но спотыкаются о нотаризацию: ключи API внедрены неверно, отказы Apple нечитабельны, или пайплайн проходит только с локальной GUI-сессией. Этот материал структурирует разбор: таблица классифицирует симптомы, матрица решает, достаточно ли чистого SSH, пятишаговый runbook описывает notarytool submit, опрос статуса, stapler, хранение логов и откат. Добавлены ориентиры по диску и параллелизму для обзоров ёмкости в 2026 году.

Mac cloud CI и нотаризация Apple

Содержание

1. Три цепочки нужно разделить

На самохостных Mac в облаке кодовая подпись, нотаризация Apple и загрузка в App Store Connect / TestFlight часто сваливаются в одно хранилище секретов. Цепочки связаны, но конечные точки и тексты ошибок разные.

  1. Подпись отвечает, кто выпустил бинарник: профили, цепочки сертификатов и флаги Hardened Runtime управляют codesign; логи обычно в xcodebuild.
  2. Нотаризация проверяет, принимает ли Apple форму дистрибуции: вы отправляете zip, dmg или подписанные бандлы; отказы видны в JSON notarytool или notarytool log, а не в компиляторе.
  3. Загрузка отвечает, получил ли канал сборку: Transporter, преемники или Fastlane upload_to_testflight используют другие ключи API, чем нотаризация. Общий секретный контейнер ломает многослойный разбор инцидентов.

Без разделения вы сжигаете ночные окна на «локально зелёно, в CI красно». Для SSH-автоматизации в духе VPS на macOS разделение — базовый шаг.

Оформите разделение отдельными шаблонами пайплайна, разными scope секретов и своими профилями таймаутов, чтобы медленный шаг нотаризации не выглядел регрессией компилятора, а быстрые сборки не умирали из‑за слишком коротких таймаутов загрузки. Явные пути артефактов вроде build/ipa, notary/logs и store/receipts помогают поддержке и безопасности сразу видеть слой.

Команды с Linux-VPS часто недооценивают разницу macOS во временных каталогах, связке ключей и DerivedData. Задача нотаризации кажется лёгкой, но распаковывает большие архивы локально и удалённо, создавая пики IO, которые конфликтуют с параллельными xcodebuild. Нотаризацию нужно писать в ту же таблицу ёмкости, что и параллелизм компиляции, а не в сноску.

2. Таксономия

Используйте таблицу в постмортемах, чтобы решить, смотреть ли сначала entitlements или сеть и ключи. Эксплуатация и разработка должны делить дашборды по задержкам нотаризации и длительности загрузки, иначе ответственность противоречива.

СимптомВероятная причинаПервое действие
Мгновенный сбой authНеверный issuer, просроченный ключ, обрезанный секретРоль ключа, путь .p8, переводы строк в CI
Долго In ProgressОчередь Apple, крупный пакетХранить submission id, тянуть логи, удлинить backoff
Ошибки Hardened RuntimeНеподписанные хелперы, рискованные entitlementsГлубокий codesign --verify, diff entitlements
Зелёно локально только с GUIСвязка ключей или интерактивМатрица §3, короткая очередь VNC

3. Headless и рабочий стол

Mac в облаке силён, когда launchd, SSH и мониторинг похожи на Linux-ферму. Нотаризация иногда тянет наследие GUI или связки ключей. Матрица — инженерная рекомендация; границу задаёт безопасность.

ИзмерениеHeadless по умолчаниюКороткий VNC/десктоп
Учётные данныеКлюч API + неинтерактивные флаги notarytoolДиалоги связки или только GUI-инструменты
АудитЛоги в каталоге сборки с артефактамиСложнее доказать каждый клик
СтабильностьХорошо для 24/7 и многих ветокРедко, отдельная очередь от пиков компиляции
Сочетание с Mac cloudPATH через launchd, фиксированная версия CLIИзолированная очередь нотаризации, меньше борьбы за CPU/IO
Практика: если вы уже разделили build-only и upload-only (статья TestFlight VPSMAC), нотаризация — третий job: вход — подписанный экспорт, выход — stapled-пакет и логи; не смешивать с UI-тестами.

4. Пять шагов

Последовательность переносима между CI в 2026; флаги сверяйте с установленными Command Line Tools.

  1. Закрепить toolchain. Зафиксировать xcodebuild -version на образе и явно выбирать в CI, чтобы тихие обновления не меняли поведение нотаризации.
  2. Подготовить пакет. sha256 для zip/dmg/pkg, права чтения CI, scratch для крупных бандлов.
  3. Submit с ID. notarytool submit с ключом API; stdout/JSON в artifacts/notary/submit.log для корреляции с Apple.
  4. Опрос. notarytool info с экспоненциальным backoff; при сбое прикреплять notarytool log к хранилищу артефактов.
  5. Staple и откат. Успех: xcrun stapler staple на носителе дистрибуции; логи архивировать; сбой staple — стоп релиза и хранить последнюю хорошую stapled-сборку.

Команды подавайте через загрузчик секретов, без эха ключей в консоль; экспортируйте NOTARY_SUBMISSION_ID отдельным полем артефакта для саппорта.

После каждого успеха запускайте короткий smoke на чистой VM или втором Mac, ставя только stapled-пакет: так виден дрейф между внутренним QA и тем, что клиенты видят с Gatekeeper до релиз-нот.

xcrun notarytool submit ./dist/MyApp.zip \ --key ./AuthKey_XXXXX.p8 \ --key-id "XXXXXXXXXX" \ --issuer "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \ --wait # без --wait: опрос, затем # xcrun notarytool log <submission-id> --key ... > ./notary-detail.json xcrun stapler staple "./dist/MyApp.dmg"

5. Цифры

Для SRE и обзоров ёмкости сверяйте с документацией Apple и комплаенсом.

В корпоративных сетях белые списки прокси часто покрывают Git и реестры контейнеров, но забывают домены нотаризации и Transporter — отсюда случайные таймауты, которые не лечатся простыми повторами, потому что прокси отвечает наполовину. Добавляйте исключения для сервисов Apple в том же изменении, что и расширение раннеров, и документируйте в сетевом runbook рядом с уже известными путями Xcode и CocoaPods.

Другой шаблон — ротация ключей: если один API-ключ меняет метаданные App Store Connect и заливает бинарники, утечка умножает ущерб. Разделяйте роли по минимуму привилегий и автоматизируйте напоминания в тикетах, а не полагайтесь только на письма Apple. На арендованных Mac-узлах используйте разных CI-пользователей или хотя бы разные разделы связки для build, notary и upload, чтобы компрометация одного звена не открыла всю цепочку.

Нотаризация только на ноутбуках ломается о сон, VPN и локальные политики. Поминутные хостинговые раннеры делают крупные пакеты и очереди дорогими и слабо воспроизводимыми. Выделенная ёмкость Mac cloud снижает трение: та же SSH-дисциплина, что на Linux, плюс настоящее железо Apple для цепочек инструментов и секретов.

6. FAQ

Нотаризация до TestFlight? Обычно сначала подпись и нотаризация или staple, потом загрузка — зафиксируйте порядок в runbook, чтобы не было жалоб Gatekeeper, пока App Store Connect показывает ready. Вне магазина держите логи нотаризации и квитанции загрузки раздельно. Если маркетинг или поддержка раздаёт бинарники, фиксируйте, какая stapled-версия и какие квитанции к какому коммиту относятся, иначе расследования оставят дыры.

Скачки TLS или прокси? Часто нужны разные правила HTTPS_PROXY/NO_PROXY для точек нотаризации и хостов загрузки. Проверяйте, что корпоративный MITM доверяет системной связке ключей раннера, иначе TLS-ошибки будут выглядеть как «плавающие» сбои нотаризации без явной причины в логах Apple.

Убрать VNC полностью? В современных пайплайнах часто да; остатки связки решайте разделением секретов и редким ручным гейтом вместо постоянного общего рабочего стола. Исключения документируйте в операционном руководстве, чтобы дежурный знал, нормален ли открытый экран.

Чистые Linux-VPS не заменяют Apple-железо для дистрибуции iOS и macOS. Долгосрочно аренда Mac-ёмкости часто дешевле по полной нагрузке, чем уход за своим железом: предсказуемость, аудит API-ключей и зафиксированные версии инструментов. Сочетайте материал с гайдом TestFlight VPSMAC, чтобы за один проход выровнять jobs, секреты и порядок. Чтобы стабилизировать Apple-инструменты и сохранить модель эксплуатации близкой к VPS, арендованные узлы VPSMAC обычно дают лучший баланс, чем импровизированные станции или дорогие поминутные пулы, и возвращают фокус на воспроизводимые релизы вместо тушения пожаров ad hoc.