Главная / Блог / CI/CD
ENGINEERING BLOG · 2026.08.12

Конфигурация Mac для Xcode 27: удалённая сборка

Сборка внезапно упирается в несовместимую систему, swap или очередь CI, хотя сам Xcode запускается.

Быстрое решение: для Xcode 27 сначала отбрасываются все Mac без Apple Silicon и без поддерживаемой версии macOS, затем конфигурация выбирается по реальному числу параллельных сборок, симуляторов, индексации и размеру кэша. Если нагрузка пока неизвестна, разумнее сначала арендовать удалённый Mac на короткий срок, снять метрики проекта и только после этого закреплять долгосрочный узел.

Эта статья предназначена разработчикам iOS и macOS, которым нужно проверить существующую среду перед переходом на Xcode 27. Она также пригодится инженерам CI/CD и руководителям платформенных команд, выбирающим Mac для постоянной удалённой сборки, тестирования и архивирования.

Последняя проверка выполнена 12 августа 2026 года. Версионные данные сверены с официальными системными требованиями Xcode, примечаниями к Xcode 27 beta и журналом релизов Apple Developer.

01

На текущем этапе Xcode 27 beta — это тестовая версия, а не финальная спецификация для всех будущих выпусков. Apple указывает, что Xcode 27 beta устанавливается и работает только на Mac с Apple Silicon, а требуемая система — macOS Tahoe 26.4 или новее. В таблице системных требований также указаны SDK для iOS 27, iPadOS 27, tvOS 27, watchOS 27, visionOS 27 и macOS 27, а используемый компилятор — Swift 6.4. Эти данные относятся к опубликованной beta-версии и должны повторно проверяться после выхода нового beta, RC или стабильного релиза.

Проверка Что должно быть подтверждено Что означает отказ
Архитектура Apple Silicon Узел не подходит для запуска Xcode 27 beta
Система macOS Tahoe 26.4 или более новая версия из официальной таблицы Xcode может не установиться или не запуститься
Версия Xcode Конкретная beta-сборка зафиксирована в CI Результаты разных узлов нельзя корректно сравнивать
SDK Установлены нужные платформы и Simulator Runtime Проект запускается, но не собирается для выбранной цели
Доступ к инструментам Работают xcodebuild, xcrun, simctl и devicectl Автоматизация не готова к эксплуатации

Важно разделять три уровня:

  1. Запуск — приложение Xcode открывается и видит проект.
  2. Сборка — конкретный workspace проходит build, test или archive.
  3. Эксплуатация в CI — узел выдерживает очередь, перезапуск, очистку кэша и работу без графической сессии.

Успешная установка не доказывает, что Mac пригоден как постоянный сервер. Например, нужный Simulator Runtime может отсутствовать, сертификаты могут требовать ручного доступа, а сборка может завершаться только при интерактивно открытом Xcode.

Для первоначальной проверки на удалённом узле достаточно выполнить:

BASH
sw_vers
uname -m
xcodebuild -version
xcode-select -p
xcrun simctl list devices
xcodebuild -showsdks

Ожидается архитектура arm64, корректная версия macOS, выбранный путь к Xcode и наличие платформ, необходимых проекту. Apple отдельно документирует xcodebuild, simctl и devicectl как инструменты командной строки для автоматизации сборок и взаимодействия с устройствами. Подробный список приведён в справочнике командных инструментов Xcode.

Внимание. Финальные требования Xcode 27 пока нельзя подменять слухами о будущих моделях Mac или предполагаемой производительности. На 12 августа 2026 года подтверждёнными остаются требования опубликованной beta-версии; дату стабильного релиза и окончательные изменения совместимости следует считать неизвестными.

02

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

Нужно разделить нагрузку минимум на четыре сценария:

  • Инкрементальная сборка после изменения нескольких исходных файлов;
  • Полная сборка после очистки DerivedData;
  • Архивирование с release-настройками, подписью и экспортом;
  • Параллельные тесты с несколькими workers или Simulator Runtime.

Стандартная команда для базовой проверки может выглядеть так:

BASH
xcodebuild \
  -workspace App.xcworkspace \
  -scheme App \
  -configuration Release \
  -destination 'generic/platform=iOS' \
  -derivedDataPath "$PWD/DerivedData" \
  clean build

Для сравнения узлов необходимо зафиксировать:

  • один и тот же commit;
  • одну версию Xcode 27 beta;
  • одинаковые зависимости;
  • одинаковую папку DerivedData;
  • одинаковые параметры подписи или отключённую подпись, если она не нужна;
  • одинаковое число параллельных задач;
  • одинаковое состояние кэша до каждого запуска.

Результат следует записывать не как «этот чип быстрее», а как набор наблюдений:

TEXT
wall time:        00:00:00
CPU average:      00%
CPU peak:         00%
queue wait:       00:00:00
exit status:      0

Для CI особенно важен queue wait. Если сборка занимает приемлемое время, но задания регулярно ждут свободный слот, проблема решается не только более быстрым процессором. Возможны три варианта: увеличить параллельность, добавить второй узел или изменить правила очереди. Один мощный Mac не всегда эффективнее двух менее загруженных узлов, особенно когда разные ветки проекта требуют независимых версий SDK или сертификатов.

Документация Apple описывает build system как набор задач, который анализирует исходники и настройки проекта перед компиляцией. Поэтому изменение схемы, целевой платформы или режима сборки может менять профиль нагрузки сильнее, чем формальная разница между двумя поколениями Apple Silicon. Ориентиром служит описание системы сборки Xcode, а не рекламный показатель процессора.

03

Запрос «сколько памяти нужно серверу Xcode 27» не имеет одного правильного ответа. Память одновременно расходуют:

  • индексатор Xcode;
  • процессы Swift и Clang;
  • linker и скрипты сборки;
  • несколько экземпляров Simulator;
  • тестовые workers;
  • локальный агент кодирования;
  • SSH-сессии, журналы и фоновые сервисы;
  • кэш зависимостей и DerivedData.

Поэтому узел для последовательного archive и узел для интерактивной работы с несколькими симуляторами нельзя оценивать одной шкалой.

Во время теста следует наблюдать:

BASH
memory_pressure
vm_stat
ps -axo pid,ppid,%cpu,%mem,rss,command

На графическом узле дополнительно проверяются Activity Monitor и состояние Simulator. Ключевые признаки нехватки памяти:

  • растущее давление на память;
  • регулярная активность swap;
  • заметное увеличение времени одинаковой сборки;
  • завершение тестового worker или Simulator;
  • сообщения о нехватке ресурсов;
  • перезапуск процессов без ошибки компилятора.

Для командного CI полезно начать с последовательных задач, затем включить параллельность, которая соответствует реальной очереди. Если при одном archive память стабильна, но при двух одновременных тестах начинается swap, увеличение процессорного ресурса не исправит проблему. Сначала требуется больше памяти, снижение числа workers или разделение задач по узлам.

Apple указывает, что Simulator работает на Mac и не полностью воспроизводит поведение физического устройства. Поэтому несколько симуляторов — это нагрузка на хост, но не замена проверке на настоящем устройстве. Ограничения среды описаны в документации по запуску приложений на симуляторах и физических устройствах.

04

Медленная сборка часто ошибочно воспринимается как слабый CPU. На практике задержку могут создавать переполненный диск, большое число промежуточных файлов, повторная загрузка зависимостей и очистка кэша перед каждым заданием.

На удалённом узле нужно отдельно учитывать:

  • сам Xcode;
  • установленные SDK и Simulator Runtime;
  • DerivedData;
  • Swift Package Manager и другие кэши зависимостей;
  • результаты тестов;
  • архивы и экспортированные приложения;
  • журналы CI;
  • резервные копии и временные файлы.

Проверка начинается с простых команд:

BASH
df -h
du -sh ~/Library/Developer/Xcode/DerivedData
du -sh ~/Library/Developer/Xcode/Archives
du -sh ~/Library/Developer/CoreSimulator

Тест проводится в двух режимах:

  1. Холодный кэш — очищается DerivedData или используется новый путь, зависимости проверяются заново.
  2. Тёплый кэш — повторяется тот же build без удаления промежуточных результатов.

Сравниваются wall time, объём свободного места до и после запуска, длительность операций с зависимостями и время создания архива. Если холодный запуск медленный, а тёплый стабилен, узлу может не хватать не процессора, а правильно организованного кэша. Если оба режима постепенно замедляются, проверяется I/O и рост временных каталогов.

В конфигурациях сборки есть параметры путей для промежуточных файлов и продуктов. Их следует контролировать через справочник build settings Xcode, а не менять случайно в скрипте CI. Для каждого проекта заранее определяется политика:

  • сколько архивов хранить;
  • когда очищать старые DerivedData;
  • какие зависимости кэшировать;
  • где сохранять логи;
  • как действовать при заполнении диска.

Опыт эксплуатации. Очистка всего кэша перед каждым запуском делает результаты формально воспроизводимыми, но может скрывать реальную производительность рабочего CI. Правильнее иметь отдельный холодный тест для диагностики и обычный тёплый режим для измерения ежедневной работы.

05

Удалённый Mac — это не только процессор, память и диск. Для разработчика важны SSH, удалённый рабочий стол, сохранение фоновых задач и восстановление после перезагрузки.

Проверочный сценарий должен включать:

  1. Подключение по SSH и выполнение команды, которая пишет лог.
  2. Разрыв локального соединения.
  3. Повторное подключение и проверку продолжения задачи.
  4. Перезапуск узла.
  5. Проверку автозапуска нужных сервисов.
  6. Повторный запуск xcodebuild.
  7. Проверку состояния Simulator после восстановления.
  8. Контроль прав доступа к сертификатам, keychain и проектным каталогам.

Для фоновой работы удобно применять tmux, launchd или CI-агент, но выбор инструмента не отменяет проверку после reboot. Задача, которая переживает закрытие SSH, ещё не считается отказоустойчивой, если после перезапуска требуется вручную открыть Xcode, разблокировать keychain или повторно выбрать developer directory.

Интерактивная разработка и безголовый CI требуют разных проверок. Для CI важны стабильность SSH, доступность командной строки, корректное хранение секретов и предсказуемый reboot. Для работы с Simulator дополнительно проверяются задержка удалённого экрана, обработка клавиатуры, вставка текста и возможность увидеть зависший тест.

06

Какой минимум нужен для запуска Xcode 27?

Минимальный подтверждённый порог — Apple Silicon и macOS Tahoe 26.4 или новее, если эта версия остаётся в актуальной таблице системных требований. Но такой узел следует считать только совместимым. Для CI ещё потребуются нужные SDK, Simulator Runtime, права подписи, рабочие команды xcodebuild и успешный тест на проекте.

Что важнее для сборочного сервера: процессор или память?

Зависит от профиля. Для последовательного архивирования сначала сравнивают wall time и загрузку CPU. Для нескольких симуляторов, индексации и параллельных workers сначала проверяют memory pressure, swap и завершение процессов. Если CPU недогружен, а память исчерпана, более быстрый процессор не даст ожидаемого результата.

Как определить конфигурацию для нескольких iOS-симуляторов?

Сначала фиксируется число параллельных workers и набор Runtime, затем симуляторы добавляются по одному. На каждом шаге записываются длительность тестов, память, swap и ошибки. Не следует считать только количество открытых устройств: один тестовый worker может создавать отдельную нагрузку, а фоновые индексатор и сборка продолжают работать одновременно.

Как сравнить удалённые Mac без искажения результата?

Одинаковыми должны быть commit, Xcode, схема, команда, состояние DerivedData и число параллельных задач. Тест выполняется минимум в холодном и тёплом режиме. В отчёт включаются wall time, CPU, память, swap, очередь и результат восстановления после разрыва SSH. Только такой протокол показывает пригодность узла, а не случайный результат одного запуска.

07

Ниже приведён не список гарантированных аппаратных характеристик, а способ связать профиль проекта с решением. Конкретные доступные конфигурации нужно проверять на странице тарифов ZUKCLOUD и подтверждать тестовым запуском.

Профиль Основная нагрузка На что смотреть первым Когда нужен следующий уровень
Последовательный CI build и archive по одному wall time, стабильность CPU, холодный и тёплый кэш очередь растёт или archive замедляется при повторных запусках
Интерактивная разработка Xcode, индексатор, один Simulator память, отзывчивость удалённого рабочего стола, SSH появляются swap, зависания индексации или задержки интерфейса
Параллельные тесты несколько workers и Simulator memory pressure, число ошибок, длительность тестов тесты завершаются с ошибками или время растёт непропорционально
Командный CI несколько репозиториев и очередь queue wait, изоляция кэшей, восстановление задания долго ждут слот или требуют разных SDK
Платформенная команда разные версии проекта и частые релизы воспроизводимость, права, rollback, reboot один узел становится общей точкой отказа

08

Каждое утверждение о достаточности конфигурации должно быть связано с наблюдаемым доказательством. Запись «работает быстро» для выбора постоянного узла недостаточна.

Метрика Условие теста Доказательство прохождения Триггер расширения
Совместимость установка Xcode 27 beta и запуск CLI Apple Silicon, macOS из поддерживаемого списка, рабочий xcodebuild отказ установки, отсутствующий SDK или Runtime
Компиляция одинаковый commit и команда повторяемый exit status 0 и записанный wall time рост времени при повторных запусках
Параллельность заданное число CI-задач очередь и время выполнения остаются контролируемыми queue wait становится заметной частью цикла
Память archive плюс тесты и Simulator нет критического pressure, swap и завершённых workers swap, падения или ручной перезапуск
Хранилище холодный и тёплый кэш свободное место контролируется, очистка документирована кэш быстро разрастается или I/O замедляет build
Восстановление разрыв SSH и reboot задача завершается или корректно возобновляется требуется ручное вмешательство

09

Итоговый отчёт должен содержать не только название модели, но и контекст, в котором она проверялась.

Поле отчёта Что зафиксировать
Версия среды Xcode 27 beta, macOS, SDK и Simulator Runtime
Исходные данные commit, ветка, зависимости и параметры подписи
Команды полный вызов xcodebuild, тестовые параметры и число workers
Кэш холодный или тёплый режим, путь DerivedData и политика очистки
Результат wall time, queue wait, CPU, memory pressure, swap и exit status
Отказоустойчивость поведение после разрыва SSH, reboot и повторного запуска
Решение подходит, требует расширения или не подходит для сценария

Практичный порядок действий выглядит так:

  1. Проверить Apple Silicon и поддерживаемую macOS.
  2. Зафиксировать конкретную beta-сборку Xcode 27.
  3. Установить только необходимые SDK и Simulator Runtime.
  4. Запустить холодный build на настоящем проекте.
  5. Повторить его с тёплым кэшем.
  6. Добавить archive и автоматические тесты.
  7. Увеличить параллельность до фактического уровня CI.
  8. Наблюдать память, swap, диск, CPU и очередь.
  9. Проверить разрыв SSH и перезагрузку.
  10. Сохранить логи и только затем выбрать срок аренды или расширение.

Если текущий вариант — локальный Windows/Linux-компьютер, виртуальная macOS или самодельная схема с нестабильным доступом к Mac, у него обычно остаются три практических недостатка: нет гарантии полного соответствия Apple Silicon и системных требований, сложно воспроизвести постоянный CI-узел, а восстановление после сбоя часто зависит от ручного вмешательства. Покупка собственного Mac mini решает часть вопросов, но требует капитальных затрат, обслуживания и заранее выбранной конфигурации.

Для неопределённой нагрузки более осторожный путь — сначала взять удалённый Mac в ZUKCLOUD на короткий период, выполнить этот протокол на собственном проекте и сохранить результаты. Подходящие варианты подключения и оформления можно посмотреть на странице заказа удалённого Mac. Если тесты подтверждают нужную скорость, память и восстановление, тогда уже имеет смысл закреплять длительный срок или добавлять параллельный узел; если нет, конфигурацию можно изменить до того, как команда будет привязана к неудачному постоянному решению.