From ca9acbb0899b799ef47471f43bfc405fc80d44a5 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Wed, 26 Jun 2024 11:21:35 -0400 Subject: [PATCH] Add git versioning check on backend --- package-lock.json | 6 ++++ package.json | 5 ++-- src/backend/index.ts | 4 ++- src/backend/ioc.ts | 65 ++++++++++++++++++++++++++++++++++++++------ 4 files changed, 68 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2127fbe1..148c81df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,6 +43,7 @@ "express-session": "^1.17.2", "fixed-size-list": "^0.3.0", "formidable": "^2.1", + "git-last-commit": "^1.0.1", "gotify": "^1.1.0", "iso-websocket": "^0.2.0", "iti": "^0.6.0", @@ -5205,6 +5206,11 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/git-last-commit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/git-last-commit/-/git-last-commit-1.0.1.tgz", + "integrity": "sha512-FDSgeMqa7GnJDxt/q0AbrxbfeTyxp4ImxEw1e4nw6NUHA5FMhFUq33dTXI4Xdgcj1VQ1q5QLWF6WxFrJ8KCBOg==" + }, "node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", diff --git a/package.json b/package.json index 8884dc63..7615e956 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "test": "npm run -s test:backend", "test:backend": "mocha --reporter spec --recursive src/backend/tests/**/*.test.ts", "fileEndings": "jscodeshift --transformFrom js --transformTo none --importTypes relative --extensions=ts --parser tsx --transform codeshift/transform.ts src/backend", - "dev": "APP_VERSION=$npm_package_version nodemon -w src/backend -x tsx src/backend/index.ts", - "start": "APP_VERSION=$npm_package_version NODE_ENV=production tsx src/backend/index.ts", + "dev": "nodemon -w src/backend -x tsx src/backend/index.ts", + "start": "NODE_ENV=production tsx src/backend/index.ts", "build:frontend": "APP_VERSION=$npm_package_version vite build", "build:backend": "tsc -p src/backend", "build": "npm run -s build:backend && npm run -s build:frontend", @@ -77,6 +77,7 @@ "express-session": "^1.17.2", "fixed-size-list": "^0.3.0", "formidable": "^2.1", + "git-last-commit": "^1.0.1", "gotify": "^1.1.0", "iso-websocket": "^0.2.0", "iti": "^0.6.0", diff --git a/src/backend/index.ts b/src/backend/index.ts index 11b7425a..45900f51 100644 --- a/src/backend/index.ts +++ b/src/backend/index.ts @@ -11,7 +11,7 @@ import { SimpleIntervalJob, ToadScheduler } from "toad-scheduler"; import { projectDir } from "./common/index.js"; import { AIOConfig } from "./common/infrastructure/config/aioConfig.js"; import { appLogger, initLogger as getInitLogger } from "./common/logging.js"; -import { getRoot } from "./ioc.js"; +import { getRoot, parseGitVersion } from "./ioc.js"; import { initServer } from "./server/index.js"; import { createHeartbeatClientsTask } from "./tasks/heartbeatClients.js"; import { createHeartbeatSourcesTask } from "./tasks/heartbeatSources.js"; @@ -75,6 +75,8 @@ const configDir = process.env.CONFIG_DIR || path.resolve(projectDir, `./config`) process.env.DEBUG_MODE = b.toString(); } + await parseGitVersion(initLogger); + const [aLogger, appLoggerStream] = await appLogger(logging) logger = childLogger(aLogger, 'App'); diff --git a/src/backend/ioc.ts b/src/backend/ioc.ts index 3b33bd65..a834a858 100644 --- a/src/backend/ioc.ts +++ b/src/backend/ioc.ts @@ -1,6 +1,7 @@ import { Logger } from "@foxxmd/logging"; import { EventEmitter } from "events"; import fs from 'fs'; +import git, { Commit } from "git-last-commit"; import { createContainer } from "iti"; import path from "path"; import { projectDir } from "./common/index.js"; @@ -10,25 +11,31 @@ import ScrobbleClients from "./scrobblers/ScrobbleClients.js"; import ScrobbleSources from "./sources/ScrobbleSources.js"; import { generateBaseURL } from "./utils.js"; -let version = 'Unknown'; +let version: string; +let packageVersion: string | undefined = undefined; +let envVersion: string | undefined = process.env.APP_VERSION; +if(envVersion !== undefined && envVersion.trim() === '') { + envVersion = undefined; +} +let gitVersion: string | undefined = undefined; -if(process.env.APP_VERSION === undefined) { - if(fs.existsSync('./package.json')) { +try { + if (fs.existsSync('./package.json')) { try { const pkg = fs.readFileSync('./package.json') as unknown as string; try { - version = JSON.parse(pkg).version || 'unknown' + packageVersion = JSON.parse(pkg).version || 'unknown' } catch (e) { // don't care } } catch (e) { // don't care } - } else if(fs.existsSync('./package-lock.json')) { + } else if (fs.existsSync('./package-lock.json')) { try { const pkg = fs.readFileSync('./package-lock.json') as unknown as string; try { - version = JSON.parse(pkg).version || 'unknown' + packageVersion = JSON.parse(pkg).version || 'unknown' } catch (e) { // don't care } @@ -36,9 +43,38 @@ if(process.env.APP_VERSION === undefined) { // don't care } } - process.env.APP_VERSION = version; -} else { - version = process.env.APP_VERSION; +} catch (e) { + // swallow! +} + +export const parseGitVersion = async (logger?: Logger): Promise<[Commit, string] | undefined> => { + try { + const gitInfo = await new Promise((resolve, reject) => { + git.getLastCommit((err, commit) => { + if(err) { + reject(err); + } + // read commit object properties + resolve(commit); + }); + }) as Commit; + const parts = []; + if(gitInfo.tags.length > 0) { + parts.push(gitInfo.tags[0]); + } else { + if(gitInfo.branch !== undefined) { + parts.push(gitInfo.branch); + } + parts.push(gitInfo.shortHash); + } + gitVersion = parts.join('-'); + return [gitInfo, gitVersion]; + } catch (e) { + if(process.env.DEBUG_MODE === "true") { + logger.debug(new Error('Could not get git info, continuing...', {cause: e})); + } + return undefined; + } } let root: ReturnType; @@ -61,6 +97,17 @@ const createRoot = (options?: RootOptions) => { if(disableWeb === undefined) { disableWeb = process.env.DISABLE_WEB === 'true'; } + + if(envVersion !== undefined) { + version = envVersion; + } else if(gitVersion !== undefined) { + version = gitVersion; + } else if(packageVersion !== undefined) { + version = packageVersion; + } else { + version = 'Unknown'; + } + return createContainer().add({ version, configDir: configDir, -- 2.51.2