Состояние деплоя (.dwe/deploy/state.yml)
Идемпотентное отслеживание состояния деплоя и таблица решений о пропуске шагов.
Страницы
Заголовок раздела «Страницы»- Схема — справочник полей верхнего уровня, проекта, сервиса, фазы, шага и pending-операций
- Хеширование и решения о пропуске —
action_hash,config_hash, правила инвалидации, таблица решений о пропуске - Управление — флаги команд,
dwe deploy state show/clear/repair, значения по умолчанию в неинтерактивном режиме, примеры
Назначение
Заголовок раздела «Назначение»Файл состояния деплоя (.dwe/deploy/state.yml) превращает пайплайн деплоя из «запустил и забыл» в идемпотентный и наблюдаемый процесс.
Примечание — файл состояния есть только у пайплайнов деплоя. Команды
type: daemonне имеют дискового реестра: единственный источник истины о запущенных демонах — этоdocker ps(с фильтрацией по стандартным меткамdwe.project/dwe.daemon.id/dwe.daemon.params). Здесь нет журнала, который мог бы расходиться с реальностью, блокироваться или инвалидироваться;docker stop, выполненный вне DWE, отражается сразу же при следующем чтенииdwe status daemons.
Каждый шаг, выполненный во время dwe deploy run, записывается: его статус (ok, failed, skipped), время завершения, его action_hash (отпечаток тела шага) и продолжительность выполнения.
При следующем dwe deploy run action_hash каждого шага сравнивается с записанным хешем. Шаги, успешно завершённые с совпадающими хешами, пропускаются (если только у них нет действия check:, которое всегда выполняется для повторной проверки идемпотентности). Шаги, у которых хеш изменился или которые ранее завершились с ошибкой, запускаются повторно.
Этот механизм гарантирует, что:
- Деплой неизменного кода выполняется быстро (неизменные шаги пропускаются)
- Редактирование тела шага автоматически перезапускает его
- Редактирование конфигурационных файлов сервиса (
workspace/services/<name>/service.yml,workspace/services/<name>/deploy.yml) или конфигурации деплоя проекта (workspace/deploy.yml) инвалидирует затронутую область и перезапускает соответствующие шаги - Журнал переживает сбои в середине деплоя, позволяя использовать
--resumeпри следующем запуске
Расположение файла
Заголовок раздела «Расположение файла».dwe/deploy/state.yml — автоматически создаётся в директории .dwe/deploy/ корня проекта. Не добавляется в систему контроля версий (добавьте .dwe/ в .gitignore).
Взаимодействие с
snapshot restore—deploy-state.ymlвсегда перезаписывается из снапшота при восстановлении. Слияние не выполняется (в отличие отworkspace/local.yml, который учитываетlocal_yml.preserve_keys). Осиротевшие записи для сервисов, которые больше не существуют локально, безопасны — пайплайн деплоя игнорирует их при следующем запуске. Если вам нужно сохранять зависящее от машины состояние деплоя между снапшотами, используйтеlocal_yml.preserve_keysдля значений, которые управляют этим состоянием, а не пытайтесь сохранить сам журнал.
Когда использовать
Заголовок раздела «Когда использовать»Этот файл не пишется вручную. Он создаётся и поддерживается командой dwe deploy run. Просматривайте его с помощью:
dwe deploy state showОчистите его (например, чтобы заставить все шаги выполниться заново) с помощью:
dwe deploy state clearВосстановите повреждённые агрегаты статусов (редко; устаревшие блокировки или непредвиденные сбои) с помощью:
dwe deploy state repairСм. Управление для полного справочника команд и флагов.
Файл блокировки
Заголовок раздела «Файл блокировки»Пока выполняется dwe deploy, удерживается файловая блокировка по пути .dwe/deploy/deploy.lock. Это предотвращает параллельные деплои одного и того же проекта.
Захват блокировки:
- Использует
flock(LOCK_EX|LOCK_NB)для получения эксклюзивной неблокирующей блокировки - Если блокировка удерживается другим процессом, читает PID из файла блокировки и вызывает
syscall.Kill(pid, 0), чтобы проверить, жив ли этот процесс - Если процесс отсутствует (
ESRCH), блокировка считается устаревшей: файл блокировки усекается и блокировка захватывается - Если блокировка удерживается работающим процессом, возвращается ошибка с указанием удерживающего PID
Освобождение блокировки:
- Автоматически освобождается при завершении
dwe deploy - При
Ctrl+Cили других сигналах блокировка освобождается, а файл состояния остаётся в согласованном состоянии (записан последний успешно завершённый шаг)
Устаревшие блокировки:
- Если деплой убит через
kill -9или процесс упал, файл блокировки остаётся - Следующий
dwe deploy runобнаруживает устаревшую блокировку, удаляет её и продолжает работу - Это позволяет восстанавливаться после непредвиденных завершений
Связанные команды
Заголовок раздела «Связанные команды»dwe deploy plan— предварительный просмотр пайплайна перед деплоемdwe deploy run— выполнить деплой (с отслеживанием состояния)dwe deploy state show— просмотр файла состоянияdwe deploy state clear— сброс состоянияdwe deploy state repair— пересборка агрегатов статусовdwe reset run— сброс и очистка состояния деплояdwe services enable/disable— переключение сервисов (записываетpending, если не используется--apply)- См. также deploy.yml — как объявлять шаги и фазы
- См. также lifecycle.yml — как
dwe runконтролирует необходимость деплоя сервисов