Files
wiki/tasks/orchestrator/reports/dev-2026-06-03-orch3-deploy-rollback.md
2026-06-03 09:40:01 +03:00

6.3 KiB
Raw Blame History

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 maindocker 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 кандидат + задокументирован здесь.

Сделано

  • 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/ — применение = осознанный шаг Стрим/Слава.

Проверка по таблице ТЗ

  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.