auto-sync: 2026-06-03 09:40:01
This commit is contained in:
@@ -54,7 +54,11 @@ Dev **запаниковал** на старте orch1b: «параллельн
|
||||
### ⏭️ ТОЧКА ВХОДА (06:20 UTC)
|
||||
- **ORCH-7 закрыт. ORCH-4 ЗАМЕРЖЕН** (PR #5 `2f0fd246`, прод пересобран, health/queue ok, 136 passed). Баг выбора агента починен.
|
||||
- **ORCH-5 (M-7 dedup webhook) ЗАМЕРЖЕН** (PR #6 `2fdc6856`, прод пересобран, health/queue ok, 145 passed, миграция на живой БД ок). **ЭТО БЫЛА ПОСЛЕДНЯЯ ЗАДАЧА ПО САМОМУ orchestrator.**
|
||||
- **ОСТАЛОСЬ только: ORCH-3+M-5** (репо **enduro-trails**, НЕ orchestrator): rollback в deploy-хук (`/home/slin/bin/enduro-deploy-hook.sh`) + чистка `deployer.md` (убрать `git checkout $LAST_TAG` + `Bash(docker)`) + M-5 хардкод инфры в промптах. Перед запуском — ОК Славы + верификация по живому коду (⚠️ хук трогать — осторожно, это прод-деплой, сохранить/мержить).
|
||||
- 🔄 **ORCH-3 (S-3) + M-5 ЗАПУЩЕН** (taskName `orch3_deploy_rollback`, ветка feature/ORCH-3-deploy-rollback в репо **enduro-trails**, ТЗ `DEV_TASK_ORCH3_DEPLOY_ROLLBACK.md`). Разведка по живому коду:
|
||||
- 🔴 **S-3 баг:** `deployer.md` стр.103 `git checkout $LAST_TAG` в shared-репо `/home/slin/repos/enduro-trails` → detached HEAD загаживает рабочую копию, хук делает `git pull origin main` → следующий деплой ломается. И откат фиктивный — прод крутит старый образ, git checkout локального файла прод не меняет.
|
||||
- Хук `enduro-deploy-hook.sh` (876b, pull+restart+gps-collector) — rollback'а НЕТ. План: rollback В ХУК (prev-image перед рестартом + флаг `--rollback`), в deployer.md → `ssh ... bash $HOOK --rollback`.
|
||||
- 🟡 **M-5:** architect.md:16 (82.22.50.71), tester.md:27,38,39 (/home/slin/ пути) → env с дефолтами (deployer.md уже параметризован — образец).
|
||||
- ⚠️ ПРОД-ДЕПЛОЙ: Dev НЕ деплоит на прод, бэкап хука перед правкой, проверка = bash -n. Мерж и прод-применение хука — я со Славой.
|
||||
- Бэклог orchestrator ЗАКРЫТ: ORCH-1/1b/2/4/6/7 + ORCH-5 в main. ORCH-8 отменена. Мелочь M-6/L-1/L-2 — по настроению.
|
||||
- Мерж-рецепт (работает): проверить `git log origin/main..origin/ветка` (не пусто!), мой прогон тестов, clean-merge check, мерж через Gitea API `/pulls/N/merge` `{"Do":"merge"}`, пересборка из main.
|
||||
- ТЗ-образцы: `DEV_TASK_ORCH7_HARDENING.md`, `DEV_TASK_ORCH4_STAGE_ENGINE.md`.
|
||||
|
||||
82
tasks/orchestrator/DEV_TASK_ORCH3_DEPLOY_ROLLBACK.md
Normal file
82
tasks/orchestrator/DEV_TASK_ORCH3_DEPLOY_ROLLBACK.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# DEV TASK — ORCH-3 (S-3) + M-5: безопасный rollback деплоя + чистка хардкода инфры
|
||||
|
||||
**Проект:** enduro-trails (НЕ orchestrator!) | **Сервер:** slin@82.22.50.71 | **Репо:** /home/slin/repos/enduro-trails | **Хук на хосте:** /home/slin/bin/enduro-deploy-hook.sh
|
||||
**Ветка:** `feature/ORCH-3-deploy-rollback` из свежего main репо enduro-trails.
|
||||
|
||||
⚠️ **ЭТО ПРОД-ДЕПЛОЙ. Хук трогать ОСТОРОЖНО** — сохранить существующее поведение (pull + restart + gps-collector), только ДОБАВИТЬ rollback. НЕ переписывать файл целиком одной строкой — мержить.
|
||||
|
||||
⚠️ **ГРАБЛЯ push (ORCH-7, НЕ повтори):** после push `git log origin/main..origin/feature/ORCH-3-deploy-rollback` ДОЛЖЕН показать твои коммиты. НЕ отчитывайся «PR готов» пока remote реально не содержит коммитов.
|
||||
|
||||
## Проблема (верифицировано по живому коду)
|
||||
|
||||
### S-3 — опасный rollback в промпте деплойера
|
||||
`.openclaw/agents/deployer.md` стр.100-107, блок «Rollback (если smoke fail)»:
|
||||
```bash
|
||||
git checkout $LAST_TAG
|
||||
echo "ROLLED BACK to $LAST_TAG"
|
||||
exit 1
|
||||
```
|
||||
**Два бага:**
|
||||
1. 🔴 `git checkout $LAST_TAG` выполняется в **shared-репо** `/home/slin/repos/enduro-trails` → переводит рабочую копию в detached HEAD на старый тег. Хук `enduro-deploy-hook.sh` делает `cd $REPO && git pull origin main` — следующий деплой получит загаженное состояние/конфликт.
|
||||
2. 🔴 Это **не откатывает прод вообще** — контейнер крутит уже собранный образ; `git checkout` локального файла прод не меняет. Откат фиктивный.
|
||||
|
||||
### M-5 — хардкод инфры в промптах
|
||||
- `.openclaw/agents/architect.md:16` — `82.22.50.71` хардкод.
|
||||
- `.openclaw/agents/tester.md:27,38,39` — `/home/slin/repos/enduro-trails`, `/home/slin/tools/ui-test/...` хардкод путей.
|
||||
- `deployer.md` УЖЕ частично параметризован (`DEPLOY_SSH_USER/HOST/HOOK` через env с дефолтами) — это образец, как делать остальные.
|
||||
|
||||
## Что сделать
|
||||
|
||||
### Часть А — rollback В ХУК (S-3)
|
||||
Хук `enduro-deploy-hook.sh` сейчас: `set -e` → `cd $REPO` → `git pull origin main` → `docker compose up -d app` → опц. gps-collector. **rollback'а нет.**
|
||||
|
||||
1. **Сохранить текущий образ ДО рестарта** (чтобы было к чему откатываться):
|
||||
- Перед `docker compose up -d app` снять id текущего работающего образа app: `PREV_IMG=$(docker compose images -q app 2>/dev/null || docker inspect --format '{{.Image}}' $(docker compose ps -q app) 2>/dev/null)`.
|
||||
- Записать в файл-«предыдущий»: `echo "$PREV_IMG" > $REPO/.deploy-prev-image` (только если непусто).
|
||||
2. **Добавить режим rollback в хук** (новый флаг, напр. `enduro-deploy-hook.sh --rollback`):
|
||||
- Прочитать `.deploy-prev-image`, если есть и непусто → `docker tag $PREV_IMG <app-image>:current` ИЛИ перезапустить app на предыдущем образе (выбери надёжный способ под текущий compose; если app собирается из Dockerfile — откат к предыдущему образу через `docker compose up -d` с `image:` override или `docker run` старого образа). Если способ неоднозначен — опиши в отчёте что выбрал и почему, НЕ выдумывай несуществующие compose-поля.
|
||||
- Залогировать в тот же `$LOG`.
|
||||
- **Если откатывать не к чему** (нет prev-image) → честно залогировать «no previous image, rollback skipped» и вернуть ненулевой код.
|
||||
3. ⚠️ НЕ ломать `set -e` поведение и существующий happy-path. rollback — отдельная ветка флага, не трогает основной поток.
|
||||
|
||||
### Часть Б — почистить промпт деплойера (S-3)
|
||||
В `.openclaw/agents/deployer.md` блок 6 «Rollback»:
|
||||
- **Убрать** `git checkout $LAST_TAG`.
|
||||
- **Заменить** на вызов хука с флагом rollback:
|
||||
```bash
|
||||
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 ${DEPLOY_USER}@${DEPLOY_HOST} "bash ${HOOK} --rollback"
|
||||
echo "ROLLBACK requested via deploy hook"
|
||||
exit 1
|
||||
```
|
||||
(используй те же `DEPLOY_USER/DEPLOY_HOST/HOOK` переменные что уже определены в блоке 3).
|
||||
- Убрать из `tools:` строки `docker` если он больше не нужен в промпте (деплой/откат теперь только через SSH+хук). Проверь — упоминается ли docker ещё где-то в промпте; если только в rollback — можно сузить до `Bash (git, curl)`. Если есть другой обоснованный вызов — оставь и отметь в отчёте.
|
||||
|
||||
### Часть В — M-5 параметризация хардкода
|
||||
По образцу `deployer.md` (env с дефолтами):
|
||||
- `architect.md:16` — `82.22.50.71` → текстом обобщить (это просто описание инфры в промпте, не исполняемый код): заменить на `${DEPLOY_SSH_HOST:-…}`-стиль ИЛИ обобщённую формулировку «один сервер (Docker Compose)». Не ломать смысл промпта.
|
||||
- `tester.md:27,38,39` — пути `/home/slin/repos/enduro-trails`, `/home/slin/tools/ui-test/...`:
|
||||
- `make test` путь → использовать `${REPO_DIR:-/home/slin/repos/enduro-trails}` или относительный (агент и так в репо — проверь cwd-контекст).
|
||||
- ui-test путь → `${UI_TEST_RUNNER:-/home/slin/tools/ui-test/run_tests.js}`.
|
||||
- Цель M-5: инфра-специфика выносится в env-переменные с разумными дефолтами, промпты переносимы. Где значение — просто описание (не исполняется) и параметризация ломает читаемость — допустимо оставить, но отметь в отчёте.
|
||||
|
||||
## Ограничения
|
||||
- 🚫 НЕ трогай: orchestrator (вообще другой репо), nginx, openclaw.json, .env-секреты, src/ и tests/ самого enduro-trails (только `.openclaw/agents/*.md` + хук на хосте).
|
||||
- ⚠️ Хук — прод. Бэкап перед правкой: `cp /home/slin/bin/enduro-deploy-hook.sh /home/slin/bin/enduro-deploy-hook.sh.bak-$(date +%s)`. Merge, не overwrite.
|
||||
- ⚠️ НЕ запускай реальный деплой/rollback на проде для «проверки» — это живой сайт. Проверка хука — `bash -n` (синтаксис) + dry-run логики на тестовом образе, НЕ трогая работающий app.
|
||||
- Conventional Commits: `fix(deploy): move rollback into deploy hook (S-3)`, `refactor(agents): parametrize infra hardcode (M-5)`.
|
||||
|
||||
## Проверка (Стрим проверит вживую)
|
||||
| # | Что | Критерий |
|
||||
|---|-----|----------|
|
||||
| 1 | хук backup | `.bak-*` создан перед правкой |
|
||||
| 2 | хук happy-path цел | pull+restart+gps-collector не сломаны, `bash -n` ок |
|
||||
| 3 | хук rollback | `--rollback` читает prev-image, откатывает app ИЛИ честно «skipped» если нечего; логирует |
|
||||
| 4 | deployer.md | нет `git checkout $LAST_TAG`; rollback = вызов хука `--rollback` |
|
||||
| 5 | M-5 | architect/tester хардкод → env-переменные с дефолтами, смысл цел |
|
||||
| 6 | git | PR в main репо enduro-trails, remote содержит коммиты (грабля ORCH-7) |
|
||||
|
||||
## Отчёт
|
||||
- НЕ деплоить на прод. После правок — `bash -n` хука, показать diff deployer.md/architect.md/tester.md + новый хук.
|
||||
- Запушь ветку (ПРОВЕРЬ remote!), открой PR в main **репо enduro-trails**. НЕ мержи — мерж и решение про прод-применение хука делает Стрим.
|
||||
- Хук на хосте: после правки покажи финальный `cat` + `bash -n`. Применение на проде (если решим) — отдельный осознанный шаг, согласованный со Славой.
|
||||
- После каждого блока — короткий отчёт. Если ТЗ расходится с кодом — отчитайся, не выдумывай. Один исполнитель, не паникуй про параллельные сессии.
|
||||
@@ -0,0 +1,62 @@
|
||||
# Dev Report: ORCH-3 (S-3) + M-5 — безопасный rollback деплоя + чистка хардкода инфры
|
||||
Дата: 2026-06-03
|
||||
Статус: DONE (PR #20 открыт, НЕ смержен; прод-хук НЕ применён)
|
||||
|
||||
## Задача
|
||||
- S-3: убрать опасный `git checkout $LAST_TAG` из deployer.md (загаживает shared-репо, прод не откатывает), перенести rollback В ХУК enduro-deploy-hook.sh.
|
||||
- M-5: вынести хардкод инфры (architect.md:16, tester.md:27,38,39) в env с дефолтами.
|
||||
- Репо: enduro-trails (НЕ orchestrator). Сервер slin@82.22.50.71. Хук /home/slin/bin/enduro-deploy-hook.sh.
|
||||
|
||||
## Верификация по живому коду (до правок)
|
||||
- Хук сейчас: `set -e` → cd REPO → `git pull origin main` → `docker compose up -d app` → опц. gps-collector. rollback'а НЕТ.
|
||||
- app собирается из Dockerfile (build context), образ `enduro-trails-app:latest`. Running image id = sha256:dda30e27...
|
||||
- compose: `docker compose images app` даёт `enduro-trails-app:latest`. `docker inspect --format '{{.Image}}'` даёт sha256 running.
|
||||
- => механизм отката: ДО rebuild сохранить id текущего (старого) образа в .deploy-prev-image; на --rollback ретегнуть его в enduro-trails-app:latest и `docker compose up -d --no-build app`.
|
||||
|
||||
## Блок А — DONE (хук-кандидат, НЕ применён на прод)
|
||||
- Бэкап прод-хука: `/home/slin/bin/enduro-deploy-hook.sh.bak-1780468526`.
|
||||
- Новый хук staged как кандидат: `/home/slin/bin/enduro-deploy-hook.sh.new` (НЕ перезаписан живой — применение = шаг Стрим/Слава).
|
||||
- `bash -n` кандидата: OK. md5: 2b60c65b33bf962b91a6aa6436076181.
|
||||
- Логика:
|
||||
- Normal deploy: ДО `docker compose up -d app` снимаем id текущего running образа и пишем в `$REPO/.deploy-prev-image`. Best-effort (`|| true`), set -e не ломается.
|
||||
- `--rollback`: читает .deploy-prev-image; если пусто/образа нет локально → лог «rollback skipped» + exit 1. Иначе `docker tag <prev> enduro-trails-app:latest` + `docker compose up -d --no-build app` + exit 0. git/pull НЕ трогает.
|
||||
- happy-path (pull + restart + опц. gps-collector) сохранён без изменений.
|
||||
- DRY-RUN на проде (read-only + throwaway-тег, НЕ :latest): capture=sha256:dda30e27..., tag OK, throwaway удалён, running app не тронут.
|
||||
- ⚠️ Хук вне git-репо (только /home/slin/bin/), в PR не попадает — приложен как .new кандидат + задокументирован здесь.
|
||||
|
||||
## Сделано
|
||||
- [x] A — rollback в хук (backup + кандидат + bash -n + dry-run) — DONE
|
||||
- [x] Б — deployer.md блок 6 (rollback = ssh ... --rollback) + tools docker→Bash (git, curl) — DONE
|
||||
- [x] В — M-5 architect.md (${DEPLOY_SSH_HOST:-mva154}) + tester.md (${REPO_DIR}, ${UI_TEST_RUNNER}) — DONE
|
||||
- [x] git push + remote verify (ORCH-7) + PR #20 — DONE
|
||||
|
||||
## Результат
|
||||
- Ветка `feature/ORCH-3-deploy-rollback` запушена. Remote-проверка (ORCH-7): `origin/main..origin/feature/...` = c6b8826 (S-3), 39b15be (M-5). РЕАЛЬНО на remote.
|
||||
- PR #20 → main репо enduro-trails: https://git.mva154.duckdns.org/admin/enduro-trails/pulls/20 . НЕ смержен (мерж = Стрим).
|
||||
- Коммиты (Conventional): `fix(deploy): move rollback into deploy hook (S-3)`, `refactor(agents): parametrize infra hardcode (M-5)`.
|
||||
- Хук-кандидат + бэкап лежат на хосте в /home/slin/bin/ — применение = осознанный шаг Стрим/Слава.
|
||||
|
||||
## Проверка по таблице ТЗ
|
||||
1. backup `.bak-1780468526` ✔ 2. happy-path цел + bash -n OK ✔ 3. --rollback читает prev-image/skipped+exit1, логирует ✔ (dry-run верифицирован) 4. deployer.md: нет git checkout, rollback=хук ✔ 5. M-5 env с дефолтами, смысл цел ✔ 6. PR #20, remote содержит коммиты ✔
|
||||
|
||||
## Изменённые файлы
|
||||
- (хук на хосте) /home/slin/bin/enduro-deploy-hook.sh
|
||||
- .openclaw/agents/deployer.md
|
||||
- .openclaw/agents/architect.md
|
||||
- .openclaw/agents/tester.md
|
||||
|
||||
## Проблемы и решения
|
||||
- Хук НЕ трекается в git-репо (живёт только /home/slin/bin/) → в PR не попадает. Решение: staged как `.new` кандидат + бэкап на хосте, полностью задокументирован тут и в теле PR.
|
||||
- На хосте нет scp → файлы заливал через base64 over SSH (с md5-проверкой целостности).
|
||||
- Remote origin = http://localhost:3000 (Gitea на хосте) → git/PR-операции делал на самом хосте в /tmp/orch3-work (свежий clone, НЕ shared prod working-copy, чтобы не трогать прод).
|
||||
- Способ отката выбран: retag prev-image → enduro-trails-app:latest + `docker compose up -d --no-build app`. Причина: app собирается из Dockerfile, образ всегда тегается enduro-trails-app:latest; ретег предыдущего id + рестарт без rebuild — надёжно возвращает контейнер на старый образ, ничего не пересобирая.
|
||||
|
||||
## Применение на проде (для Стрим/Слава, НЕ выполнено мной)
|
||||
```
|
||||
cp /home/slin/bin/enduro-deploy-hook.sh.new /home/slin/bin/enduro-deploy-hook.sh # swap
|
||||
# откат при необходимости: cp /home/slin/bin/enduro-deploy-hook.sh.bak-1780468526 /home/slin/bin/enduro-deploy-hook.sh
|
||||
```
|
||||
Примечание: .deploy-prev-image появится только ПОСЛЕ первого деплоя новым хуком; до этого `--rollback` честно вернёт «skipped».
|
||||
|
||||
## Очистка
|
||||
- Временный clone /tmp/orch3-work оставлен (содержит запушенную ветку). Хук-кандидат и бэкап оставлены на хосте как deliverable.
|
||||
Reference in New Issue
Block a user