Перейти к содержимому

Состояние деплоя (.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 restoredeploy-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 контролирует необходимость деплоя сервисов