Вывод сразу
- Причина 1 (контекст): на bare-metal Mac-сервере сохраняются DerivedData, индекс Pods и CI Keychain; общие облачные VM часто очищаются после сессии — каждая сборка с холодного старта.
- Причина 2 (выполнение): настоящий Apple Silicon без потерь виртуализации — стабильное время
xcodebuild archiveи codesign; на облачном VPS бывает «CPU низкий, а сборка ползёт», когда соседи забирают IO. - Причина 3 (права): выделенный узел поддерживает self-hosted runner, сетевую изоляцию и свою политику сертификатов; разделяемые VM не тянут несколько Team ID и compliance-аудит.
- Главная граница — не «облако vs локально», а общая VM vs выделенный bare metal; оба часто называют «Cloud Mac».
- При >5 сборках в день или SLA релиза: сначала суточная аренда bare metal как PoC, медиана warm archive, затем неделя/месяц.
- Углубление: узкие места Archive в Xcode, ускорение ×3, практика codesign — ссылки в конце статьи.
Почему удалённая сборка iOS попадает в ловушку «облачных VM»
Без локального Mac или при необходимости автоматической упаковки 7×24 удалённая сборка iOS почти неизбежна. Многие провайдеры называют продукт «Cloud Mac», «Mac в облаке» или «Mac VPS» — цены от десятков до сотен долларов, похожий маркетинг. На успех релиза чаще влияет не месячный тариф, а то, что под капотом — общая облачная VM.
Типичные ограничения общих VM: каталог пользователя стирается после сессии, DerivedData не переживает сборки, inode и дисковая полоса делятся между арендаторами, гипервизор неполно поддерживает фреймворки Apple — и вы не знаете, не гоняет ли сосед крупный Flutter-pod install или кластер симуляторов. Итог: та же команда xcodebuild archive во вторник — 8 минут, в четверг — 22; команда винит «сеть» или «обновление Xcode», не проверяя физическую эксклюзивность среды.
Bare-metal Mac-сервер (часто хостинг Mac mini / Mac Studio, arm64 «железо», без таймшеринга) отдаёт вам CPU, unified memory и NVMe целиком. Вы ведёте его как офисную build-машину: фиксированный DEVELOPER_DIR, постоянный DerivedData, CI Keychain для CI-пользователя, self-hosted runner через launchd. В тендерах: «bare metal Mac», «dedicated Mac mini hosting» — не то же самое, что «Cloud Mac 4 vCPU».
- Заблуждение A: удалённый SSH в macOS уже годится для iOS CI.
- Заблуждение B: дешёвый shared VPS без учёта ожидания инженеров и retry релиза.
- Заблуждение C: GitHub Actions macOS и self-hosted bare metal — «оба облако», без различий.
- Заблуждение D: путать виртуальный Mac и настоящий Apple Silicon, не проверять
sysctlи baseline. - Заблуждение E: в релизную неделю добавить shared-узлы, не зафиксировав Xcode / CocoaPods — весь кэш пропал.
Большинство сбоев удалённой сборки iOS — не из-за отсутствия Mac, а из-за общей облачной VM, принятой за переиспользуемый контекст сборки.
Три ключевые причины для bare-metal Mac-сервера
Три причины соответствуют столбцам Context, Execution и Permission в таблице пяти измерений. Используйте их как жёсткие критерии закупки — не только vCPU и месячную цену.
Причина 1: контекст выполнения постоянен — конец «каждый CI с холодного старта»
Сборки iOS / Flutter сильно зависят от переиспользуемого контекста: граф модулей в DerivedData, локальный индекс CocoaPods, инкрементальное состояние Swift, разблокированный CI Keychain. Warm archive за 7–9 минут на MacBook на общей VM превращается в 18–25 — обычно потому, что контекст одноразовый: новый temp на job, ночные скрипты чистят ~/Library, или restore кэша промахивается из-за сдвига ключей.
На bare metal можно закрепить письменно постоянные пути — например /Users/ci/DerivedData/MyApp и фиксированный Pods/ — и явно передавать -derivedDataPath в workflow. В релизную неделю без лишнего flutter clean; только тогда медиана десяти warm-сборок сравнима. Это не «аренда удалённого Mac-рабочего стола»: тот для интерактивной разработки, этот — для SLA пайплайна. Разбор фазы Archive: Xcode Product → Archive — полный поток.
Причина 2: производительность настоящего Apple Silicon — без виртуализации и IO соседей
Вторая причина — предсказуемое выполнение. Unified memory Apple Silicon чувствительна к линковке крупных iOS-проектов, параллельному swiftc и индексации Xcode. Общие облачные VM, даже с меткой «серия M», добавляют overhead гипервизора и не гарантируют дисковую полосу — бэкапы соседей или чужой DerivedData создают невидимые очереди IO.
На эксклюзивном bare metal кривая CPU/IO у xcodebuild archive ближе к офисному Mac mini: пик остаётся пиком, а не 20 минут при 30 % CPU. Для команд с параллельными flavor и target в релизную неделю эта стабильность важнее удвоения vCPU на бумаге. Бенчмарки warm path: Оптимизация сборки Xcode и аренда bare metal — упаковка iOS в 3 раза быстрее.
Причина 3: подпись, сеть и compliance под вашим контролем
Третью причину недооценивают, но при нескольких Team ID, аутсорсе и compliance в финансах/медицине она часто блокирует выбор. Цепочка релиза iOS требует стабильных codesign, notarytool, профилей и Keychain. Общие VM ограничивают root, запрещают свой firewall или делят исходящий IP — Keychain пересобирается каждый раз или срабатывают проверки Apple.
Bare-metal Mac поддерживает self-hosted runner, выделенного CI-пользователя, изоляцию VLAN/SSH-туннеля и хранение сертификатов по проектам. «Кто может запустить archive» и «где лежат сертификаты» — в аудите, а не в чёрном ящике SaaS. Практика: CI iOS codesign и нотаризация.
Сравнение пяти измерений: Entry / Execution / Context / Cost / Permission
Таблица отвечает: пора ли уходить с общей облачной VM на bare-metal Mac-сервер. Единые заголовки для закупки и архитектурного ревью.
| Вариант | Entry | Execution | Context | Cost | Permission |
|---|---|---|---|---|---|
| Локальный MacBook | Без барьера | Warm очень быстро; стоп при выключении | DerivedData постоянно | Sunk cost железа | Личный Keychain; сложный аудит |
| GitHub Actions hosted | Быстрый старт YAML | Холодный старт скачет; очередь | Кэш часто miss | Поминутно; крупные репо дорого | Подпись bootstrap каждый раз |
| Shared Mac VPS (облачная VM) | Низкий месячный тариф | IO соседей; нестабильное время | Часто чистят; warm сложно | Низкая цена; скрытое ожидание | SSH есть; эксклюзив не гарантирован |
| Bare-metal Mac-сервер (выделенный) | PoC суточная аренда + SSH | Стабильная медиана archive | DerivedData/Keychain долгосрочно | Гибко день/неделя | Self-hosted runner; своя политика |
| Xcode Cloud | Интеграция ASC | Стандартизировано; мало кастома | Кэш у Apple | Оплата compute | Жёстко привязан к ASC |
Суть ограничений облачных VM: три столбца проигрывают сразу — Context не держится, Execution непредсказуем, Permission не аудируется.
Матрица сценариев: когда bare-metal Mac обязателен
| Профиль команды | Сборок/день | Сложность подписи | Рекомендация | Почему |
|---|---|---|---|---|
| Один разработчик | <3 | Один сертификат | Локальный Mac или Xcode Cloud | Контекст уже локально; мало выгоды от remote |
| Windows + Flutter | 5–20 | Несколько flavor | Один bare-metal узел | Удалённая сборка iOS нуждается в warm DerivedData |
| Аутсорс, много проектов | Пик 30+ | Несколько Team ID | Два bare-metal узла | Изоляция прав + разделение build/test |
| Редкая проверка | 1–2/неделю | Простая | Shared Mac VPS допустим | Дёшево; холодный старт ок |
| Compliance финансы/медицина | Средне | Аудит/HSM | Bare metal + сетевая изоляция | Столбец Permission должен быть под контролем |
Если вы в строке «Windows + Flutter», «аутсорс несколько Team ID» или «compliance», общая облачная VM годится лишь как вспомогательный узел — не единственный release runner.
Рекомендуемые комбинации A / B / C
Комбинация A: hosted CI + оптимизация путей (валидация)
Оставить GitHub Actions, но принудительно -derivedDataPath, зафиксировать Podfile.lock, разделить job подписи. Для <5 сборок в день и ещё неясного продукта. Смягчает часть лимитов VM, но не заменяет постоянный Context на bare metal.
Комбинация B: один bare-metal Mac как self-hosted runner (sweet spot)
Арендовать выделенный M, поставить launchd runner, персистить DerivedData; разработчики на Windows/Linux запускают удалённую сборку iOS через git push. Основной путь для большинства команд — часто выгоднее долгой покупки б/у Mac-кластера.
Комбинация C: два bare-metal узла + машина подписи (релизная неделя)
Разделить build и подпись/нотаризацию или второй узел под XCTest — избежать swap на 16 ГБ. В релизную неделю опционально третий узел под hotfix-ветки. Для команд с жёстким wall-clock SLA и параллельными ветками.
Типичные ошибки: что bare metal не исправит
- Ошибка 1: купили bare metal, но каждый CI полностью чистит DerivedData — осознанный холодный старт.
- Ошибка 2: «физическая эксклюзивность» не подтверждена письменно — на деле VM на shared-хосте.
- Ошибка 3: сравнили только месячную цену, не часы ожидания и retry релиза.
- Ошибка 4:
brew upgradeXcode на runner в релизную неделю — кэш и цепочка подписи потеряны. - Ошибка 5: 16 ГБ одновременно гоняют симулятор и archive — swap, потом «bare metal не работает».
- Ошибка 6: плавный удалённый рабочий стол принят за CI-возможность без десяти медиан archive.
Чеклист приёмки из 7 шагов (до покупки)
- Эксклюзивность письменно: arm64 «железо», не таймшеринг VPS, квота диска, право долго хранить DerivedData.
- Baseline: записать десять archive в текущей среде (включая shared VM).
- PoC суточная аренда: bare metal на неделю, тот же workflow, что в проде.
- Фиксированные пути: постоянный
DerivedData,-derivedDataPath, стратегия разблокировки CI Keychain. - Цепочка подписи: codesign → notarytool → загрузка в TestFlight полностью.
- Сравнить медианы: десять warm-прогонов до/после PoC — не одиночный экстремум.
- Зафиксировать срок аренды: при >8 сборках в день и ясной экономии PoC — неделя/месяц и второй узел.
FAQ
Чем Cloud Mac отличается от bare-metal Mac-сервера?
Cloud Mac — категория, часто с общими VM. Bare-metal Mac-сервер — эксклюзивное «железо» Apple Silicon без конкуренции соседей — идеально для постоянного DerivedData и стабильной подписи при удалённой сборке iOS.
Может ли shared Mac VPS делать удалённую сборку iOS?
Для лёгких проверок да, как основной release runner — нет. Shared VPS чистит диск, соседи забирают IO — время archive скачет, Keychain и DerivedData не держатся долго.
Bare metal дороже GitHub Actions?
Поминутный CI дорог при холодном старте и крупных репозиториях. Суточная/недельная аренда выделенного bare metal в релизную неделю часто выгоднее — медиана warm archive близка к локальному Mac.
Только Windows как среда разработки?
Код на Windows, archive и codesign на выделенном bare metal по SSH или CI — не таймшеринг VM. Подробнее: Разработка iOS на Windows — шесть подходов.
Как быстро понять, что провайдер даёт shared VM?
Спросить: гарантированная физическая эксклюзивность? постоянные каталоги? несколько арендаторов на хосте? SLA производительности? Без письменного ответа — риск как у shared VPS.
Когда окупится переход?
При >8 сборках в день и >10 минут лишнего ожидания CI за неделю PoC обычно даёт ясные цифры. Релизная неделя: добавлять машины посуточно.
Итог
Bare-metal Mac-сервер для удалённой сборки iOS — не ради «больше облака» или «дороже», а чтобы избежать тройной суммы ограничений облачных VM: контекст не держится, выполнение непредсказуемо, права не аудируются. Выделенный M + постоянный DerivedData + self-hosted runner — кратчайший путь продуктивизировать опыт офисной build-машины.
- При закупке сначала Context / Permission, потом vCPU и месячная цена.
- Приёмка по десяти медианам warm archive — не по одному удачному прогону.
- Комбинация B для большинства; в релизную неделю — C.
Следующий шаг: чеклист из 7 шагов с суточным PoC — и ссылки кластера по подписи и узким местам Archive.
Нужен выделенный bare-metal Mac для удалённой сборки iOS?
kvmboot предлагает эксклюзивные bare-metal машины Apple Silicon — день/неделя/месяц, SSH, self-hosted runner и долгосрочные пути DerivedData. Без очистки контекста и борьбы за IO, как на общих облачных VM. Команды на Windows/Linux оставляют код локально, archive и подпись — на прогреваемом узле M.