2026-04-16 Очистка диска iOS CI: рантаймы симулятора, архивы и launchd-janitor на арендованном облачном Mac
Арендованные Mac mini M4 в Гонконге, Токио, Сеуле, Сингапуре и востоке США кажутся бесконечными, пока df -h не покажет меньше 12 % свободно на томе данных — тогда каждый xcodebuild test становится лотереей. Этот материал от 2026-04-16 объясняет, почему диск растёт даже при изолированных кэшах компиляции, показывает крупные каталоги, даёт готовые команды simctl, задаёт политику хранения архивов, шаблон launchd и ссылается на изоляцию DerivedData на задачу (2026-04-15) и безголовое тестирование симулятора для цельной гигиены.
Почему диск облачного Mac заполняется, если «мы уже чистим DerivedData»
Пер-задачный DERIVED_DATA_PATH снимает гонки компиляции, но не глобальных потребителей: каждый установленный для Xcode 16.x iOS-рантайм всё ещё лежит в /Library/Developer/CoreSimulator; UI-тест может добавить 300–900 МБ данных устройства; каждый архив дублирует dSYM и bitcode-срезы. Команды, крутящие три минорные версии Xcode на одном хосте без удаления старых рантаймов, часто теряют 80–140 ГБ, не заметив. Сопоставляйте телеметрию диска с глубиной очереди и масштабируйте через цены только после того, как janitors перестают помогать.
- Устаревшие загруженные симуляторы держат монты CoreSimulator и мешают удалению.
- Старые watchOS/tvOS-рантаймы остаются, если собирается только iOS.
- Архивы копятся на общих SSH-хостах без владельца политики хранения.
- Пакеты xcresult, перенесённые в
/tmp, на части образов переживают перезагрузку — чистите явно.
Карта следов: где прячутся гигабайты
| Путь / зона | Типичный диапазон | Можно автоматизировать? |
|---|---|---|
~/Library/Developer/Xcode/Archives |
15–120 ГБ суммарно | Да, с политикой по возрасту и предварительной загрузкой в объектное хранилище |
~/Library/Developer/CoreSimulator/Devices |
8–60 ГБ | Частично — delete unavailable + подрезка медиакэша |
/Library/Developer/CoreSimulator/Volumes (рантаймы) |
25–90 ГБ несколько версий | Осторожно — согласовать с матрицей SDK |
~/Library/Developer/Xcode/iOS DeviceSupport |
5–25 ГБ | Да для версий старше 180 дней, если политика позволяет |
/Users и /Volumes/builds свободно < 50 ГБ; жёстко останавливать новые задачи при < 25 ГБ, чтобы избежать сбоев записи ядра посреди архива.
Команды simctl, которые реально запускают операторы
Запускайте только когда очередь CI показывает ноль активных задач симулятора или после опустошения раннеров меткой обслуживания.
xcrun simctl shutdown all
xcrun simctl delete unavailable
xcrun simctl erase all # только на одноразовых preview-хостах — никогда на общих prod-подобных без одобрения
Еженедельно сохраняйте вывод xcrun simctl list runtimes в репозиторий конфигурации, чтобы узлы в Токио и Сингапуре совпадали.
Архивы: арифметика хранения, понятная финансам
Считайте .xcarchive регулируемыми артефактами: загрузка в объектное хранилище, локально 14 или 30 дней по политике отката, затем удаление. Если комплаенс требует 90 дней локально — покупайте запас диска явно; zip редко даёт > 35 % на уже сжатых срезах.
| Хранение | Примерный месячный рост (одно приложение, еженедельный архив) | Смягчение |
|---|---|---|
| 7 дней локально | 12–20 ГБ | Ночной tar + загрузка + удаление |
| 30 дней локально | 45–70 ГБ | Многоуровневое хранилище + проверка контрольных сумм |
| ∞ «на всякий случай» | Без ограничений | Запрещено на общих арендованных Mac |
Задачи janitor с launchd (без ClickOps)
Оборачивайте обслуживание в неинтерактивный скрипт пользователя CI; лог в ~/Library/Logs/ci-janitor.log; ненулевой выход, если шаг удаляет > 15 ГБ за раз для следа в Slack. План: воскресенье 03:00 локально по региону — воскресное утро в Гонконге всё ещё субботний вечер в Калифорнии, разносите окна.
~/Library/Developer/Xcode/UserData — там сниппеты и точки останова; начнётся бунт и вернутся тикеты «загадочные красные сборки».
Сочетание со стратегией DerivedData и тестов
После глобальной очистки каждый пайплайн по-прежнему задаёт DERIVED_DATA_PATH на задачу, как в статье 2026-04-15. Для тяжёлых UI-сьютов перечитайте безголовые тесты, чтобы ограничить параллельные destination и не бороться с активными SimulatorTrampoline.
Контрольные точки после агрессивной очистки
Первая задача после janitor может потратить +4…+11 минут на повторную загрузку символов или DeviceSupport. Следите за p95 времени сборки 48 часов; скачок > 22 % — политика слишком жёсткая, восстановитесь из бэкапа или расширьте хранение.
FAQ: гигиена диска на арендованных Apple Silicon
| Вопрос | Краткий ответ |
|---|---|
| Симлинк Archives на NFS? | Только при низкой задержке; иначе загрузка и удаление локально. |
| Сжимает ли Apple Silicon данные CoreSimulator? | Клоны APFS помогают некоторым шаблонам — не полагайтесь в планировании ёмкости. |
| Кто владеет скриптом janitor? | Платформенная команда + дежурства, задокументировать в справке. |
Регионы, NVMe и когда добавить ещё один Mac
Давление на диск часто означает слишком много нагрузки на один хост. Если janitor еженедельно возвращает > 40 ГБ, а свободно всё ещё около 20 %, разделите команды между JP и SG или добавьте второй узел US East — задержка до Git и ASC важна не меньше байтов. Сравните уровни bare metal в ценообразовании; держите индекс блога для подписи, нотаризации и ранбуков OpenClaw.
Итог: глобальная гигиена симулятора и архивов на общих арендованных Mac не опциональна — это разница между предсказуемыми ночными сборками и «красным, пока кто-то не зайдёт по SSH». Автоматизируйте, измеряйте, сочетайте с дисциплиной DerivedData на задачу.
Арендуйте M4-сборщики с запасом диска
HK · JP · KR · SG · US · SSH / VNC