6.3 KiB
6.3 KiB
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) сохранён без изменений.
- Normal deploy: ДО
- DRY-RUN на проде (read-only + throwaway-тег, НЕ :latest): capture=sha256:dda30e27..., tag OK, throwaway удалён, running app не тронут.
- ⚠️ Хук вне git-репо (только /home/slin/bin/), в PR не попадает — приложен как .new кандидат + задокументирован здесь.
Сделано
- A — rollback в хук (backup + кандидат + bash -n + dry-run) — DONE
- Б — deployer.md блок 6 (rollback = ssh ... --rollback) + tools docker→Bash (git, curl) — DONE
- В — M-5 architect.md (${DEPLOY_SSH_HOST:-mva154}) + tester.md (${REPO_DIR}, ${UI_TEST_RUNNER}) — DONE
- 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: admin/enduro-trails#20 . НЕ смержен (мерж = Стрим).
- Коммиты (Conventional):
fix(deploy): move rollback into deploy hook (S-3),refactor(agents): parametrize infra hardcode (M-5). - Хук-кандидат + бэкап лежат на хосте в /home/slin/bin/ — применение = осознанный шаг Стрим/Слава.
Проверка по таблице ТЗ
- 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.