Типы конфликтов на общей сборочной машине
Конфликт рабочего дерева. Две job или человек и CI пишут в один checkout: гонки при git pull, полусобранные артефакты и «плавающие» падения тестов.
Конфликт общего кэша. CocoaPods, npm, Gradle или Xcode DerivedData без домена блокировок: параллельная установка пакетов портит индекс или кэш.
Конфликт GUI и CI. Один Simulator, диалог подписи или оконная сессия Xcode, пока пайплайн ожидает монополию на тот же ресурс.
Конфликт «тихой очереди». Оркестратор принимает десятки pending без потолка: разработчики в разных поясах видят только таймауты, а не перегруз пула.
Конфликт межчасовых ожиданий. «Ночной» архив в одном поясе пересекается с утренним интерактивом в другом, если окна не опубликованы в локальном времени и не привязаны к меткам runner.
Решение начинается с классификации: что должно быть серийным, что изолируется каталогом, что требует seat lock. Политику SSH/VNC и прав согласуйте с отдельными материалами раздела блога — см. также призыв в конце страницы.
Таблица рекомендаций: блокировка места и окно бронирования
Используйте таблицу как стартовые значения для внутреннего runbook; калибруйте по медиане и p95 времени ожидания в очереди и по фактическим разрывам связи.
| Параметр | Стартовое значение | Заметки |
|---|---|---|
| Длительность окна бронирования (интерактив) | 30–120 мин + явное продление | Снижает «забытые» резервы после закрытия ноутбука |
| TTL seat lock без heartbeat | 15–30 мин | Интерактив; для CI-секций — короче, см. flock FAQ |
| Макс. глубина очереди (pending) | ~20 глобально или по полосе | Отказ с текстом «пул перегружен», не молчаливое ожидание |
| Алерт: медиана ожидания в очереди | > 15 мин устойчиво в пересечении поясов | Сигнал к второму узлу или разделению полос |
| Публикация расписания | локальное время каждой подкоманды | Плюс UTC и ссылка на метки runner в CI |
Согласование с параллельными git fetch и pull
Один источник мутаций на дерево. Если две задачи делают pull в один путь, порядок и состояние HEAD становятся недетерминированными. Выделяйте каталог на job, используйте worktree или эфемерные клоны в пайплайне.
Fetch и I/O. Несколько одновременных git fetch с тяжёлыми pack-файлами нагружают диск и задерживают компиляцию. Практичный потолок — 2–4 параллельных fetch на узел класса Mac mini, пока метрики диска и CPU в норме.
Lock-файлы зависимостей. package-lock.json, Gemfile.lock и аналоги должны согласовываться с политикой веток; параллельные обновления lock в одной рабочей копии — отдельный класс инцидентов. Для разнесения по деревьям ориентируйтесь на матрицу worktree и lock-файлы.
Общий кэш и Git. Кэш объектов на уровне хоста допустим только при ясных правилах очистки и без записи двумя job в один временный каталог клонирования.
Пороги диска и верхняя граница конкурентности
Конкурентность. Базово — одна тяжёлая сборка, затрагивающая общий DerivedData или GUI, одновременно. Вторая job — только «лёгкая» (линт, быстрые юниты) при CPU стабильно примерно ниже 75% и свободной RAM не менее примерно 8–16 ГБ после macOS и оконного сервера, если вы действительно изолировали пути.
Диск. Квота артефактов и DerivedData по проекту порядка 30–80 ГБ с проактивной очисткой при заполнении около 80% квоты. Алерт при свободном месте ниже примерно 15% или 40 ГБ (что больше) — до того, как сборки начнут падать из-за нехватки тома.
Связь с очередью. Если диск приближается к порогу, увеличение параллелизма ухудшает ситуацию быстрее, чем добавление CPU; временно сужайте полосы и ускоряйте ротацию логов. Практические команды и таймауты блокировок — в FAQ очереди и flock.
FAQ: разрыв связи и стратегия уведомлений
Что ломается при обрыве VPN или SSH? Интерактивная сессия может оставить seat lock, а CI — зависший flock. Без TTL очередь «замораживается» до ручного вмешательства в другом поясе.
Минимальный набор уведомлений (в духе SLA). Сообщение в канал команды при: принудительном снятии резерва, превышении медианы ожидания очереди, падении свободного диска ниже порога, повторяющихся таймаутах ожидания замка. Указывайте id узла, владельца резерва или job и ссылку на runbook.
Break-glass. Убедиться, что процесс не держит ресурс → отменить задачу в оркестраторе → снять lock только после проверки → при необходимости кратко дренировать очередь и уведомить следующий пояс. Параметры keepalive и переподключения согласуйте с FAQ стабильности и SLA, чтобы сетевые флаки не маскировались под contention замков.
Чеклист параметров обхода конфликтов (копирование в runbook)
- Именование резерва: в каждой записи — владелец, часовой пояс, ожидаемое окончание, метка runner или имя узла.
- Очередь: потолок pending опубликован в документации и в тексте ошибки CI; отдельные полосы для релиза и PR.
- Замки: один lock-файл на домен ресурса (кэш Pod/npm, Simulator UI, общий DerivedData); критическая секция минимальна по времени.
- Git: нет двух мутаций в одно дерево; лимит параллельных fetch зафиксирован и измеряется.
- Диск и RAM: квоты на проект, алерты по свободному месту и свопу; еженедельная очистка временных каталогов.
- Разрыв и SLA: TTL для seat lock, канал уведомлений при снятии резерва и при медиане очереди выше порога; break-glass без удаления lock «вслепую».
Если пункты выполняются, а конфликты повторяются, трактуйте это как сигнал недостатка узлов или необходимости разделить интерактив и CI, а не как повод бесконечно удлинять окна бронирования.
Итог
Межчасовая коллаборация на одном Mac выигрывает у явных окон, коротких резервов с продлением, потолка очереди и изолированных рабочих деревьев. Seat lock и flock должны защищать конкретные домены состояния, а не «весь хост на весь день».
Чтобы перенести эти правила на выделенный узел с предсказуемой ёмкостью, откройте главную Meshmac, оформите план на странице покупки (без входа) и при необходимости загляните в центр помощи по SSH, VNC и доступу. Остальные материалы по общим Mac и OpenClaw — в разделе блога.
Арендуйте удалённый Mac под очереди и межчасовые команды
После фиксации параметров бронирования и очереди подберите ёмкость так, чтобы медиана ожидания оставалась ниже внутреннего порога. Тарифы — на главной; оформление без входа — покупка. Справка: помощь, коллаборация и SSH/VNC — в блоге (в т.ч. FAQ SSH/VNC).