Когда iOS и macOS команды живут в коротких релизных циклах, CI редко бывает ровной линией: в одни часы накладываются десятки workflow. Минуты GitHub-hosted macOS заканчиваются быстро, и организации добавляют self-hosted runner на железе Apple. Следующий развилка важнее маркетинга: эластичный пул облачных Mac, который масштабируется вверх-вниз, или постоянные узлы, которые всегда тёплые. Ответ держится на форме очереди, допустимой задержке и том, где живут кэши — а не на лозунгах вендоров.
Сначала смоделируйте пик — потом покупайте ёмкость
Эластичный пул выигрывает, когда средняя утилизация низкая, но пики конкурентности высокие: несколько дней в месяц нужно шесть runner'ов, а остальное время хватит двух. Постоянные узлы выигрывают, когда работа приходит непрерывно — ночные сборки, матрица на каждый PR и боты, которые не должны ждать провижининга. Возьмите семь дней логов Actions: медианная глубина очереди, p95 от queued до in_progress и как часто два job'а спорят за подпись на одном хосте. Если p95 очереди уже выше допустимого «простоя разработчика», масштабирование помогает только если новые машины готовы быстрее, чем растёт хвост — иначе вы платите за холодные старты поверх очереди.
Для недели App Store и финансовой рамки «купить vs арендовать» у нас отдельная матрица — её можно использовать как чеклист: Внезапные сборки и срочная проверка App Store в 2026: купить Mac или арендовать облачный Mac посуточно или на неделю?
Задержка — это три числа, а не один слоган
Разделите задержку control-plane (runner забрал job), data-plane (git fetch, восстановление кэша, upload артефактов) и инструментальную (компиляция Xcode). Эластичный пул часто снимает contention на control-plane за счёт labels, но если каждая свежая VM снова тратит пять минут на bootstrap зависимостей, wall time почти не двигается. Постоянные runner'ы амортизируют bootstrap сотнями job'ов — ценой простоя по питанию и риском дрейфа образа без пинов.
Важен сетевой путь: измерьте RTT и пропускную способность до Git-хоста и до удалённого кэша (S3-совместимый, Artifactory или Actions cache). Медленное TLS к далёкому региону на скриншотах выглядит как «тормозит Xcode». Для headless-паттернов и launchd см. Развёртывание OpenClaw на облачном Mac в 2026: проверки macOS вместо Linux VPS, launchd и воспроизводимый FAQ.
Кэши: липкий диск vs общий object store
Сборки Apple чувствительны к кэшу: DerivedData, CocoaPods и артефакты SwiftPM задают время restore. Эластичные узлы, которые выбрасывают диск при выключении, должны выносить кэш наружу — версионированные бакеты или read-heavy сеть — с ключами, привязанными к минорной версии Xcode и хэшам lockfile. Постоянные узлы держат горячий кэш локально, но нужно детерминированно вытеснять, чтобы ветка A не отравила ветку B. В обеих моделях промахи кэша закладывайте в SLO, а не считайте редкой случайностью.
Матрица решений одним взглядом
Таблица — первый фильтр; затем проверьте чеклист параметров ниже. Если в организации уже есть политика по runner groups и labels, зафиксируйте, какие workflow идут на общий пул, а какие — на изолированные машины с отдельным Keychain: это влияет и на стоимость, и на безопасность артефактов. Для команд, которые только переходят с GitHub-hosted, полезно две недели подряд собирать одни и те же метрики в одинаковые интервалы суток — иначе легко спутать сезонный маркетинговый пик с «вечной» потребностью в always-on.
| Сигнал | Склоняет к эластичному пулу | Склоняет к постоянным узлам |
|---|---|---|
| Коэффициент загрузки | Низкая средняя утилизация, редкие высокие пики | Высокая устойчивая загрузка по часовым поясам |
| SLO очереди | Пики терпимы, если машины появляются быстро | Жёсткая задержка pickup (<30 с) большую часть дня |
| Стратегия кэша | Удалённый кэш с хорошим hit rate на холодных runner'ах | Большой локальный SSD, предсказуемые тёплые пути |
| Комплаенс | Эфемерные диски удовлетворяют политике хранения | Долгий аудит-трейл на фиксированных хостах |
Исполняемый чеклист параметров (в runbook)
Это ручки, которые мы реально фиксируем в YAML, переменных Terraform или внутренней wiki при расчёте парка. Имена подстройте под свой слой оркестрации — важен смысл.
# Параллелизм workflow (сериализовать шумные пути) concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true # Потолок fan-out матрицы (не давить кэш) strategy: max-parallel: 4 # Парк runner (документируйте в ops-репо, не только в UI) baseline_always_on_runners: 2 # минимальная тёплая ёмкость burst_elastic_runners_max: 8 # потолок у провайдера idle_shutdown_minutes: 45 # только elastic; избегать дребезга # Ключи кэша (обязательно toolchain + lockfiles) cache_key_prefix: xcode-16_2-spm-${{ hashFiles('**/Package.resolved') }} # Цели SLO (алерт при превышении) queue_pickup_p95_seconds: 60 cache_restore_p95_seconds: 120
Раз в неделю сравнивайте оплаченные часы runner'ов с throughput слитых PR: если счёт растёт без ускорения поставки, сначала ужесточайте concurrency и ключи кэша, а не добавляйте железо.
Минимальный набор телеметрии на первые 14 дней
Логируйте отдельно время на этапах checkout, cache restore, компиляции и загрузки артефактов; сохраняйте label runner'а и версию образа в каждом job summary. Если p95 restore растёт быстрее, чем растёт длина очереди, проблема не в количестве машин, а в ключах кэша или в удалённом регионе бакета. Добавьте в дашборд долю job'ов, завершившихся по таймауту на этапе зависимостей: так вы отделите сетевые инциденты от нехватки CPU и не будете покупать «ещё один Mac», когда нужен DNS или зеркало репозитория.
Self-hosted macOS runner'ы — на железе, которое не мешает думать
Планировать эластичный пул и always-on baseline проще, когда сами Mac предсказуемы: нативный macOS, Homebrew и Xcode без слоёв эмуляции, а пропускная способность памяти Apple Silicon не превращает пики Swift и линкера в своп. Класс Mac mini M4 на простое потребляет порядка 4 Вт, тихо стоит на столе или полке, и хорошо сочетается с долгоживущими runner'ами под присмотром launchd.
Для ночного CI важны стабильность и безопасность не меньше GHz: macOS держит месяцы аптайма с низким уровнем сбоев, Gatekeeper, SIP и FileVault сужают поверхность атаки по сравнению с типичными Windows build VM. Меньше ночных звонков — выше доверие к среде подписи.
Если вы нормализуете self-hosted Actions под пики 2026 года, облачный Mac mini M4 от VPSSpark — практичная площадка, чтобы прототипировать и burst, и постоянный слой — узнайте тарифы и привяжите политику runner'ов к реальным метрикам очереди, а не к догадкам.