Без локального железа: runbook отправки, логов, stapler и офлайн-проверки на облачном Mac
Вне Mac App Store подписанные DMG, PKG и инструменты требуют цепочки доверия: Gatekeeper и notarytool сдвигают ошибки к подписи, hardened runtime, билету и stapler. На арендованном Mac чаще не хватает доказательств: UUID отправки, полного JSON из notarytool log, Keychain того же пользователя и часов, согласованных с TLS. Здесь — матрица SSH / смешанный / VNC, восемь шагов, четыре вывода для тикета и 20-минутная таблица приёмки. Ссылки: первый запуск 30 минут, NTP и сертификаты, Fastlane Match, диск и DerivedData, срочный hotfix TestFlight, экстренный iOS runbook.
Пользователи вне Store оценивают бинарник эвристиками Gatekeeper. Аренда снимает «нет Apple Silicon», но добавляет разрыв сессий, дрейф часов, прокси и границы аренды, которые удаляют ZIP, если их не промотировать во внешнее хранилище.
Потерянные логи: без notarytool log вы сжигаете квоту на одной ошибке entitlements.
Store и вне Store: Organizer не заменяет нотаризационные доказательства.
SSH-театр Keychain: код 0 без реальных диалогов согласия.
Дрейф runtime: правки в Xcode, а не в zip.
Нет отпечатка среды: нельзя воспроизвести версии инструментов.
Диск: см. чеклист 20 минут.
| Шаг / доказательство | Только SSH | Смешанный | VNC |
|---|---|---|---|
| Архив .app | обычно ок | ок | лучше для визуала |
| ZIP и submit | ок | ок | ок |
| Poll / log | ок | ок | ок |
| Keychain / Apple ID / 2FA | высокий риск | рекомендуется | рекомендуется |
| Stapler + validate | частично | рекомендуется | рекомендуется |
| Объяснение не-разработчикам | слабо | сильно | максимум |
Валюта — UUID + JSON + Keychain того же пользователя.
Отпечаток: sw_vers, xcodebuild -version, notarytool, lease id.
Подпись до отправки: codesign -dv --verbose=4, spctl -a -vv; Match — по матрице.
ZIP: symlinks, SHA256.
Submit: хранимые секреты; id дословно в тикет.
Лог при ошибке: JSON до пересборки.
Фикс в Xcode: entitlements в проекте.
Stapler: xcrun stapler staple и validate.
Smoke и промоушн: двойной клик на чистом профиле; вынести артефакты с почасового узла.
xcodebuild -version notarytool --version codesign -dv --verbose=4 "Your.app" ditto -c -k --keepParent "Your.app" "Your.zip" notarytool submit "Your.zip" --apple-id "$APPLE_ID" --team-id "$TEAM_ID" \ --password "$APP_SPECIFIC" --wait notarytool log "$SUBMISSION_ID" > notary-log.json xcrun stapler staple "Your.dmg" xcrun stapler validate "Your.dmg"
| Проверка | VNC | SSH | OK |
|---|---|---|---|
| Тот же пользователь | меню | id -un | совпадает |
| Время/TLS | Дата и время | sntp/curl | по runbook |
| Submit | опционально | строка id | UUID сохранён |
| Лог | JSON | jq | Accepted |
| Stapler | опционально видео | validate | офлайн чисто |
Официальная документация Apple по флагам notarytool и поведению stapler остаётся первичным источником истины: версии инструментов меняются, и чек-лист на сайте разработчика нужно сверять перед каждым крупным релизом. Эта статья сознательно сужена до эксплуатационного слоя: арендованный удалённый Mac, разделение SSH и VNC, упаковка доказательств для тикета и минимизация типичных ложных следов (время, прокси, чужой пользователь Keychain). Если вы параллельно гоняете пайплайн App Store Connect, вынесите нотаризацию в отдельный тикет с отдельным набором секретов: смешивание пар приложения для нотари сервиса и сессии загрузки в Organizer почти гарантированно даст «плавающие» ошибки, которые команда будет чинить в неверном порядке.
Повторяйте репетицию отката: после публикации DMG зафиксируйте пару «stapler validate + хеш файла + JSON лога» в неизменяемом архиве. Горячие патчи оформляйте новой веткой артефактов, а не перезаписью UUID прошлой отправки — иначе служба поддержки не сможет доказать, какой билд реально стоял у клиента в момент инцидента. На почасовых узлах особенно важно заранее договориться о каталогах: каталог с zip для нотари должен жить вне тяжёлых деревьев DerivedData, иначе в упаковку легко попадут отладочные символы или лишние бинарники, а лог нотари потом долго «рассказывает» про подписи, которых вы визуально не ожидали.
Корпоративные сети любят разделять DNS и TLS: если часть трафика уходит через перехватывающий прокси с HTML-страницей логина, симптомы похожи на сетевой сбой Apple, хотя корень — в политике выхода. Соберите короткий curl -v к нужному хосту и приложите к тикету рядом с NTP-скриншотом из нашего руководства по часам, прежде чем переписывать entitlements. Когда несколько инженеров делят один арендованный Mac, фиксируйте владельца ротации пар приложения и синхронизируйте запись с ACL репозитория Match — иначе безопасность и релиз-инженерия расскажут разные истории об одном и том же инциденте.
Наконец, помните: stapler не «вторая подпись», а прикрепление билета к носителю; офлайн-проверка на чистом профиле пользователя часто быстрее объясняет UX, чем споры в чате. Для очистки диска перед крупной отправкой загляните в материал про DerivedData и архивы, чтобы не потерять логи вместе с промежуточными zip при автоочистке. Если нужен быстрый параллельный маршрут публикации iOS, держите под рукой чек-лист экстренного TestFlight — но не смешивайте его учётные данные с цепочкой нотари вне магазина.
Часто да для DMG; проверьте носитель и сохраните validate.
Submit/poll обычно да; согласия — VNC тем же пользователем.
Время, прокси, аренда, раздельные Keychain.
Заморозить id, сохранить JSON, маппинг подписи.
Дорого обходится не минута upload, а возможность через квартал воспроизвести пакет доказательств. Аренда Apple Silicon с VNC держит терминал и GUI в одной наблюдаемой сессии.
Чтобы повторить приёмку: VNCMac — страница покупки Mac в облаке, центр помощи для подключения.