feat(tradein): версионирование продукта — единый источник, подвал, PDF, /versions #2824

Merged
lekss361 merged 1 commit from feat/tradein-versioning into main 2026-08-10 16:00:54 +00:00
Owner

Зачем

До сих пор «версия» существовала как два независимых декоративных хардкодаui-config.ts::version = "v2.0.6" (подвал отчёта на /trade-in/v2) и _REPORT_ENGINE_VERSION = "v2.0.6" (подвал PDF). Ни один не был связан с тем, что реально задеплоено. Заводим настоящее версионирование.

Решения владельца продукта

  • Формат: SemVer + билдМера v2.1.0 · a1b2c3d · 10.08.2026.
  • Стартовый номер — 2.1.0, а не 1.0.0: заказчик уже видел «v2.0.6» в отчётах, номер версии не должен идти назад.
  • Старый вордмарк-бейдж не удаляем «в никуда» — версия в нём заменена на реальную, а сам вордмарк «МЕРА» сохранён.

Summary

  • tradein-mvp/VERSION — единственный источник правды. Оба старых хардкода удалены, чтобы на экране и в отчёте не соседствовали два разных номера.
  • tradein-mvp/CHANGELOG.md — Keep a Changelog на русском, языком продукта, а не коммитов. Заголовок машинно-парсим: ## <semver> — <YYYY-MM-DD>.
  • Проброс в сборку: APP_VERSION/BUILD_SHA/BUILD_DATE (backend, читаются в рантайме) и NEXT_PUBLIC_* (frontend, обязательно build-time — иначе не попадут в статику). paths-filter теперь триггерит пересборку и на изменение VERSION/CHANGELOG.md, иначе bump версии не доехал бы до образов.
  • GET /api/v1/trade-in/version{version, sha, built_at}, публичный (точное совпадение пути в _PUBLIC_PATHS, не префикс).
  • Подвал веб-интерфейса и шапка PDF показывают строку версии; страница /trade-in/versions рендерит историю из CHANGELOG.md обычным текстом, без dangerouslySetInnerHTML.
  • Dockerfile backend: блок ARG/ENV перенесён в конец runner-стадии — BUILD_DATE меняется каждый деплой и иначе инвалидировал бы registry-кэш apt/venv/app-слоёв на каждой сборке.

Test plan

  • Полный бэкенд-прогон после ребейза на актуальный main: 4181 passed, 18 skipped
  • ruff check / ruff format — чисто; pre-commit зелёный; YAML workflow валиден
  • tsc --noEmit, eslint, npm run build — чисто, /versions собирается как статика и реально содержит текст CHANGELOG
  • Реальный рендер PDF в контейнере: -m pdf_render → 3 passed, включая «ровно 4 страницы без пустых листов» (регрессия из 42a50cf8 не вернулась)
  • Реальная сборка Docker-образа backend с build-args, printenv внутри подтвердил ENV
  • Эмпирически проверен glob-COPY CHANGELOG.md* при отсутствии файла в контексте — сборка не падает
  • Code-review в свежем контексте; найденный блокер (два конкурирующих номера версии) закрыт
  • Post-deploy: проверить подвал на /trade-in/v2, страницу /trade-in/versions и ответ /version на проде
## Зачем До сих пор «версия» существовала как **два независимых декоративных хардкода** — `ui-config.ts::version = "v2.0.6"` (подвал отчёта на `/trade-in/v2`) и `_REPORT_ENGINE_VERSION = "v2.0.6"` (подвал PDF). Ни один не был связан с тем, что реально задеплоено. Заводим настоящее версионирование. ## Решения владельца продукта - Формат: **SemVer + билд** — `Мера v2.1.0 · a1b2c3d · 10.08.2026`. - Стартовый номер — **2.1.0**, а не 1.0.0: заказчик уже видел «v2.0.6» в отчётах, номер версии не должен идти назад. - Старый вордмарк-бейдж не удаляем «в никуда» — версия в нём заменена на реальную, а сам вордмарк «МЕРА» сохранён. ## Summary - `tradein-mvp/VERSION` — единственный источник правды. Оба старых хардкода удалены, чтобы на экране и в отчёте не соседствовали два разных номера. - `tradein-mvp/CHANGELOG.md` — Keep a Changelog на русском, языком продукта, а не коммитов. Заголовок машинно-парсим: `## <semver> — <YYYY-MM-DD>`. - Проброс в сборку: `APP_VERSION`/`BUILD_SHA`/`BUILD_DATE` (backend, читаются в рантайме) и `NEXT_PUBLIC_*` (frontend, обязательно build-time — иначе не попадут в статику). `paths-filter` теперь триггерит пересборку и на изменение `VERSION`/`CHANGELOG.md`, иначе bump версии не доехал бы до образов. - `GET /api/v1/trade-in/version` → `{version, sha, built_at}`, публичный (точное совпадение пути в `_PUBLIC_PATHS`, не префикс). - Подвал веб-интерфейса и шапка PDF показывают строку версии; страница `/trade-in/versions` рендерит историю из `CHANGELOG.md` обычным текстом, без `dangerouslySetInnerHTML`. - `Dockerfile` backend: блок `ARG`/`ENV` перенесён в конец runner-стадии — `BUILD_DATE` меняется каждый деплой и иначе инвалидировал бы registry-кэш apt/venv/app-слоёв на каждой сборке. ## Test plan - [x] Полный бэкенд-прогон после ребейза на актуальный main: **4181 passed, 18 skipped** - [x] `ruff check` / `ruff format` — чисто; pre-commit зелёный; YAML workflow валиден - [x] `tsc --noEmit`, `eslint`, `npm run build` — чисто, `/versions` собирается как статика и реально содержит текст CHANGELOG - [x] **Реальный рендер PDF в контейнере**: `-m pdf_render` → 3 passed, включая «ровно 4 страницы без пустых листов» (регрессия из 42a50cf8 не вернулась) - [x] Реальная сборка Docker-образа backend с build-args, `printenv` внутри подтвердил ENV - [x] Эмпирически проверен glob-`COPY CHANGELOG.md*` при отсутствии файла в контексте — сборка не падает - [x] Code-review в свежем контексте; найденный блокер (два конкурирующих номера версии) закрыт - [ ] Post-deploy: проверить подвал на `/trade-in/v2`, страницу `/trade-in/versions` и ответ `/version` на проде
lekss361 added 1 commit 2026-08-10 15:51:00 +00:00
feat(tradein): версионирование продукта — единый источник, подвал, PDF, /versions
All checks were successful
CI Trade-In / backend-tests (pull_request) Successful in 4m2s
CI / changes (pull_request) Successful in 9s
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m3s
b791a7a53c
До сих пор номер версии существовал как два независимых декоративных
хардкода («МЕРА v2.0.6» в подвале отчёта и в PDF), не связанных с тем,
что реально задеплоено. Заводим настоящее версионирование.

- tradein-mvp/VERSION — единственный источник правды (2.1.0). Номер
  продолжает ряд, который клиент уже видел в отчётах, чтобы не поехал назад.
- tradein-mvp/CHANGELOG.md — Keep a Changelog на русском, языком продукта.
  Заголовок версии машинно-парсим: `## <semver> — <YYYY-MM-DD>`.
- Проброс в сборку: build-args → APP_VERSION/BUILD_SHA/BUILD_DATE (backend,
  рантайм) и NEXT_PUBLIC_* (frontend, build-time — иначе не попадёт в статику).
  paths-filter теперь триггерит пересборку на изменение VERSION/CHANGELOG.
- GET /api/v1/trade-in/version → {version, sha, built_at}, публичный.
- Подвал веб-интерфейса и шапка PDF показывают «Мера vX.Y.Z · sha · дата».
- Страница /trade-in/versions — история версий из CHANGELOG.md, рендер
  простым текстом без dangerouslySetInnerHTML.
- Удалены оба старых хардкода версии, чтобы на экране и в отчёте не
  соседствовали два разных номера.
lekss361 merged commit 8423af5dd5 into main 2026-08-10 16:00:54 +00:00
lekss361 deleted branch feat/tradein-versioning 2026-08-10 16:00:55 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2824
No description provided.