cangku/frontend/scripts/write-build-version.mjs

85 lines
2.5 KiB
JavaScript

import { execSync } from 'node:child_process';
import { mkdir, writeFile } from 'node:fs/promises';
import path from 'node:path';
import process from 'node:process';
const rootDir = path.resolve(process.cwd());
const publicDir = path.join(rootDir, 'public');
const generatedDir = path.join(rootDir, 'src', 'generated');
const publicVersionPath = path.join(publicDir, '__build_version__.json');
const moduleVersionPath = path.join(generatedDir, 'buildVersion.js');
function readGitShortSha() {
try {
return execSync('git rev-parse --short HEAD', {
cwd: rootDir,
stdio: ['ignore', 'pipe', 'ignore'],
encoding: 'utf8',
}).trim();
} catch {
return 'unknown';
}
}
function readGitFullSha() {
try {
return execSync('git rev-parse HEAD', {
cwd: rootDir,
stdio: ['ignore', 'pipe', 'ignore'],
encoding: 'utf8',
}).trim();
} catch {
return 'unknown';
}
}
function readEnvText(name) {
const value = String(process.env[name] || '').trim();
return value || '';
}
function createBuildVersion() {
const now = new Date();
const iso = now.toISOString();
const compact = iso.replace(/[-:TZ.]/g, '').slice(0, 14);
const buildHostGitSha = readGitShortSha();
const buildHostGitFullSha = readGitFullSha();
const sourceGitSha = readEnvText('SOURCE_GIT_SHA') || buildHostGitSha;
const sourceGitFullSha = readEnvText('SOURCE_GIT_FULL_SHA') || buildHostGitFullSha;
const sourceGitRef = readEnvText('SOURCE_GIT_REF');
const sourceMetadataMode = sourceGitSha === buildHostGitSha ? 'git' : 'env';
return {
version: `${compact}-${sourceGitSha}`,
builtAt: iso,
gitSha: sourceGitSha,
sourceGitSha,
sourceGitFullSha,
sourceGitRef,
buildHostGitSha,
buildHostGitFullSha,
sourceMetadataMode,
};
}
async function main() {
const payload = createBuildVersion();
const jsonContent = `${JSON.stringify(payload, null, 2)}\n`;
const moduleContent = [
`export const BUILD_VERSION = ${JSON.stringify(payload.version)};`,
`export const BUILD_METADATA = ${JSON.stringify(payload, null, 2)};`,
'',
].join('\n');
await mkdir(publicDir, { recursive: true });
await mkdir(generatedDir, { recursive: true });
await writeFile(publicVersionPath, jsonContent, 'utf8');
await writeFile(moduleVersionPath, moduleContent, 'utf8');
process.stdout.write(`Wrote build version ${payload.version}\n`);
}
main().catch((error) => {
process.stderr.write(`${error.message}\n`);
process.exitCode = 1;
});