Vuncloud Блог
← Вернуться к дневнику разработчика

Компиляция и сборка на облачном узле M4: мы перенесли конвейер

Заметки из дата-центра · 2024.03.10 ·Около 6 минут чтения

Ускорение компиляции и сборки на облачном узле M4

Основная модель Vuncloud — Mac mini M4. Для таких проектов, как наш, где нужно и запускать Xcode, и периодически работать с Docker и скриптами, разница в производительности CPU и памяти напрямую сказывается на том, «ждёшь компиляции» или «продолжаешь писать код». После переноса полной сборки старого проекта на узел M4 время чистой компиляции сократилось примерно вдвое — и дело не только в сэкономленных минутах, но и в сохранении потока работы, что особенно заметно при работе через удалённый рабочий стол.

~50%
Сокращение времени чистой компиляции
4W
Потребление энергии M4 в режиме ожидания (приблизительно)
3+
Параллельные стадии CI

Для каких сценариев сборки подходит облачный Mac?

Перед миграцией мы систематизировали типичные сценарии по степени проблемности:

Сценарий Основные проблемы Улучшение с облачным Mac
Сборка пакетов iOS / macOS Расхождение версий Xcode на локальной машине, конфликты сертификатов Образ с фиксированной конфигурацией, строгое соответствие lock-файлов
Отсутствие Mac Runner в CI Очереди в облачном CI или отсутствие оборудования Apple Выделенный узел, ночные сборки и проверки перед релизом
Совместная сборка командой «У меня собирается, у тебя — нет» Общий образ диска и кэш зависимостей
Тестирование совместимости (конкретные версии ОС) Необходимость параллельного запуска нескольких версий CLT Изоляция на нескольких узлах, гибкое переключение конфигураций
Дальнейшие планы
В дневнике мы также фиксируем такие детали, как дисковый IO, задержки сети до Git-хостинга — всё это, как и модель машины, влияет на то, готовы ли вы полностью перенести основную разработку в облако.

От «компилируется» до «можно смело переносить основную работу в облако»

Единая среда сборки снижает затраты на коммуникацию в команде
Единая образная среда позволяет любому члену команды в любой момент переключиться на одну и ту же базу сборки, избавляясь от коммуникационных издержек из-за «расхождения окружений»

Мы больше не воспринимаем облачный Mac лишь как удалённый монитор. Когда время чистой сборки заметно сократилось, команда стала выносить больше проверок в одну и ту же фиксированную среду: юнит-тесты, статический анализ и проверка подписи артефактов теперь выполняются параллельно с дизайн-ревью, что сокращает издержки на коммуникацию по сценарию «у меня проходит, у коллеги — нет».

Важное замечание
Версия Xcode, инструменты командной строки и кэш зависимостей в образе должны строго соответствовать lock-файлам репозитория — иначе скорость возрастёт, а консистентность незаметно пострадает.

На Apple Silicon линкер и компилятор Swift более чувствительны к пропускной способности памяти. Если в проекте много Swift Package, смешанных модулей или крупных Asset Catalog, рекомендуется выделить в облаке немного больше памяти, чем обычно требуется на локальной машине, — чтобы пики компиляции не задействовали swap и не свели на нет с трудом достигнутое преимущество CPU. Мы внутренне прогоняем одни и те же проекты на разных узлах по несколько раз, фиксируя медианное wall time и хвостовые задержки.

Три кита кэширования: DerivedData · CocoaPods · SPM

Кэш — это самый прямой рычаг влияния на скорость сборки. Следующие три директории рекомендуется включить в базовый образ и пометить версионными метками:

Директории кэша образа (справочно)
~/Library/Developer/Xcode/DerivedData/   # Кэш инкрементальной компиляции Xcode
~/Library/Caches/CocoaPods/              # Кэш загрузок CocoaPods
~/.spm-cache/ (или ~/.swiftpm/)           # Кэш Swift Package Manager

# В ежедневных итерациях синхронизируем только дельту, нужную для текущей сессии
# Настоящий холодный старт откладываем до мажорного обновления образа

В ежедневных итерациях старайтесь синхронизировать только дельту, необходимую для текущей сессии, а настоящий холодный старт оставляйте для момента мажорного обновления образа — так вы сохраняете скорость и снижаете нагрузку на исходящую пропускную способность.

Рекомендации по поэтапной миграции
Небольшим и средним командам не обязательно переходить в облако всем и сразу. Разумнее начать с переноса ночных сборок, регрессионных проверок перед релизом и тестов совместимости, требующих конкретных минорных версий ОС, — это позволит воспользоваться преимуществами оборудования, не нарушая привычный ритм локальной разработки.

Мониторинг, откат и «кто возьмёт трубку в три часа ночи»

Перенос сборки в облако — это не только про экономию нескольких минут wall time, но и про то, можно ли быстро локализовать проблему при сбое. Мы разделили типичные инциденты на четыре категории, для каждой из которых отдельно описаны пороги оповещений и дежурные инструкции:

  • Расхождение образа— версия Xcode или CLT обновилась без уведомления
  • Тайм-аут разрешения зависимостей— тайм-аут при получении удалённых данных SPM / CocoaPods
  • Истёкший сертификат подписи— истёк дистрибутивный сертификат или Provisioning Profile
  • Недоступность удалённого Git— медленное разрешение DNS для субмодулей ошибочно воспринимается как медленная компиляция

Если ваша команда распределена по нескольким географическим регионам, рекомендуется автоматически синхронизировать «хэш артефакта последней успешной ночной сборки» и «фрагмент лога сбоя» в канал только для чтения — это сократит утренние издержки на взаимное информирование. Так даже если кто-то в отпуске, найдётся тот, кто сможет определить: проблема в окружении или регрессия в коде.

В стратегии отката не ограничивайтесь резервным копированием всего диска — держите компактный образ с «последней рабочей комбинацией Xcode + CLT + CocoaPods»: он легче и восстанавливается быстрее, чем полный домашний каталог пользователя. Кроме того, в конвейере ночной сборки вынесите «время получения субмодулей» в отдельную метрику: отделив время DNS и рукопожатия Git от фазы компиляции, вы легче определите — нужно ли менять конфигурацию resolver или зеркалировать субмодули во внутреннюю сеть. Как только эти метрики образуют трендовый график, сопоставив их с загрузкой CPU на узле M4, станет понятно: добавлять машины или чинить сеть.

На Mac mini M4 всё это работает ещё плавнее

Все сценарии сборки из этой статьи на macOS работают «из коробки» — Xcode, терминал, Docker, Homebrew поддерживаются нативно, без настройки WSL и без борьбы с совместимостью драйверов. Mac mini M4 благодаря унифицированной памяти Apple Silicon позволяет линкеру и компилятору Swift в полной мере раскрыть потенциал параллелизма; при этом — лишь около4Wсверхнизкого энергопотребления в режиме ожидания, что позволяет ему работать круглосуточно в фоновом режиме — идеальный выбор для узла сборки.

По сравнению с Windows-серверами в той же ценовой категории Mac mini M4 превосходит их по производительности, энергоэффективности и стабильности системы: исключительно низкая частота сбоев macOS подходит для длительной работы без присмотра, механизмы безопасности Gatekeeper и SIP делают риск заражения вирусами значительно ниже, чем на платформе Windows, а компактный бесшумный дизайн дополнительно снижает долгосрочные операционные расходы.

Если вы планируете перенести конвейер сборки на стабильное высокопроизводительное оборудование,Mac mini M4 — наилучшая точка старта по соотношению цены и качества на рынке прямо сейчас——Узнать о тарифных планах прямо сейчас, чтобы ваш CI навсегда забыл об ожидании.

Ограниченная по времени акция

Не просто Mac — ваша база разработки в облаке

Выделенные вычислительные ресурсы · Глобальные узлы · Ежемесячная подписка · Без покупки оборудования

На главную
Ограниченное предложение Нажмите, чтобы просмотреть тарифы