lifecycle.yml
Декларации пайплайнов run / stop, управляющие dwe run, dwe stop и dwe restart.
Содержание
Заголовок раздела «Содержание»- Назначение
- Форма пайплайна
- Структура
- Проба самообновления
run.show_info/run.final_messagestop.final_messagelog(логирование в файл)- Hook-фазы
- Минимальный пример
- Валидация
- Параллельные группы шагов
- Частые ловушки
- Связанные команды
Назначение
Заголовок раздела «Назначение»workspace/lifecycle.yml декларирует два пайплайна:
run:— выполняется командойdwe run(иdwe restartпосле stop). Оборачивает стандартную последовательностьdocker up+docker waitопциональными pre/post hook-фазами. Проба самообновления настраивается отдельно в верхнеуровневом блокеupdate:, а не здесь.stop:— выполняется командойdwe stop(и первой половинойdwe restart). Оборачиваетdocker downопциональными pre/post hook-фазами.
Файл загружается отдельно и не участвует в трёхслойном мердже.
Файл опционален для всех команд, которые его используют.
Если lifecycle.yml отсутствует или отсутствует секция, DWE подставляет встроенный пайплайн по умолчанию и печатает одну info-строку в stderr: Using built-in default <run|stop> pipeline (override with workspace/lifecycle.yml). Info-строка подавляется в режиме --output json.
Дефолтный пайплайн run: (срабатывает, когда lifecycle.yml отсутствует или не имеет секции run:):
| Поле | Значение |
|---|---|
show_info | true |
final_message | Project is ready for work! |
| Фазы | Одна фаза start: один шаг type: dwe с cmd: "docker up --wait" |
Дефолтный пайплайн stop: (срабатывает, когда lifecycle.yml отсутствует или не имеет секции stop:):
| Поле | Значение |
|---|---|
final_message | Project is stopped. Have a nice day! |
| Фазы | Auto-reap фаза (см. ниже) + одна фаза stop: один шаг type: dwe с cmd: "docker down" |
Всякий раз, когда запускается пайплайн stop: (дефолтный или пользовательский), автоматически прижимается фаза _auto_reap_daemons; opt-out нет, и она видна в plan output для прозрачности. Она останавливает все фоновые демоны, запущенные через команды type: daemon.
dwe docker up и dwe docker down — тонкие проводники к Docker Compose и никогда не используют этот пайплайн; сырые docker compose stop / restart остаются доступны через dwe docker stop / dwe docker restart.
Форма пайплайна
Заголовок раздела «Форма пайплайна»flowchart LR
subgraph run["dwe run"]
direction LR
U[update probe] --> PRE[pre hooks] --> UP[docker up] --> WAIT[docker wait] --> POST[post hooks] --> INFO[info] --> MSG1[final_message]
end
subgraph stop["dwe stop"]
direction LR
SPRE[pre hooks] --> DOWN[docker down] --> SPOST[post hooks] --> MSG2[final_message]
end
subgraph restart["dwe restart"]
direction LR
R1[stop pipeline] --> R2[run pipeline<br/>--no-update]
end
docker up выполняется как единственный шаг type: dwe с cmd: "docker up --wait" внутри фазы start; флаг --wait выполняет ожидание health встроенно (без отдельного шага docker_wait_healthy). В нём нет магии — исполнитель пайплайна вызывает его как любой другой шаг, поэтому он подхватывает политику из docker.yml.
Структура
Заголовок раздела «Структура»run: show_info: true final_message: "Project is ready for work!" log: false # tee status + child stdout/stderr to .dwe/logs/run.log phases: - name: <phase> description: <text> when: # optional: typed condition (see deploy/conditions.md) type: builtin|shell|template cmd: <string> expr: <string> steps: - name: <step> type: shell|dwe|command|builtin cmd: <value> with: # optional: parameters key: value
stop: final_message: "Project is stopped. Have a nice day!" log: false # tee status + child stdout/stderr to .dwe/logs/stop.log phases: - name: <phase> description: <text> when: # optional: typed condition type: builtin|shell|template cmd: <string> expr: <string> steps: - name: <step> type: shell|dwe|command|builtin cmd: <value> with: # optional: parameters key: valueФазы и шаги используют ту же форму, что deploy.yml: name, description, when, untracked, steps[], плюс per-step type / cmd / with, when, check, files_gate, continue_on_error. См. справочник deploy для полной грамматики шага, включая files_gate: (предусловие для файлов).
deploy_services: true не разрешено в lifecycle-пайплайнах.
Проба самообновления
Заголовок раздела «Проба самообновления»Опциональная проба самообновления запускается до любой фазы. Она может фетчить из upstream-ремоута, детектить drift и (с согласия) пуллить --ff-only. Успешный pull триггерит in-process перезагрузку DweConfig, LifecycleConfig и реестра команд до выполнения фаз.
Проба управляется формализованным верхнеуровневым блоком update: в workspace.yml / local.yml (mode: on | off), который участвует в трёхслойном мердже. Включение обновления — это однострочник, который не обнуляет run.phases.
Приоритет в runtime при dwe run: флаг --no-update > флаг --update <mode> > update.mode из смердженной конфигурации. Полное описание поведения — в справочнике блока update: и интеграции с git → проба обновления.
run.show_info / run.final_message
Заголовок раздела «run.show_info / run.final_message»| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
show_info | bool | false | Дописать рендер dwe info после последней фазы. |
final_message | string | Project is ready for work! | Сообщение об успехе, печатаемое в самом конце. |
Гейт деплоя required-сервисов
Заголовок раздела «Гейт деплоя required-сервисов»dwe run автоматически гейтит на том, чтобы required-сервисы были задеплоены. До старта пайплайна run команда проверяет, что все tracked-сервисы (те, что появляются в разрешённом плане деплоя) имеют status: deployed в state-файле.
Если какой-то tracked-сервис ещё не задеплоен, dwe run выходит с ошибкой: “run dwe deploy run first”. Это предотвращает запуск против частично инициализированного окружения — обход гейта просто отдал бы docker compose up сервис, чьи тома/конфиги/база данных никогда не провижились, и run упал бы почти сразу с несвязанной ошибкой. Всегда сначала деплойте.
Подробности см. в state/index.md.
stop.final_message
Заголовок раздела «stop.final_message»| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
final_message | string | Project is stopped. Have a nice day! | Сообщение об успехе, печатаемое в самом конце. |
log (логирование в файл)
Заголовок раздела «log (логирование в файл)»Верхнеуровневое поле и на run:, и на stop:. По умолчанию false для lifecycle-пайплайнов (в отличие от deploy.yml, где дефолт — true).
Когда включено, статус-сообщения DWE и stdout/stderr дочерних процессов теются в .dwe/logs/<name>.log (с убранными ANSI-кодами) — .dwe/logs/run.log для run, .dwe/logs/stop.log для stop.
run: log: true # tee to .dwe/logs/run.logHook-фазы
Заголовок раздела «Hook-фазы»Hook-фазы — это конвенциональные имена (pre / post), используемые для оборачивания стандартной работы start/stop. Добавляйте continue_on_error: true на каждый шаг, чтобы упавший хук не прерывал основной lifecycle:
run: phases: - name: pre description: Before-run hooks (continue on failure) steps: - name: before-run type: command cmd: project.before-run continue_on_error: true
- name: start description: Start containers and wait for health steps: - name: up type: dwe cmd: "docker up" - name: wait type: builtin cmd: docker_wait_healthy
- name: post description: After-run hooks (continue on failure) steps: - name: after-run type: command cmd: project.after-run continue_on_error: truecontinue_on_error: true приводит к тому, что падение фиксируется через FailStep (красный ✗), но выполнение переходит к следующему шагу, а пост-шаговый check не вычисляется.
Минимальный пример
Заголовок раздела «Минимальный пример»run: show_info: true final_message: "Project is ready for work!" phases: - name: start description: Start containers and wait for health steps: - name: up type: dwe cmd: "docker up" - name: wait type: builtin cmd: docker_wait_healthy
stop: final_message: "Project is stopped. Have a nice day!" phases: - name: stop description: Stop and remove containers steps: - name: down type: dwe cmd: "docker down"Валидация
Заголовок раздела «Валидация»При загрузке файла проверяется:
- Каждый шаг в
run.phasesиstop.phasesимеет полеtype:с одним изshell,dwe,command,builtin. - Блок
run.updateотвергается — проба самообновления настраивается в верхнеуровневом блокеupdate:. Строгий декодерlifecycle.ymlжёстко падает на неизвестном ключеupdateподrun:. deploy_services: trueотвергается (валидно только вdeploy.yml).final_messageиlogнормализуются в значения по умолчанию при отсутствии.
Параллельные группы шагов
Заголовок раздела «Параллельные группы шагов»Lifecycle-фазы используют тот же контейнер step-group parallel:, что и deploy.yml. Шаг может объявить parallel: { max_concurrent, fail_fast, steps } вместо листового тела, и внутренние под-шаги запускаются параллельно с той же семантикой отмены, журнала и репортёра. Схему, дефолты, правила валидации и модель выполнения см. в deploy → Параллельные группы шагов.
Частые ловушки
Заголовок раздела «Частые ловушки»- Забыть
continue_on_error: trueна hook-шагах — без него упавший pre-stop хук прерывает всю последовательность stop, и контейнеры не останавливаются. - Размещение
update:подrun:— проба самообновления настраивается в верхнеуровневом блокеupdate:вworkspace.yml/local.yml, а не вlifecycle.yml. Блокrun.updateотвергается при загрузке. - Добавление фаз
deploy_services— они только для деплоя. Lifecycle-пайплайны вызывают сервисы через ссылкиtype: command. - Редактирование
lifecycle.ymlдля использования прямых вызововdocker compose— публичный API — этоtype: dweсcmd: "docker up". Прямые вызовыdocker composeобходят политику изdocker.yml.
Связанные команды
Заголовок раздела «Связанные команды»dwe run— выполнить пайплайн run (с опциональным update-пробом)dwe run --no-update— пропустить update-пробdwe run --update <mode>— переопределить настроенный режимdwe stop— выполнить пайплайн stopdwe restart—stop, затемrun --no-updatedwe docker up/dwe docker down— сырая прокидка к Docker Compose (не использует этот пайплайн)