Files
enduro-trails/docs/work-items/ET-012/14-deploy-log.md
claude-bot 726d7bb4ca
All checks were successful
CI / lint (pull_request) Successful in 5s
CI / test (pull_request) Successful in 10s
CI / build (pull_request) Successful in 2s
deployer(ET-012): tag v0.0.4 + deploy log (FAILED — host repo state blocker)
Tag v0.0.4 создан и запушен, PR #24 смерджен в main (commit 8da09e6),
но deploy-hook упал на git pull origin main: host-репо
/home/slin/repos/enduro-trails имеет root-owned файл
src/api/gps_tracks/mvt.py (Permission denied при unlink) и
конфликтующие модификации tracked-файлов + untracked work-items.
У slin нет беспарольного sudo (наследие ET-011 §3). Rollback также
провалился (нет .deploy-prev-image).

Backend контейнер enduro-trails-app продолжает работать на до-ET-012
образе (Up 7 hours, unhealthy). Фронт ET-012 уже отдаётся живой
test-средой через mounted host-файлы (ручная правка ops после
ET-011), но tier-фильтр build_gps_mvt не применён.

Healthcheck/smoke: PARTIAL — все 4 URL отвечают 200, но это не
подтверждает применение ET-012 в backend. Контракт API не сломан
(REQ-F-15).

deploy_status: FAILED — корректный возврат через QG.check_deploy_status.

Что нужно от ops: см. docs/work-items/ET-012/14-deploy-log.md §6.

Refs: ET-012, ET-011 (тот же класс блокеров).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-04 06:45:46 +00:00

13 KiB
Raw Blame History

deploy_status, version, work_item_id, type, created_at, authors, related, adr_refs
deploy_status version work_item_id type created_at authors related adr_refs
FAILED v0.0.4 ET-012 deploy-log 2026-06-04
agent:deployer
ET-011
ADR-016

Deploy Log — ET-012

  • Version (tag): v0.0.4
  • Date: 2026-06-04 06:42 UTC
  • PR: #24 (merged via Gitea API Do=merge, merge commit 8da09e6)
  • Environment: test (https://openclaw.mva154.duckdns.org/enduro/)
  • Healthcheck: PARTIAL (см. §5; HTTP 200, но runtime — старый образ)
  • Smoke: PARTIAL (см. §5; endpoint-ответы 200, но ET-012 backend-логика НЕ применена)
  • Status: FAILED — infrastructure blocker (host repo state)

1. Что сделано

  1. PR #24 (feat(gps-tracks): lower public-tracks minzoom to z5 (ET-012)) смерджен в main через Gitea API (POST /pulls/24/merge, body {"Do":"merge"}200 OK). Merge-commit 8da09e6 (Merge pull request 'feat(gps-tracks): lower public-tracks minzoom to z5 (ET-012)' (#24) from feature/ET-012-z5-z8 into main).
  2. Тег v0.0.4 создан от origin/main и запушен в Gitea (git tag v0.0.4 origin/main && git push origin v0.0.4[new tag] v0.0.4 -> v0.0.4). Инкремент patch от v0.0.3.

2. Что НЕ сделано (и почему)

  1. Deploy hook упал на git pull origin main на test-хосте.

    Запуск ssh slin@127.0.0.1 'bash /home/slin/bin/enduro-deploy-hook.sh'exit 1. В /var/log/enduro-trails/deploy-hook.log:

    [2026-06-04T06:40:49Z] Deploy hook called:
    From http://localhost:3000/admin/enduro-trails
     * branch            main       -> FETCH_HEAD
    error: unable to unlink old 'src/api/gps_tracks/mvt.py': Permission denied
    error: unable to create file tests/api/test_gps_mvt_simplify.py: Permission denied
    error: unable to create file tests/api/test_gps_mvt_zoom_tiers.py: Permission denied
    Updating 81c3394..8da09e6
    [2026-06-04T06:40:55Z] Deploy hook called:
    ...
    error: Your local changes to the following files would be overwritten by merge:
        CHANGELOG.md
        docs/architecture/adr/README.md
        pyproject.toml
        src/web/gps_tracks.js
        src/web/index.html
    error: The following untracked working tree files would be overwritten by merge:
        docs/work-items/ET-012/...
        tests/integration/test_gps_tile_z5_z7.py
        tests/performance/...
    Please move or remove them before you merge.
    Aborting
    

    Состояние host-репо /home/slin/repos/enduro-trails:

    • HEAD = 81c3394 (отстаёт от origin/main на 4 коммита, включая этот ET-012-merge).
    • 5 модифицированных tracked-файлов (CHANGELOG.md, docs/architecture/adr/README.md, pyproject.toml, src/web/gps_tracks.js, src/web/index.html) — судя по содержимому, кто-то вручную накатил часть фронт-изменений ET-012 прямо в working tree после ET-011 deploy-блокера.
    • Untracked-каталог docs/work-items/ET-012/ целиком + новые тестовые файлы — кто-то вручную скопировал их на host.
    • src/api/gps_tracks/mvt.py принадлежит root:root (mtime Jun 1 17:32) — даже git checkout -- . от slin не удалит этот файл. Это первичная причина Permission denied.

    Все эти модификации лежат на host'е вне git'а с предыдущей попытки ручного фикса ET-011 (см. ET-011 14-deploy-log §«Что нужно от ops»). У slin нет беспарольного sudo (зафиксировано в ET-011 §3, sudo -n -la password is required), поэтому ни chown, ни rm root-owned файла из роли deployer недоступны.

  2. Healthcheck / smoke запускались уже на текущем running-контейнере, а не на новом образе (см. §5). Они PASS на уровне HTTP, но это не подтверждает применение ET-012 в backend.

  3. Rollback также провалился:

    [2026-06-04T06:42:01Z] Deploy hook called: --rollback
    [2026-06-04T06:42:01Z] ROLLBACK requested
    [2026-06-04T06:42:01Z] ROLLBACK: no previous image recorded, rollback skipped
    

    Файла /home/slin/repos/enduro-trails/.deploy-prev-image не существует — за всё время существования хука (включая ET-011) ни одна deploy ветка не дошла до записи prev-image. Откатывать в смысле docker-образа нечего; production остался на том же контейнере, что и до этой попытки.

3. Текущее состояние production (test env)

Слой Что отдаёт Ожидание ET-012 Совпадает?
GET /enduro/ HTML 37 KB, public-tracks hint Зум 5+ (line 80 index.html) hint «Зум 5+» (но через ручную правку host, не образ)
GET /enduro/gps_tracks.js JS 38 KB, const GPS_TRACKS_MIN_ZOOM = 5 GPS_TRACKS_MIN_ZOOM = 5 (через mounted volume host)
GET /enduro/api/health {"status":"ok",...} (200) 200
GET /enduro/api/gps-tracks/tiles/5/19/9.mvt 200, body 4542 B 200, body ≤ 200 KB контракт; ⚠️ backend старый
docker enduro-trails-app Up 7 hours (unhealthy) — образ собран ДО ET-012 новый образ с tier z5/z6/z7 в build_gps_mvt НЕТ
MVT tier-фильтр z=5 (min_length_m=10000, limit=1500) старая логика (без фильтра) новая логика ADR-016 §T-2 НЕТ

Итог: фронт-часть ET-012 фактически уже видна на проде (за счёт ручной правки host-файлов оператором между ET-011 и сейчас), а бэкенд-часть ET-012 (tier-фильтр на z=5/6/7) — НЕ применена. Размер тайла z=5/19/9 = 4542 B; в новом коде limit=1500 (на тестовых данных всё равно 27 треков ≪ 1500), так что внешне разницы не будет до тех пор, пока территория не наберёт > 1500 треков на тайл. Контракт API (REQ-F-15) не сломан.

4. Acceptance Criteria — итог по AC

AC Что проверяли Источник Статус
AC-01 GPS_TRACKS_MIN_ZOOM = 5 в JS gps_tracks.js:11 (live HTTP)
AC-02 source.minzoom === 5 DevTools, deferred n/a (раннер недоступен; код-уровень )
AC-03 Линии видны на z=5 визуальная n/a (раннер недоступен)
AC-04 Больше линий на z=6/z=7 визуальная n/a (раннер недоступен)
AC-05 Hint «Зум 5+» на z=4 DOM #public-tracks-zoom-hint (HTML §3)
AC-06 z≥8 не сломан (регрессия) live MVT z=8/154/79 (test report §5.2)
AC-07 GeoJSON endpoint без регрессий live HTTP (test report §5.4)
AC-08 Качественная читаемость визуальная n/a (раннер недоступен)
AC-09 Тайм-аут z=5, X-Cache live HTTP × 10 (test report §5.1)
AC-10 Размер MVT-тайлов ≤ 200 KB live HTTP (test report §5.2)
AC-1114, 19, 21 unit/integration/perf/lint tester (test report §3-4)
AC-1518 визуальные визуальная n/a (раннер недоступен)
AC-20 Документация ET-012 git tree + этот файл

Внимание: AC-06 (регрессия z≥8) и AC-09/AC-10 (live HTTP) проходят на текущем running образе именно потому, что backend ET-012 НЕ задеплоен — как и ожидалось, изменения не сломали z≥8 (тривиально, на нём всё ещё работает старая логика). После настоящего деплоя те же кейсы должны быть перепроверены.

5. Healthcheck / smoke на текущем образе

Запросы по 4 ключевым URL (после фейла deploy-hook'а):

200  size=37252  23ms   https://openclaw.mva154.duckdns.org/enduro/
200  size=38695  ~13s   https://openclaw.mva154.duckdns.org/enduro/gps_tracks.js
200  size=76     10ms   https://openclaw.mva154.duckdns.org/enduro/api/health
200  size=4542   9ms    https://openclaw.mva154.duckdns.org/enduro/api/gps-tracks/tiles/5/19/9.mvt

Все 200, прод не сломан этим деплоем (поскольку контейнер не рестартился). Высокий latency gps_tracks.js (~13s) — сетевой jitter DuckDNS, аналогичный наблюдавшемуся тестером (test report §5.1 outliers #7/#8/#10).

6. Что нужно от ops, чтобы доехать

ET-011 уже описал требуемые правки /var/log/enduro-trails — видимо они применены, потому что хук теперь успешно пишет в лог. Но host-репо /home/slin/repos/enduro-trails остался в "грязном" состоянии после ручных правок. Нужно (любой вариант):

  • Вариант A — очистить host-репо (минимум прав):
    cd /home/slin/repos/enduro-trails
    # удалить root-owned файлы (требует sudo)
    sudo rm -f src/api/gps_tracks/mvt.py
    # сбросить остальные правки
    git checkout -- .
    # убрать untracked
    git clean -fd
    # запустить хук заново
    bash /home/slin/bin/enduro-deploy-hook.sh
    
  • Вариант B — переехать на отдельный git worktree, который хук использует только для read-only git fetch + docker build, а prod-файлы не имеют общего volume с git-репо. Это уже сейчас напрашивается архитектурно (см. ET-011 §«Что нужно от ops» вариант B).
  • Вариант C — дать deployer-агенту NOPASSWD на chown/rm в /home/slin/repos/enduro-trails и/или на enduro-deploy-hook.sh с пред-rm.

После фикса host-state повторно дернуть bash /home/slin/bin/enduro-deploy-hook.sh от имени slin — версия на main (8da09e6) и тег (v0.0.4) уже корректные, пересоздавать PR/тег не нужно.

7. Артефакты

  • Tag: v0.0.4 (origin/main @ 8da09e6)
  • PR: #24 (merged at 2026-06-04 06:40 UTC)
  • Deploy attempts:
    • 2026-06-04 06:40:49 UTC — normal deploy, RC=1 (git pull Permission denied)
    • 2026-06-04 06:40:55 UTC — normal deploy retry, RC=1 (untracked overwrite)
    • 2026-06-04 06:42:01 UTC — --rollback, RC=1 (no previous image)
  • Deploy log on host: /var/log/enduro-trails/deploy-hook.log
  • Container in production: enduro-trails-appUp 7 hours (unhealthy), pre-ET-012 image

8. Подытоживая

deploy_status: FAILED. Этот тег v0.0.4 существует в git, PR смерджен, но бэкенд ET-012 (tier-фильтр в build_gps_mvt для z=5/6/7) на проде не работает. Фронт-часть видна за счёт ручной правки host'а до этой попытки — это не результат данного deploy-run'а.

Возврат задачи через QG (check_deploy_status) ожидаем и корректен. Деплоить ET-012 будет повторно после фикса host-state (см. §6) — без вмешательства developer/tester/reviewer (код уже в main).