Ключевые выводы
- Следите и за
df -h, и заdf -ih: нехватка inode маскируется под «загадочные» ошибки записи при ещё свободных гигабайтах. - Разделите срок хранения: горячие кеши сборки (часы), тёплые артефакты Xcode (дни), холодные логи (недели) — с явным владельцем для каждого дерева каталогов.
- Docker и похожие графы добавляют мелкие файлы overlay; обрезка образов должна сочетаться с проверкой inode на хосте, а не только размера тома.
- Подбирайте размер runner’а от SSD тарифа минус macOS, приложения и запас; держите ~15–20% свободными после недельного «худшего» роста.

df, политику ротации логов и карту кешей CI.1. Где прячутся байты и inode
Derived Data и SourcePackages доминируют в интерактивной и CI-сборке Xcode: инкрементальные сборки быстрые именно потому, что индексы остаются на диске. На общих runner’ах без эфемерного корня на job одна смена ветки может оставлять гигабайты на рабочее пространство. Кеши Swift Package Manager и CocoaPods добавляют ещё слой; дерево Pods известно огромным числом файлов даже при скромном суммарном размере.
Контейнеры дублируют слои и метаданные; bind mount’ы, подтягивающие node_modules или фикстуры тестов с хоста, умножают давление на inode базового тома APFS. Unified logging (log show, DiagnosticReports, заархивированный stdout из заданий launchd) растёт незаметно, пока не настроена ротация. Относитесь к каждой категории как к строке в простой таблице: ожидаемый пик в ГБ, доля inode и максимально допустимый возраст данных.
Экономика runner’ов и поведение очередей — в одной картине с диском; матрицу решений по параллельности и hosted vs выделенный Mac см. в материале на английском: Bitrise: облако iOS против собственного облачного Mac runner’а (2026). Параллельные lane’ы напрямую ускоряют смену кешей и рост диска.
Слои образов и кеш BuildKit на том же хосте лучше держать в одной политике с лимитами тарифа — см. Производственный Docker на облачном Mac Apple Silicon: образы arm64/amd64, bind mount и кеш сборки — руководство по устранению неполадок (с границами ресурсов тарифов).
2. Оповещения «как по квоте» до страниц «диск полон»
Алертите отдельно по проценту занятого места и по проценту занятых inode. APFS редко даёт классические «утёсины» фрагментации, но сервисы всё равно ведут себя нестабильно у заполненного тома: снимки, локальные копии Time Machine и временные каталоги CI конкурируют за последний запас. Добавьте оповещение по производной роста: если скользящий прирост за семь дней превышает запас хода на вашем тарифе — эскалируйте раньше.
Используйте тот же канал, что и для падений сборок: из-за диска тесты выглядят как флаки. Указывайте какую файловую систему трогает job — граф контейнера или хостовый /Users — чтобы при инциденте не чистить не тот слой.
# Быстрый снимок хоста (в составе health-check)
df -h /
df -ih /
du -sh ~/Library/Developer/Xcode/DerivedData 2>/dev/null
docker system df 2>/dev/null || true
3. Лестница поэтапной очистки
Уровень 0 — безопасно каждый час: усечь разросшиеся логи CI, удалить рабочие каталоги упавших job старше N часов, вытеснить записи кеша сборки контейнеров с явным TTL по возрасту.
Уровень 1 — ежедневно: удалить «висячие» образы Docker и остановленные контейнеры; очистить каталоги Derived Data по закрытым PR; ротировать unified logs по политике хранения.
Уровень 2 — еженедельно: после бэкапа секретов пересобрать холодные кеши из lockfile; при успешных проверках целостности уплотнить кеш SPM; проверить bind mount’ы на случайные копии .git или DerivedData на хосте.
Уровень 3 — аварийный: массовое удаление старых данных Xcode и глобальных кешей только в окне обслуживания и с проверкой воспроизводимости сборок. Фиксируйте, что удалили — аудиторы спросят.
Конвейеры подписи и нотаризации тоже копят артефакты; согласуйте политику кеша с Apple Silicon, облачный Mac: iOS/macOS CI — codesign, нотаризация, stapler и границы связки ключей: воспроизводимый конвейер и таблица типичных отказов, чтобы промежуточные export-бандлы не стали «тихими якорями» на диске.
4. Границы хранилища тарифов и запас
Публичные тарифы kvmboot ориентируются на 16 ГБ unified memory + 256 ГБ SSD и 24 ГБ + 512 ГБ (см. тарифы и характеристики). Сначала заложите macOS, Xcode, Docker Desktop или аналог, агенты мониторинга и две недели логов; остаток отдайте кешам CI и эфемерным томам runner’а. Если пиковые параллельные job’ы приходятся на релизные поезда, смоделируйте худшее перекрытие — два крупных архива iOS плюс один контейнеризованный backend могут одновременно забить и RAM, и временный диск до запуска очистки.
Держите порядка 15–20% свободными после такого сценария. Ниже ~10% начинаются загадочные таймауты у компиляторов, раннеров тестов и менеджеров пакетов — их дорого отлаживать под давлением инцидента.
5. Симптом — причина — действие
| Симптом | Вероятная причина | Предпочтительное действие |
|---|---|---|
«No space left on device», а df -h показывает свободные ГБ |
Исчерпание inode или квота на вложенном томе | df -ih; подчистить деревья с множеством мелких файлов (Pods, overlay, старые логи) |
| CI замедлился после нескольких зелёных сборок | Разрослись кеши; горячие точки метаданных APFS | Ограничить срок Derived Data; очистить кеш Docker builder; проверить bind mount’ы |
| Алерты только на одном runner’е | Дрейф хоста: ручные отладочные артефакты | Сравнить верхний уровень du; переобразовать образ или включить janitor-скрипт |
6. Заключение
Управление диском на облачных Mac runner’ах — не один cron, а модель ёмкости, связывающая кеши Xcode, контейнеры, логи и SSD тарифа с учётом inode. Пересматривайте модель при смене мажорной версии Xcode, включении новых параллельных job’ов или добавлении контейнерных sidecar — каждый сдвиг двигает и кривую байтов, и кривую числа файлов.
Почему на облачном Mac mini политика runner’а ложится на предсказуемый SSD
Unified memory на Apple Silicon смягчает одновременные компиляции и лёгкие агенты без такого агрессивного свопа, как на многих x86-ноутбуках. В macOS зрелый Unix-инструментарий — df, log, launchd и нативные пути Xcode — поэтому runbook по диску одинаково читается на железе и в облаке. Выделенный облачный Mac изолирует вашу кривую inode от шумных соседей по сравнению с перегруженными общими пулами, а простой M-серии держит низкое энергопотребление для круглосуточных задач «уборки». Gatekeeper и SIP снижают риск подмены со стороны случайных неподписанных хелперов, типичных для commodity Windows CI, а совокупная стоимость владения часто ниже, чем у разрозненных Mac mini, которые всё равно нужно стеллажировать, патчить и сопровождать.
Если нужны стабильные Apple Silicon runner’ы с понятными ступенями SSD для CI и удалённых сборок, облачный Mac mini M4 от kvmboot — практичная отправная точка — тарифы и цены, чтобы Derived Data, контейнеры и логи оставались в бюджете с алертами, а не в сюрпризе глубокой ночью.