Implemented about page.
All checks were successful
farmcontrol/farmcontrol-api/pipeline/head This commit looks good
All checks were successful
farmcontrol/farmcontrol-api/pipeline/head This commit looks good
This commit is contained in:
parent
afce36b30a
commit
645a1b6220
3
.gitignore
vendored
3
.gitignore
vendored
@ -142,3 +142,6 @@ gcodefiles/*
|
|||||||
gcodefiles
|
gcodefiles
|
||||||
|
|
||||||
test-results.xml
|
test-results.xml
|
||||||
|
|
||||||
|
# Jenkins generated build metadata
|
||||||
|
src/buildInfo.json
|
||||||
|
|||||||
10
Jenkinsfile
vendored
10
Jenkinsfile
vendored
@ -23,6 +23,16 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stage('Write Build Metadata') {
|
||||||
|
steps {
|
||||||
|
nodejs(nodeJSInstallationName: 'Node23') {
|
||||||
|
sh '''
|
||||||
|
node -e "const fs = require('fs'); fs.writeFileSync('src/buildInfo.json', JSON.stringify({ buildNumber: process.env.BUILD_NUMBER || 'dev' }, null, 2) + '\\n');"
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
stage('Install Dependencies') {
|
stage('Install Dependencies') {
|
||||||
steps {
|
steps {
|
||||||
nodejs(nodeJSInstallationName: 'Node23') {
|
nodejs(nodeJSInstallationName: 'Node23') {
|
||||||
|
|||||||
@ -60,6 +60,7 @@ import {
|
|||||||
csvRoutes,
|
csvRoutes,
|
||||||
appLaunchRoutes,
|
appLaunchRoutes,
|
||||||
appUpdateRoutes,
|
appUpdateRoutes,
|
||||||
|
serverRoutes,
|
||||||
} from './routes/index.js';
|
} from './routes/index.js';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
@ -187,6 +188,7 @@ app.use('/excel', excelRoutes);
|
|||||||
app.use('/csv', csvRoutes);
|
app.use('/csv', csvRoutes);
|
||||||
app.use('/applaunch', appLaunchRoutes);
|
app.use('/applaunch', appLaunchRoutes);
|
||||||
app.use('/appupdate', appUpdateRoutes);
|
app.use('/appupdate', appUpdateRoutes);
|
||||||
|
app.use('/server', serverRoutes);
|
||||||
|
|
||||||
// Start the application
|
// Start the application
|
||||||
if (process.env.NODE_ENV !== 'test') {
|
if (process.env.NODE_ENV !== 'test') {
|
||||||
|
|||||||
@ -53,6 +53,7 @@ import excelRoutes from './misc/excel.js';
|
|||||||
import csvRoutes from './misc/csv.js';
|
import csvRoutes from './misc/csv.js';
|
||||||
import appLaunchRoutes from './misc/applaunch.js';
|
import appLaunchRoutes from './misc/applaunch.js';
|
||||||
import appUpdateRoutes from './misc/appupdate.js';
|
import appUpdateRoutes from './misc/appupdate.js';
|
||||||
|
import serverRoutes from './misc/server.js';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
userRoutes,
|
userRoutes,
|
||||||
@ -110,4 +111,5 @@ export {
|
|||||||
csvRoutes,
|
csvRoutes,
|
||||||
appLaunchRoutes,
|
appLaunchRoutes,
|
||||||
appUpdateRoutes,
|
appUpdateRoutes,
|
||||||
|
serverRoutes,
|
||||||
};
|
};
|
||||||
|
|||||||
9
src/routes/misc/server.js
Normal file
9
src/routes/misc/server.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import express from 'express';
|
||||||
|
import { isAuthenticated } from '../../keycloak.js';
|
||||||
|
import { serverVersionRouteHandler } from '../../services/misc/server.js';
|
||||||
|
|
||||||
|
const router = express.Router();
|
||||||
|
|
||||||
|
router.get('/version', isAuthenticated, serverVersionRouteHandler);
|
||||||
|
|
||||||
|
export default router;
|
||||||
@ -19,7 +19,7 @@ const buildApiUrl = (baseUrl, query = '') => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const getBranchBuildApiUrl = (branchUrl, buildType = 'lastSuccessfulBuild') =>
|
const getBranchBuildApiUrl = (branchUrl, buildType = 'lastSuccessfulBuild') =>
|
||||||
`${normalizeProjectUrl(branchUrl)}/${buildType}/api/json?tree=number,url,result,timestamp,artifacts[fileName,relativePath]`;
|
`${normalizeProjectUrl(branchUrl)}/${buildType}/api/json?tree=number,url,result,displayName,timestamp,artifacts[fileName,relativePath]`;
|
||||||
|
|
||||||
const mapArtifacts = (build, requestedBranch) => {
|
const mapArtifacts = (build, requestedBranch) => {
|
||||||
const buildUrl = normalizeProjectUrl(build?.url);
|
const buildUrl = normalizeProjectUrl(build?.url);
|
||||||
@ -107,8 +107,10 @@ export const appUpdateCurrentRouteHandler = async (req, res) => {
|
|||||||
return res.send({
|
return res.send({
|
||||||
branch: requestedBranch,
|
branch: requestedBranch,
|
||||||
buildNumber: build.number,
|
buildNumber: build.number,
|
||||||
|
|
||||||
buildUrl: build.url,
|
buildUrl: build.url,
|
||||||
buildResult: build.result,
|
buildResult: build.result,
|
||||||
|
buildName: build.displayName,
|
||||||
buildTimestamp: build.timestamp,
|
buildTimestamp: build.timestamp,
|
||||||
buildSource: source,
|
buildSource: source,
|
||||||
artifacts: mapArtifacts(build, requestedBranch),
|
artifacts: mapArtifacts(build, requestedBranch),
|
||||||
|
|||||||
28
src/services/misc/server.js
Normal file
28
src/services/misc/server.js
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import { readFileSync } from 'node:fs';
|
||||||
|
|
||||||
|
const readJsonFile = (fileUrl) => {
|
||||||
|
try {
|
||||||
|
return JSON.parse(readFileSync(fileUrl, 'utf8'));
|
||||||
|
} catch {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const packageJsonUrl = new URL('../../../package.json', import.meta.url);
|
||||||
|
const buildInfoUrl = new URL('../../buildInfo.json', import.meta.url);
|
||||||
|
|
||||||
|
const getServerVersionInfo = () => {
|
||||||
|
const packageJson = readJsonFile(packageJsonUrl);
|
||||||
|
const buildInfo = readJsonFile(buildInfoUrl);
|
||||||
|
|
||||||
|
return {
|
||||||
|
version: packageJson.version ?? 'dev',
|
||||||
|
buildNumber: buildInfo.buildNumber ?? 'dev',
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export const serverVersionRouteHandler = (req, res) => {
|
||||||
|
res.json({
|
||||||
|
...getServerVersionInfo(),
|
||||||
|
});
|
||||||
|
};
|
||||||
Loading…
x
Reference in New Issue
Block a user