Почему 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. | |
Сравнить конфигурации и шаг диска без аккаунта можно на странице «Тарифы» — удобно заложить запас до жёлтой зоны.
Чек-лист приёмки: параллельный 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 на отдельный пул.
Итог для закупки: заложите один «канонический» lane под сериализованный apply и promote, отдельные узлы под массовый preview и симуляторы, диск 2 ТБ там, где крутятся и Xcode, и тяжёлый provider cache. Публичные тарифы и справочный центр помогут согласовать ёмкость без входа в консоль; оформление — на странице покупки. Связанные материалы по кластеру: Nomad и build lock, Xcode Parallel Testing и диск.
Pulumi, state в S3 и однотипные Mac mini M4
Без входа в аккаунт сравните тарифы на странице тарифов, загляните в справочный центр и оформите узлы: выровняйте пул под preview/apply, согласуйте класс диска 1 ТБ или 2 ТБ и расширяйтесь до жёлтой зоны с запасом под plugin cache.