На межрегиональном кластере Mac mini M4 в 2026 году инфраструктура как код упирается не в железо, а в удалённый state Pulumi в S3-совместимом бэкенде, в аренду блокировки (lease) и в согласование параллельного preview с единственным безопасным apply и build lock вокруг артефактов.

Почему lease на state не отменяет build lock

Lease сериализует операции CLI против одного стека и защищает запись JSON state, но не решает гонку двух job’ов за один каталог promote, общий Derived Data или пакетный fan-out после «золотой» сборки. Планировщик (например Nomad с аффинити и build lock) и ОС-лок остаются на месте; Pulumi добавляет ещё один контур конкуренции за сеть и за скачивание state между регионами.

  • Долгий preview: несколько воркеров тянут тяжёлый state и упираются в lease refresh; рост задержки маскируется как «медленный S3».
  • Два писателя вне state: провайдеры и скрипты пост-apply пишут в общий том — без flock или отдельной очереди получите повреждённые деревья.
  • Диск: plugin cache, временные копии state и логи CI на 1 ТБ быстрее выходят в жёлтую зону, чем ожидает команда; линия 2 ТБ даёт время на политику, а не на бездействие.

Матрица решений: backend state × параллельный CI

Топология State и lease CI: preview / apply
Один глобальный бакет + один стек Простой префикс s3://…/env/prod; lease по умолчанию, короткий TTL на быстрые итерации. Preview можно распараллелить по таргетам только после явного согласования графа; apply — строго один поток на стек.
Региональные копии / несколько стеков Раздельные ключи …/dc/us-east и …/dc/eu; не смешивайте workspace и stack в одном пути. Параллельный preview без шардирования повышает расход полосы и конфликты lease; нужен план merge и политика «кто apply».
Тяжёлый монорепо на пуле M4 Версионирование state и запрет «ручного» копирования JSON между ветками; бэкап только через поддерживаемые механизмы. Шард по каталогам/проектам или по --target; после золотого артефакта выравнивайте fan-out с матрицей rsync для кластера Mac mini M4.

Краткое правило приёмки: «много preview — только при разведённых срезах или стеках; один канонический apply; один писатель в promote-каталог».

Путь к файлу состояния (префикс бакета и изоляция стеков)

Зафиксируйте в runbook единый шаблон ключей: окружение, имя стека, workspace и при необходимости регион — без «временных» суффиксов ветки в прод-пути. Для S3-совместимых сервисов проверьте согласованность list-after-write и идемпотентность multipart: сюда же относится размещение sidecar-файлов lease рядом с .json state. На Mac mini M4 в CI экспортируйте переменные бэкенда из секрет-хранилища, а не из общего репозитория; локальный путь к кэшу провайдера держите вне канонического promote-каталога. Если параллельно гоняете Xcode и Pulumi на одних узлах, согласуйте дисковые бюджеты с руководством по Parallel Testing и томам 1 ТБ/2 ТБ.

TTL аренды блокировки (lease) и время жизни job

TTL должен перекрывать 95-й перцентиль длительности pulumi preview и up с учётом трансграничной задержки до объектного хранилища, но не быть настолько длинным, чтобы «зависший» runner блокировал очередь на часы. Практический диапазон для интерактивных пайплайнов — от нескольких минут до срока, согласованного с максимальным таймаутом CI; для ночных задач допускается отдельный профиль. Обязательно мониторьте события «lease lost» и повторные попытки: при всплеске параллельных preview сначала снижайте одновременность, а не только поднимайте TTL. DynamoDB-совместимая таблица блокировок и «чистый» S3-native режим по-разному ведут себя при clock skew — зафиксируйте NTP на всех Mac mini M4 в пуле.

Шардирование CI: как резать preview без разрушения графа

Разделяйте либо стеки (инфраструктура приложения / сеть / наблюдаемость), либо используйте согласованный список --target с заранее вычисленным множеством URN и запретом «тихих» зависимостей вне среза. Для монорепо удобны отдельные job’ы по каталогам с единым манифестом порядка merge; финальный apply-джоб сериализуйте через очередь или метку «golden», как в материале про Nomad и build lock. Документируйте, кто имеет право на pulumi cancel, чтобы не снимать lease с чужой критической секции без поста в канал инцидентов.

Водяные знаки диска: 1 ТБ и 2 ТБ на узлах с Pulumi

Заполнение тома Линия 1 ТБ Линия 2 ТБ
до ~70% Рутинная чистка DerivedData, симуляторов, кэша Pulumi plugin и старых артефактов preview; ротация логов CI. То же; запас больше, но политику не отменяет.
70–80% (жёлтая зона) В спринте закрепите апгрейд диска или вынос архивов; ограничьте новые «полные» preview и параллельные стеки на всех узлах. Жёлтая зона наступает позже — заранее снизьте одновременность burst-preview и число воркеров с тяжёлым state.
80–90% Сузьте параллелизм pulumi и bwlimit fan-out rsync; при необходимости остановите всё, кроме promote/apply, пока не отступит заполнение. На 2 ТБ снова наступит давление, если копятся версии симуляторов и плагинов; метки disk_class в планировщике помогают не забивать «тонкие» узлы.
>90% (красная зона) Жёсткий стоп до касания скрытого объёма APFS и снимков. Расширение кластера или диска — в приоритете. Пороги — триггеры масштабирования; закрепите их на дашборде SRE.
70%
Ориентир для автоматической уборки.
80%
Жёлтая зона: план расширения в работу.
90%
Красная зона: новый fan-out и тяжёлый batch — стоп.

Сравнить конфигурации и шаг диска без аккаунта можно на странице «Тарифы» — удобно заложить запас до жёлтой зоны.

Чек-лист приёмки: параллельный preview, merge и build lock

Закрепите пять шагов перед включением параллельного preview в основной ветке: (1) единый префикс state и запрет ручного копирования JSON между окружениями; (2) измеренный TTL lease и алерт на потерю блокировки; (3) матрица шардов CI с явным владельцем финального apply; (4) короткая критическая секция flock вокруг promote или согласование с rsync-матрицей артефактов; (5) водяные знаки диска 70/80/90% с автоматической чисткой plugin cache. После выкладки проведите учения: два одновременных preview и один apply — в логах не должно остаться «write conflict» на стороне бэкенда.

FAQ: Pulumi и параллельный Mac-кластер

Можно ли двум веткам делать apply в один стек? Только через явную очередь и согласованный merge в Git; иначе state и реальность разъедутся независимо от lease.

Preview «залипает» на lease: сначала проверьте сетевой путь до S3 и размер state, затем снизьте параллелизм; не повышайте TTL без анализа длительности операций.

2 ТБ, а жёлтая зона снова близко: узкое место в кэше провайдеров и симуляторах; разведите «тяжёлые» и «лёгкие» узлы и вынесите ночные preview на отдельный пул.

Инженерные ориентиры. Проценты заполнения зависят от провайдера и профиля IO; это цели проектирования, а не договорной SLA. Поведение lease зависит от выбранного S3-совместимого продукта и настроек бэкенда Pulumi — сверяйтесь с актуальной документацией поставщика.

Итог для закупки: заложите один «канонический» lane под сериализованный apply и promote, отдельные узлы под массовый preview и симуляторы, диск 2 ТБ там, где крутятся и Xcode, и тяжёлый provider cache. Публичные тарифы и справочный центр помогут согласовать ёмкость без входа в консоль; оформление — на странице покупки. Связанные материалы по кластеру: Nomad и build lock, Xcode Parallel Testing и диск.

Параллельные Mac-ресурсы

Pulumi, state в S3 и однотипные Mac mini M4

Без входа в аккаунт сравните тарифы на странице тарифов, загляните в справочный центр и оформите узлы: выровняйте пул под preview/apply, согласуйте класс диска 1 ТБ или 2 ТБ и расширяйтесь до жёлтой зоны с запасом под plugin cache.

Купить узлы кластера Справочный центр