00Боли: gym зелёный, upload красный, webhook молчит
Три боли сжимают релизное окно в часы на арендованном M4 16 ГБ.
- Обрезанные логи: обрыв SSH оставляет половину трассировки xcodebuild — ошибки подписи прячутся за общим exit code.
- Конкуренция за память: шлюз OpenClaw плюс вторая полоса архивации вызывает swap; gym выглядит «зависшим».
- Пробелы в алертах: CI шлёт только коды статуса — дежурный не может воспроизвести без структурированной сводки.
01Пики памяти: бюджетный M4 16 ГБ под Fastlane gym
Полевые замеры на узлах vuzcloud (одна схема, Release, dSYM включён). Заложите ~1,5 ГБ для шлюза OpenClaw в том же спайке.
| Фаза | Наблюдаемый пик (16 ГБ) | Пороговое действие |
|---|---|---|
| Прогрев DerivedData | 6–8 ГБ RSS | Одна полоса OK |
| Пик gym archive | 10–12 ГБ RSS | Закройте Simulator; без VNC |
| Устойчивый swap | >14 ГБ 3+ мин | 24 ГБ или второй узел |
02Поля лога gym / xcodebuild для извлечения OpenClaw
Запускайте bundle exec fastlane gym --verbose и пишите лог в фиксированный путь (например /var/log/ios/gym-latest.log). Сопоставьте якоря с JSON для webhook. Зафиксируйте версию Fastlane в Gemfile, чтобы правила OpenClaw не «плыли» между продлениями аренды.
Если архив успешен, а export падает — ищите exportArchive и error: в одном хвосте лога, а не только ARCHIVE FAILED. На удалённом Mac держите set -o pipefail в обёртке CI: иначе tee скроет ненулевой exit xcodebuild и OpenClaw получит ложный exit_signal.
Для воспроизводимости сохраняйте хеш коммита, номер сборки Xcode (xcodebuild -version) и имя узла vuzcloud в том же JSON — это снижает споры «у нас локально работало» между офисом и арендованным хостом.
| Поле | Якорь в логе | Решение |
|---|---|---|
| exit_signal | ARCHIVE FAILED / ** ARCHIVE SUCCEEDED ** |
Сборка vs этап подписи |
| signing_hint | Code Sign error, Provisioning profile |
Keychain + профили |
| target_line | Первая непустая строка после error: |
Заголовок webhook |
| duration_sec | ▸ Archive до финальной метки времени |
Таймаут gym (рекомендуем 90 мин) |
03Предпроверка TestFlight перед upload (таблица порогов)
Не вызывайте pilot upload или Transporter, пока не пройдены все строки.
- Версии:
CFBundleShortVersionStringвыше последней сборки в Connect;CFBundleVersion+1. - Compliance: export compliance, флаги шифрования, URL privacy manifest заполнены в Connect.
- Артефакты: IPA < 4 ГБ; dSYM в выходе архива.
- Подпись: distribution cert действителен;
security find-identity -v -p codesigningпоказывает ожидаемую identity. - Канал: либо
fastlane pilot upload, либо контур Transporter — не смешивайте legacy API keys.
04Webhook шлюза OpenClaw (минимальный payload)
Установите и запустите openclaw gateway по матрице установки OpenClaw. Токены API — только чтение логов и post webhook; не вставляйте ключи App Store Connect в промпты Skills. Проверьте openclaw doctor до первого ночного релиза: сбой демона на 16 ГБ часто маскируется под «медленный gym».
При сбое POST JSON с полями:
- pipeline:
fastlane_gym|testflight_upload - node_region: hk | sg | usw (см. таблицу RTT)
- summary: ≤280 символов с
signing_hintиtarget_line - log_tail_url: presigned read-only — без секретов в теле
05RTT узлов: Гонконг/Сингапур vs US West (upload + SSH)
Иллюстративный P90 с ноутбуков Восточной Азии; перезамерьте из офиса. Контекст: матрица RTT APAC vs US West.
| Трасса | Узел HK / SG | Узел US West |
|---|---|---|
| SSH / интерактив | 15–45 мс | 120–200 мс |
| Крупный IPA upload | Транстихоокеанский разброс | Часто ровнее вне пика |
| Правило split | Если интерактивный P90 >200 мс: сборка на US West, ревью на HK/SG | |
06Объединённая приёмка: от gym до обработки TestFlight
- Шаг 1: Аренда M4 16 ГБ на покупке; SSH по помощи; ≥30 ГБ свободного диска.
- Шаг 2: Запуск gym; подтвердить
** ARCHIVE SUCCEEDED **и пути Fastfile. - Шаг 3: Чеклист предпроверки;
pilot uploadили Transporter с таймаутом upload 45 мин. - Шаг 4: Доставка webhook OpenClaw; сборка в Activity App Store Connect.
- Шаг 5: Регрессия IAP — гайд StoreKit 2; приложите скрин RTT + RSS для закупки.
07FAQ: подпись и таймаут на удалённом Mac
Почему gym уходит в таймаут? Заблокированный keychain, холодный DerivedData при высоком RTT или swap при второй полосе с OpenClaw. Прогрейте кэш, закройте симуляторы; разблокируйте login keychain раз за SSH-сессию.
Несовпадение provisioning после клона? Перекачайте профили в Xcode на удалённом хосте — устаревшие UUID в репо часто всплывают на export, не на compile.
gym OK, TestFlight нет? Таблица предпроверки, затем логи pilot/Transporter — см. статью Transporter выше.
Webhook молчит? URL прослушивания gateway, TLS, лимиты тела; curl образца JSON до CI.
Стоит ли гонять gym и StoreKit sandbox в одном спайке? На 16 ГБ — последовательно: сначала релизный контур Fastlane/TestFlight, затем регрессия IAP по матрице StoreKit; параллель даст swap и ложные таймауты upload.
Запустите iOS-конвейер на бюджетном Mac vuzcloud
Продолжите с логами Transporter и матрицей StoreKit sandbox. С главной выберите входной тариф на тарифах, затем оформите аренду для SSH.