From 5103ed6d9cd8e5ba742f66ea72fa8f35e1dcf60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=97=D0=B8=D0=BC=D0=B8=D0=BD?= Date: Tue, 12 May 2026 18:48:04 +0000 Subject: [PATCH] =?UTF-8?q?fix(admin-ui):=20changelog=20build=20context=20?= =?UTF-8?q?=E2=80=94=20copy=20script=20+=20CI=20before=5Fscript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 10 +++++ ordinis-admin-ui/.gitignore | 5 +++ ordinis-admin-ui/package.json | 4 ++ ordinis-admin-ui/scripts/copy-changelog.mjs | 37 +++++++++++++++++++ .../src/components/version/useChangelog.ts | 15 +++++--- ordinis-admin-ui/vite.config.ts | 6 --- 6 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 ordinis-admin-ui/scripts/copy-changelog.mjs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b8fad8e..750f43d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -309,6 +309,16 @@ docker-admin-ui: SVC: ordinis-admin-ui DOCKERFILE: ordinis-admin-ui/Dockerfile BUILD_CONTEXT: ordinis-admin-ui/ + # docs/changelog.md — single source of truth для public changelog (read'ится + # mkdocs/Diplodoc для /docs/changelog.html AND admin-ui WhatsNewButton). + # admin-ui Docker build context = ordinis-admin-ui/ (sibling, не parent) — + # copy file в src/ перед docker build. + # + # Suffix `-public` — case-insensitive FS macOS dev: `changelog.md` ≡ + # `CHANGELOG.md` (existing internal file) → overwrite. Linux CI обычно + # case-sensitive, но единообразное имя минимизирует local/CI drift. + before_script: + - cp docs/changelog.md ordinis-admin-ui/src/changelog-public.md script: - *publish_script # Раньше был path-filter, но это создавало дыру: если backend менялся, а diff --git a/ordinis-admin-ui/.gitignore b/ordinis-admin-ui/.gitignore index b4b80bc..1563827 100644 --- a/ordinis-admin-ui/.gitignore +++ b/ordinis-admin-ui/.gitignore @@ -3,3 +3,8 @@ dist .vite *.log .env.local + +# Generated by predev/prebuild scripts (copied from ../docs/changelog.md). +# Single source of truth — `docs/changelog.md`. См. scripts/copy-changelog.mjs. +# NOT `changelog.md` (case-insensitive FS collides с internal CHANGELOG.md). +/src/changelog-public.md diff --git a/ordinis-admin-ui/package.json b/ordinis-admin-ui/package.json index eda4c59..4b808c7 100644 --- a/ordinis-admin-ui/package.json +++ b/ordinis-admin-ui/package.json @@ -4,6 +4,10 @@ "version": "2.14.0", "type": "module", "scripts": { + "copy-changelog": "node scripts/copy-changelog.mjs", + "predev": "node scripts/copy-changelog.mjs", + "prebuild": "node scripts/copy-changelog.mjs", + "pretest": "node scripts/copy-changelog.mjs", "dev": "vite", "build": "vite build", "preview": "vite preview --host 0.0.0.0 --port 4173", diff --git a/ordinis-admin-ui/scripts/copy-changelog.mjs b/ordinis-admin-ui/scripts/copy-changelog.mjs new file mode 100644 index 0000000..45c50af --- /dev/null +++ b/ordinis-admin-ui/scripts/copy-changelog.mjs @@ -0,0 +1,37 @@ +#!/usr/bin/env node +/** + * Copy `docs/changelog.md` → `ordinis-admin-ui/src/changelog-public.md`. + * + * Why: public CHANGELOG лежит в `docs/` (single source of truth, читается + * mkdocs/Diplodoc для /docs/changelog.html). admin-ui WhatsNewButton тоже + * импортирует его через Vite `?raw`, но Docker build context = admin-ui/, + * `docs/` снаружи. Скрипт вызывается через `predev` / `prebuild` npm + * hooks — копирует файл в admin-ui/src/ перед start'ом vite. + * + * В CI копию делает `.gitlab-ci.yml` `docker-admin-ui:before_script:` — + * перед docker build файл уже в context'е, Dockerfile `COPY . .` подхватит. + * + * **Critical name choice:** `changelog-public.md`, не `changelog.md`. macOS + * по умолчанию case-insensitive filesystem (APFS / HFS+) — `changelog.md` ≡ + * `CHANGELOG.md` ≡ existing internal CHANGELOG.md → overwrite. Suffix + * `-public` устраняет конфликт + явно показывает purpose. Plus файл живёт + * в `src/` (не root) чтобы Vite `?raw` ресолвил по relative path без `..`. + * + * `src/changelog-public.md` — generated, gitignored. + */ +import { copyFileSync, existsSync, mkdirSync } from 'node:fs' +import { dirname, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = dirname(fileURLToPath(import.meta.url)) +const SRC = resolve(__dirname, '..', '..', 'docs', 'changelog.md') +const DST = resolve(__dirname, '..', 'src', 'changelog-public.md') + +if (!existsSync(SRC)) { + console.error(`copy-changelog: source missing ${SRC}`) + process.exit(0) +} + +mkdirSync(dirname(DST), { recursive: true }) +copyFileSync(SRC, DST) +console.log(`copy-changelog: ${SRC} → ${DST}`) diff --git a/ordinis-admin-ui/src/components/version/useChangelog.ts b/ordinis-admin-ui/src/components/version/useChangelog.ts index 0a4ce82..5875858 100644 --- a/ordinis-admin-ui/src/components/version/useChangelog.ts +++ b/ordinis-admin-ui/src/components/version/useChangelog.ts @@ -1,13 +1,18 @@ import { useMemo } from 'react' -// Public CHANGELOG (human-readable, без commit hashes / scope prefixes, -// curated handler-friendly text). Lives в `docs/changelog.md` чтобы single -// source of truth для public-facing changelog был один (docs build тоже -// его публикует на /docs/changelog.html через Diplodoc). +// Public CHANGELOG (human-readable, без commit hashes / scope prefixes). +// Single source of truth — `docs/changelog.md` (читается mkdocs/Diplodoc +// для /docs/changelog.html). Copy step (scripts/copy-changelog.mjs) +// генерит `src/changelog-public.md` перед dev/build/test, .gitlab-ci.yml +// делает то же перед docker build admin-ui. +// +// Filename `changelog-public.md` (не `changelog.md`!) — macOS APFS/HFS+ +// case-insensitive: `changelog.md` ≡ `CHANGELOG.md` (existing internal +// semantic-release-generated file) → overwrite. Suffix устраняет конфликт. // // Internal CHANGELOG (semantic-release auto-generated, с commit hashes для // engineering team) — `ordinis-admin-ui/CHANGELOG.md`. Не bundled в UI. // eslint-disable-next-line import/no-unresolved -- Vite ?raw query resolved at build -import changelogRaw from '../../../../docs/changelog.md?raw' +import changelogRaw from '../../changelog-public.md?raw' /** * Parsed CHANGELOG entry — one version block from semantic-release output. diff --git a/ordinis-admin-ui/vite.config.ts b/ordinis-admin-ui/vite.config.ts index cb2bbb1..5b5e084 100644 --- a/ordinis-admin-ui/vite.config.ts +++ b/ordinis-admin-ui/vite.config.ts @@ -74,12 +74,6 @@ export default defineConfig({ server: { host: '0.0.0.0', port: 5173, - fs: { - // Allow importing files outside admin-ui (e.g. ../docs/changelog.md - // для WhatsNewButton — single source of truth для public changelog - // живёт в docs/ чтобы mkdocs тоже его publish'ил). - allow: ['..'], - }, proxy: { '/api': { target: process.env.VITE_API_PROXY ?? 'http://localhost:8080',