3223a5ced7
Stale package.json создавал ложное впечатление rollback'а: staging
показывал "v1.2.0" хотя последний tag — v1.2.2 (package.json не bump'ился
со времён v1.2.0 release).
Vote A — branch builds НЕ используют package.json как version label.
Vite определяет channel:
serverTag != none → что прод/staging RUNS
clientTag → что build'ил CI tag pipeline (CI_COMMIT_TAG set)
CI без tag → 'dev' literal (staging / branch CI build)
локально → 'local' literal (pnpm dev)
Detection через новый __APP_CI__ define из process.env.CI (GitLab сетает
CI=true). Local pnpm dev: CI undefined → channel='local'.
package.json.version всё ещё инжектится как __APP_VERSION__ и видна в
tooltip badge'а как 'floor vX.Y.Z' — не как primary label.
Files:
- vite.config.ts: + APP_CI from process.env.CI
- src/vite-env.d.ts: + __APP_CI__ declare
- src/components/version/useAppVersion.ts: + clientCI
- src/components/version/VersionBadge.tsx: channel logic вместо fallback
Verify all three modes:
local → 'local · {commit}'
CI branch → 'dev · {commit}'
CI tag v1.3.1 → 'v1.3.1 · {commit}'
Tests: 116 pass.
49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
import { useServerVersion } from '@/api/queries'
|
|
|
|
/**
|
|
* App version + update detection hook.
|
|
*
|
|
* <p>Returns:
|
|
* <ul>
|
|
* <li>{@code clientVersion}, {@code clientCommit}, {@code clientBuiltAt} —
|
|
* built-time injected via Vite {@code define} (см. vite.config.ts).</li>
|
|
* <li>{@code serverVersion} — polled из {@code /api/v1/version} каждые 5 мин.</li>
|
|
* <li>{@code updateAvailable} — true когда client.commit ≠ server.commit AND
|
|
* обе stamps known (не "unknown" и не undefined).</li>
|
|
* </ul>
|
|
*
|
|
* <p>Update detection conservative — игнорирует "unknown" commit (dev mode без
|
|
* git OR before-build-info), чтобы не показывать banner ложно.
|
|
*/
|
|
export function useAppVersion() {
|
|
const { data: server, isLoading } = useServerVersion()
|
|
|
|
const clientCommit = __APP_COMMIT__
|
|
const clientVersion = __APP_VERSION__
|
|
// Empty string when build wasn't на tag pipeline. VersionBadge / UpdateBanner
|
|
// решают priority: serverTag → clientTag → channel-based label.
|
|
const clientTag = __APP_TAG__
|
|
// true когда GitLab CI собрал bundle. Отличает branch build (dev) от
|
|
// local pnpm dev (local) — оба не имеют tag'а, но семантически разные.
|
|
const clientCI = __APP_CI__
|
|
const clientBuiltAt = __APP_BUILT_AT__
|
|
|
|
const knownClient = clientCommit !== 'unknown' && clientCommit !== ''
|
|
const knownServer = Boolean(server?.commit) && server!.commit !== 'unknown'
|
|
const updateAvailable =
|
|
knownClient && knownServer && clientCommit !== server!.commit
|
|
|
|
return {
|
|
clientVersion,
|
|
clientTag,
|
|
clientCI,
|
|
clientCommit,
|
|
clientBuiltAt,
|
|
serverVersion: server?.version,
|
|
serverCommit: server?.commit,
|
|
serverTag: server?.tag,
|
|
updateAvailable,
|
|
isLoading,
|
|
}
|
|
}
|