Введение
Когда вы переносите macOS CI с GitHub-hosted на самохостный runner, бюджет перестаёт быть «строкой за минуты» и превращается в связку из трёх вещей: очередь Xcode (кто ждёт CPU и RAM), раздутие диска (DerivedData, симуляторы, кэш CocoaPods и артефакты Actions) и география — пять типичных узлов в Сингапуре, Японии, Корее, Гонконге и на востоке США дают разную цену минуты полезной работы из-за задержки и пиринга. Для маленькой «CI-команды» у релиза важнее не максимальный чип, а предсказуемый календарь: кто держит тяжёлый архив, кто гоняет линтеры, и где не платить за терабайты месяцами.
Ниже — практичное разделение ролей между Mac mini M4 16 ГБ / 256 ГБ SSD, M4 24 ГБ / 512 ГБ и M4 Pro 64 ГБ / 2 ТБ, когда выгоднее доплата за 1 ТБ или 2 ТБ вместо второго узла, и как опция параллельных слотов экономит деньги, если одновременность низкая. Общую модель «срок × диск × параллель» можно сверить с материалом срок аренды, диск 1 ТБ/2 ТБ и параллель на удалённых Mac в пяти регионах; по выбору площадок — в обзоре экономия на аренде удалённого Mac в пяти регионах.
Три класса железа под три типа джобов
На практике выигрывает не «один Pro на всё», а явные ярлыки в workflow: лёгкие задачи не должны вставать в очередь за архивом App Store Connect.
| Конфигурация | Роль в GitHub Actions | Типичные джобы | Оценка |
|---|---|---|---|
| M4 16 / 256 | Быстрый «шлюз» и лёгкий CI | SwiftLint, unit без UI, скрипты, подпись лёгких таргетов | Без кэша Xcode на диске |
| M4 24 / 512 | Основной раннер сборки | Сборка с кэшем SPM/Pods, один симулятор, ночные билды | Баланс цены и RAM |
| M4 Pro 64 / 2 ТБ | Тяжёлый пик и архивы | Несколько симуляторов, UI-тесты, xcodebuild archive, большой DerivedData |
Меньше простоя очереди |
Диск 1 ТБ против 2 ТБ: когда доплата окупается
1 ТБ обычно достаточен, если вы включили агрессивную очистку после каждого job, фиксируете одну мажорную версию Xcode на раннер и не храните месячный архив артефактов локально. 2 ТБ окупается, когда в одном окне freeze несколько веток, два Xcode side-by-side или длинный кэш симуляторов — иначе стоимость «спасения» билд-инженера от ручной чистки и срывов ночных прогонов превышает разницу в абонплате.
Имеет смысл отдельно заложить в модель «стоимость переключения контекста»: когда инженер трижды в день останавливает пайплайн из-за нехватки места под DerivedData, вы платите не гигабайтами SSD, а его календарём. Напротив, если тяжёлые шаги изолированы на M4 Pro, а на M4 24/512 крутится только предсказуемый набор джобов с ограниченным кэшем, то даже длинный срок аренды с 1 ТБ не превращается в постоянную боль администрирования. Для команд, которые чередуют короткие экспериментальные ветки и длинный trunk, разумный компромисс — держать «склад» кэша на одном узле с большим диском, а остальные раннеры оставлять компактными.
Параллель и второй Mac: что дешевле для маленькой команды
Параллельные слоты (несколько одновременных сессий или очередей на одном биллинге) выгодны, когда пики короткие и не совпадают: например, QA заходит вечером, а билд-инженер утром, и CPU редко упирается в два полных Xcode одновременно. Если два разработчика реально жмут IDE или тяжёлый xcodebuild в одни и те же часы, дешевле второй узел нужного класса, чем борьба за один M4 Pro — иначе вы платите и за Pro, и за простой в очереди.
| Сценарий | Параллель | Второй Mac | Вывод |
|---|---|---|---|
| Разнесённые смены, мало overlap | Часто дешевле | Избыточно | Параллель |
| Два тяжёлых потока в один час | Риск троттлинга | Стабильнее | Второй узел |
| Отдельный лёгкий раннер + тяжёлый Pro | — | Лучшая очередь | M4 16/256 + M4 Pro |
| Пять регионов, разные офисы | Зависит от p95 | Иногда два региона | Замерять RTT |
Для распределённой команды полезно завести одну таблицу: столбцы «узел», «класс», «недели аренды», «доплата за диск», «параллель», «одновременные тяжёлые сессии», «итого на билд-час». После первого цикла сверьте её с логами Actions — цифры почти всегда отличаются от стартовой интуиции.
Матрица для CI-малой команды у релиза
Сравните четыре режима на одном календаре релиза: где вы платите за железо, а где — за ожидание в очереди GitHub Actions.
| Режим | Когда уместен | Риск | Сигнал |
|---|---|---|---|
| Один M4 Pro 64/2 ТБ на всё | Постоянно два тяжёлых потока и большой кэш | Переплата в «тихие» недели | ✓ |
| M4 24/512 + M4 16/256 | Разделить основной билд и лёгкие джобы | Два образа среды | ✓ |
| M4 24/512, 1 ТБ + параллель по сменам | Низкая одновременность, жёсткий бюджет | Пик может упереться в слот | ✓ |
| Pro только на freeze, M4 на хвост | Чёткий пик перед стором | Планировать перенос кэша | ✓ |
На практике середина цикла любит 1 ТБ с дисциплиной очистки, а финальная неделя — либо 2 ТБ, либо короткий перенос тяжёлых workflow на M4 Pro. Так вы не платите за терабайты там, где достаточно регламента и отдельного лёгкого раннера.
Не забывайте про метки runs-on и разделение очередей: один и тот же физический Mac может обслуживать разные workflow, если вы явно запретили тяжёлым джобам совпадать по времени с интерактивом. Для пяти регионов это особенно важно: задержка до репозитория и до App Store Connect не должна «удваиваться» из-за того, что вы выбрали узел без замера p95 из офисов, где сидят люди. После первого релиза пересчитайте таблицу затрат фактическими логами Actions и временем ожидания в очереди — именно эти цифры должны подкрутить смесь M4 и M4 Pro на следующий цикл, а не абстрактное сравнение спецификаций на сайте производителя.
Часто задаваемые вопросы
runs-on и узлов в двух площадках с лучшим p95 для ваших офисов; пятый регион добавляйте по фактической задержке, а не по числу стран.Почему Mac mini и macOS уместны для самохостного runner
Self-hosted Actions на macOS — это не только скрипты, но и предсказуемое ядро: Apple Silicon на M4 и M4 Pro держит смешанную нагрузку компиляции и тестов с ровным профилем энергопотребления, а macOS даёт нативный Xcode, Unix-окружение, привычный Homebrew и встроенные уровни защиты вроде Gatekeeper и SIP — меньше сюрпризов, чем на типичной «собранной под Windows» станции, и проще обосновать безопасность для доступа к сертификатам подписи.
Для раннера, который работает ночами, важны тихая работа и низкое энергопотребление в простое: Mac mini M4 уместен в офисе или колокейте без отдельной серверной, а компактный корпус снижает совокупную стоимость владения по сравнению с полноразмерными станциями. Нативный тулчейн Apple и единая память с GPU на Apple Silicon ускоряют типичные шаги CI под iOS без танцев с драйверами.
Если вы хотите закрепить ту же схему «лёгкий M4 + тяжёлый Pro» на железе без сюрпризов по шуму и охлаждению, Mac mini M4 остаётся самым понятным входом в экосистему по соотношению цены и стабильности. Имеет смысл оформить Mac mini M4 и прогнать на нём свой типовой workflow GitHub Actions, чтобы сравнить фактическое время очереди и диска с облачной арендой на своих цифрах.
Заключение
Сведите в одну таблицу: какие workflow тяжёлые, какова одновременность, сколько дней длится freeze и какой p95 из ваших офисов до выбранного узла. По ней станет видно, где резать бюджет — в чипе, в терабайтах, в параллели или в числе региональных раннеров.
Когда роли M4 и M4 Pro согласованы, аренда удалённого Mac позволяет быстро переставлять класс машины между пиком релиза и ровным CI-хвостом без CAPEX и без логистики коробок через границу.