From d5fb9e1e1db4f0ec0df6a0bf81759f933d8cf7db Mon Sep 17 00:00:00 2001 From: Nystik <236107-Nystik@users.noreply.gitlab.com> Date: Tue, 26 May 2026 02:55:24 +0200 Subject: [PATCH] update build process and versioning --- .dockerignore | 2 +- .gitignore | 2 +- apps/ignis-server/Dockerfile | 1 + apps/ignis-server/server/config.js | 1 - .../headless-sync/obsidian/manifest.json | 2 +- apps/ignis-server/server/routes/version.js | 9 ++- apps/ignis-server/server/version.js | 58 ++++++++++++++----- build.js | 21 +++++++ packages/bridge/src/settings/general-tab.js | 11 +--- packages/shim/build.js | 8 ++- packages/shim/src/loader.js | 4 +- 11 files changed, 83 insertions(+), 36 deletions(-) diff --git a/.dockerignore b/.dockerignore index 02c0045..6506f5d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -11,4 +11,4 @@ demo-vaults data tmp **/dist -packages/bridge/main.js +apps/ignis-server/server/build-info.json diff --git a/.gitignore b/.gitignore index 0bf12f3..42eb83e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,6 @@ dist/ investigation/ vaults/ packages/*/dist/ -packages/bridge/main.js +apps/ignis-server/server/build-info.json demo-vaults/ data/ diff --git a/apps/ignis-server/Dockerfile b/apps/ignis-server/Dockerfile index 0f516ba..2316aaa 100644 --- a/apps/ignis-server/Dockerfile +++ b/apps/ignis-server/Dockerfile @@ -53,6 +53,7 @@ COPY packages/server-core/src/ ./packages/server-core/src/ # Built artifacts from the build stage. COPY --from=build /app/packages/shim/dist/shim-loader.js ./packages/shim/dist/shim-loader.js COPY --from=build /app/packages/ui/dist/ignis-ui.js ./packages/ui/dist/ignis-ui.js +COPY --from=build /app/apps/ignis-server/server/build-info.json ./apps/ignis-server/server/build-info.json COPY --from=build /app/apps/ignis-server/server/plugins/headless-sync/obsidian/dist/ ./apps/ignis-server/server/plugins/headless-sync/obsidian/dist/ RUN chmod +x /app/apps/ignis-server/scripts/entrypoint.sh diff --git a/apps/ignis-server/server/config.js b/apps/ignis-server/server/config.js index b04903b..0538dc8 100644 --- a/apps/ignis-server/server/config.js +++ b/apps/ignis-server/server/config.js @@ -103,7 +103,6 @@ module.exports = { const assetsPath = process.env.OBSIDIAN_ASSETS_PATH || path.join(__dirname, "..", "investigation", "obsidian_1.12.7_unpacked"); - q; try { const pkg = JSON.parse( fs.readFileSync(path.join(assetsPath, "package.json"), "utf-8"), diff --git a/apps/ignis-server/server/plugins/headless-sync/obsidian/manifest.json b/apps/ignis-server/server/plugins/headless-sync/obsidian/manifest.json index 60ab4c4..1269868 100644 --- a/apps/ignis-server/server/plugins/headless-sync/obsidian/manifest.json +++ b/apps/ignis-server/server/plugins/headless-sync/obsidian/manifest.json @@ -1,6 +1,6 @@ { "id": "ignis-headless-sync", - "name": "Ignis Headless Sync", + "name": "Headless Sync", "version": "0.3.0", "minAppVersion": "1.12.4", "description": "Client-side companion for server-side Obsidian Sync", diff --git a/apps/ignis-server/server/routes/version.js b/apps/ignis-server/server/routes/version.js index 9e2c9b3..8421c1c 100644 --- a/apps/ignis-server/server/routes/version.js +++ b/apps/ignis-server/server/routes/version.js @@ -1,15 +1,14 @@ const express = require("express"); -const { getVersion } = require("../version"); +const { getSemver, getBuild } = require("../version"); const config = require("../config"); const router = express.Router(); +// `version` is the display-friendly SemVer. `build` is the per-build stamp for cache-bust. router.get("/", (req, res) => { - const pkg = require("../../package.json"); - res.json({ - version: getVersion(), - semver: pkg.version, + version: getSemver(), + build: getBuild(), obsidianVersion: config.obsidianVersion, }); }); diff --git a/apps/ignis-server/server/version.js b/apps/ignis-server/server/version.js index ed8788d..acb6ec3 100644 --- a/apps/ignis-server/server/version.js +++ b/apps/ignis-server/server/version.js @@ -1,23 +1,51 @@ const fs = require("fs"); const path = require("path"); -const { execSync } = require("child_process"); -function getVersion() { - const pkg = JSON.parse( - fs.readFileSync(path.join(__dirname, "..", "package.json"), "utf-8"), - ); - const semver = pkg.version; +let cached = null; - let hash; - try { - hash = execSync("git rev-parse --short=7 HEAD", { - encoding: "utf-8", - }).trim(); - } catch (e) { - hash = Date.now().toString(36).slice(-7); +function load() { + if (cached) { + return cached; } - return `${semver}-${hash}`; + // Production: root build.js writes this next to us. + try { + cached = JSON.parse( + fs.readFileSync(path.join(__dirname, "build-info.json"), "utf-8"), + ); + return cached; + } catch {} + + // Local dev fallback. Read root package.json. + try { + const pkg = JSON.parse( + fs.readFileSync( + path.join(__dirname, "..", "..", "..", "package.json"), + "utf-8", + ), + ); + cached = { + semver: pkg.version, + build: "dev", + version: `${pkg.version}-dev`, + }; + return cached; + } catch {} + + cached = { semver: "0.0.0", build: "unknown", version: "0.0.0-unknown" }; + return cached; } -module.exports = { getVersion }; +function getVersion() { + return load().version; +} + +function getSemver() { + return load().semver; +} + +function getBuild() { + return load().build; +} + +module.exports = { getVersion, getSemver, getBuild }; diff --git a/build.js b/build.js index 5425726..69b93a8 100644 --- a/build.js +++ b/build.js @@ -12,6 +12,27 @@ const headlessSyncDir = path.join( "obsidian", ); +// Compute version info once and share across per-package builds. +const { version: semver } = require("./package.json"); +const build = process.env.IGNIS_BUILD || Date.now().toString(36).slice(-7); +const version = `${semver}+${build}`; + +const buildInfoPath = path.join( + __dirname, + "apps", + "ignis-server", + "server", + "build-info.json", +); + +fs.writeFileSync( + buildInfoPath, + JSON.stringify({ semver, build, version }, null, 2), +); + +// Used by packages. +process.env.IGNIS_BUILD_RESOLVED = build; + Promise.all([ // Build shim-loader.js (delegated to packages/shim) require("./packages/shim/build.js"), diff --git a/packages/bridge/src/settings/general-tab.js b/packages/bridge/src/settings/general-tab.js index bd50b9c..bfcff57 100644 --- a/packages/bridge/src/settings/general-tab.js +++ b/packages/bridge/src/settings/general-tab.js @@ -4,13 +4,8 @@ const GITHUB_URL = "https://github.com/Nystik-gh/ignis"; const GITHUB_API_LATEST = "https://api.github.com/repos/Nystik-gh/ignis/releases/latest"; -function getVersion(app) { - try { - const manifest = app.plugins.getPlugin("ignis-bridge")?.manifest; - return manifest?.version || "unknown"; - } catch { - return "unknown"; - } +function getVersion() { + return window.__ignis?.version || "unknown"; } // SemVer build metadata (`+xyz`) is informational and ignored for precedence. @@ -41,7 +36,7 @@ async function checkForUpdate(currentVersion) { } function display(containerEl, app) { - const version = getVersion(app); + const version = getVersion(); const header = containerEl.createDiv("ignis-header"); diff --git a/packages/shim/build.js b/packages/shim/build.js index 31f0a75..d92043a 100644 --- a/packages/shim/build.js +++ b/packages/shim/build.js @@ -1,7 +1,10 @@ const esbuild = require("esbuild"); const path = require("path"); -const { version: ignisVersion } = require("../../package.json"); +const { version: semver } = require("../../package.json"); + +// Root build.js sets IGNIS_BUILD_RESOLVED when it runs first; standalone invocation falls back to a dev stamp. +const build = process.env.IGNIS_BUILD_RESOLVED || "dev"; module.exports = esbuild.build({ entryPoints: [path.join(__dirname, "src", "loader.js")], @@ -18,7 +21,8 @@ module.exports = esbuild.build({ }, external: ["obsidian", "fs"], define: { - __IGNIS_VERSION__: JSON.stringify(ignisVersion), + __IGNIS_VERSION__: JSON.stringify(semver), + __IGNIS_BUILD__: JSON.stringify(build), }, logLevel: "info", }); diff --git a/packages/shim/src/loader.js b/packages/shim/src/loader.js index 31a595f..19a1b07 100644 --- a/packages/shim/src/loader.js +++ b/packages/shim/src/loader.js @@ -13,8 +13,8 @@ import { import { wsClient } from "./ws-client.js"; import { installIgnisApi } from "./ignis-api.js"; -// __IGNIS_VERSION__ is replaced at build time from package.json. -window.__ignis = { version: __IGNIS_VERSION__ }; +// __IGNIS_VERSION__ (semver) and __IGNIS_BUILD__ are replaced at build time. +window.__ignis = { version: __IGNIS_VERSION__, build: __IGNIS_BUILD__ }; window.__ignis_registerUI = registerUI; installIgnisApi(wsClient);