Билд-хосты в Сингапуре, а оркестрация и выгрузка артефактов — в США или ЕС? Материал для команд, которые параллелят unit- и UI-тесты XCTest на удалённых Mac: шесть заблуждений, из-за которых «локально зелёно, в CI красно» выглядит как флаки; две таблицы, связывающие M4 / M4 Pro, число Simulator, запас диска под DerivedData и срок аренды; готовые флаги xcodebuild, команды обхода диска и шестишаговый runbook. После прочтения можно обосновать число воркеров, пороги алертов по диску и выбор между подстройкой таймаутов раннера и сменой региона.
Далее сводим память, диск и сеть в одну картину и переходим к параметризуемым таблицам.
Параллельные unit-тесты нагружают пики CPU и RAM; записи на диск концентрируются в индексах DerivedData и продуктах сборки. При тёплых кэшах часто упираетесь в всплески линковки и число процессов раньше, чем в сырые гигагерцы.Параллельные UI-тесты добавляют графику Simulator, WindowServer и временные файлы; ускорение перестаёт быть линейным, как только N-я полоса раздувает хвостовую задержку.
DerivedData растёт вместе с кэшированием модулей, параллельной компиляцией и частотой clean — отслеживайте размер каталога и каденс сборок как сигнал FinOps, а не только месячную аренду.Межрегиональные каналы не ослабляют требований к локальному диску, но усиливают хвост задержки для результатов и логов; разделяйте «xcodebuild успешен» и «шаг пайплайна успешен», иначе triage уйдёт не в тот слой.
Читайте вместе со статьёй про метки раннеров и конкурентность и чеклистом воспроизводимой сборки и DerivedData: маршрутизация джоб, фиксация корней сборки и ограничение Simulator — три разных рычага.
| Измерение | Mac mini M4 (база) | Mac mini M4 Pro (выше параллелизм) |
|---|---|---|
| Типичные цели | 2–4 воркера unit-тестов; UI-параллелизм ниже или по временным окнам | 4–8 воркеров unit-тестов; UI-параллелизм повышать только после soak |
| Сигналы по памяти | Своп, медленная загрузка Simulator, джанк UI под нагрузкой | Меньше вероятность свопа при той же конкурентности; дисковый I/O всё ещё может быть потолком |
| Ориентир по диску | 512 ГБ быстро забивается ветками; при параллели и мульти-ветке закладывайте 1 ТБ | Предпочтительно 2 ТБ или агрессивная очистка при параллельном UI и нескольких версиях Xcode |
| Профиль применения | Меньшие репозитории, упор на unit, ночной одиночный прогон | Крупные монорепозитории, много UI-паков, частые PR-сборки |
| Связка с арендой | Месячная база + короткий burst на релизную неделю | Месячная / квартальная фиксация, чтобы избежать пикового дефицита |
Для xcodebuild test с UI развяжите параллелизм компиляции и параллелизм тестов: для сборок можно поднять -parallelizeTargets, но -parallel-testing-enabled и -maximum-parallel-testing-workers требуют отдельного soak. Для коротких интерактивных сессий GUI сочетайте с гидом SSH vs VNC, вместо того чтобы держать высокий UI-параллелизм на WindowServer круглосуточно.
| Сценарий | Стратегия параллелизма | Доп. проверки на удалённом Mac |
|---|---|---|
| Чистые unit-тесты, короткие сьюты | Умеренное число воркеров, откалиброванное по пикам RAM | Следить за кривыми роста DerivedData |
| Тяжёлые UI-тесты | Низкая параллельность + очереди по окнам времени; при необходимости разнести схемы | Зафиксировать политику очистки Simulator и перезапуска WindowServer |
| Монорепозиторий, много веток | Изоляция метками раннера и отдельные корни DerivedData | Согласовать секреты и потолки конкурентности с чеклистом по раннерам |
| Глобальная команда, медленная выгрузка логов | Сохранять локальный параллелизм тестов; дросселировать агрегацию/загрузку | Подстроить таймауты и повторы HTTP/SSH; регион пересмотреть по мультирегиональному гиду по аренде |
| Ночная полная матрица + дневные PR | Высокий параллелизм ночью, днём защищать основную ветку | Глубокую очистку планировать вне пиков |
# Пример: ограничить число параллельных тестовых воркеров (настраивайте под проект/железо — не копируйте слепо) xcodebuild test \ -scheme YourScheme \ -destination 'platform=iOS Simulator,name=iPhone 16,OS=18.4' \ -parallel-testing-enabled YES \ -maximum-parallel-testing-workers 4 \ -resultBundlePath ./TestResults.xcresult
# Аудит следа DerivedData / Simulator (пороги в % диска задайте сами) du -sh ~/Library/Developer/Xcode/DerivedData 2>/dev/null du -sh ~/Library/Developer/CoreSimulator 2>/dev/null df -h /
Замечание: зафиксируйте базовый прогон в один воркер и текущую конкурентность рядом — суммарное время, P95 на тест, пик RAM и дисковые записи — прежде чем считать настройку завершённой.
-maximum-parallel-testing-workers; на каждом шаге требовать три подряд зелёных прогона.Эта статья отвечает на насколько жать параллельные тесты на одном удалённом Mac; мультирегиональный гид по узлам — куда поставить хост; чеклист zero-trust доступа — как до него доходит трафик. Порядок чтения: регион и срок → связность и раннеры → ёмкость параллельных тестов, чтобы не наращивать конкурентность на нестабильном пути.
Ноутбуки наследуют политики сна, потребительский сетевой стек и дрейф патчей — слабое соответствие командным SLA. Рост параллелизма усиливает тепловую и дисковую нагрузку на машину, не проектировавшуюся как CI-воркер. Выделенные удалённые Mac по договору отделяют исполнение от личных устройств и стабилизируют поверхность для автоматизации.
Когда нужны региональное размещение, управляемая аренда на пики и чистый хост под долгоживущих агентов вроде OpenClaw, параллельные тесты на облачных Mac-хостах MACCOME проще согласовать, чем на нестабильных ноутбуках. Начните с тарифов аренды, затем откройте региональное оформление для основных пользователей — Сингапур, Токио, Сеул, Гонконг, восток США или запад США. Triage подключений — в центре помощи по ключевым словам SSH или туннель.
Частые вопросы
Какой безопасный стартовый параллелизм на M4?
Проводите soak, а не копируйте «народную мудрость». Начните с двух воркеров, снимите выборки по RAM и диску, затем повышайте по таблицам выше. Сравните уровни аренды на странице тарифов аренды Mac mini.
DerivedData почти заполнен — с чего менять?
Сначала снизьте параллелизм, чтобы избежать тихих зависаний, затем выполните очистку; границы каталогов согласуйте с чеклистом воспроизводимой сборки и DerivedData.
CI красный, локально зелёный — куда смотреть?
Разделите таймауты загрузки/агрегации и сбои тестов; размещение узла проверьте мультирегиональным гидом по узлам.
Флаки взорвались — сразу масштабировать машины?
Сначала контрольные прогоны в один воркер и мониторы ресурсов, чтобы исключить конкуренцию, прежде чем покупать больше ядер или апгрейд M4 Pro / 2 ТБ.