85 lines
2.5 KiB
JavaScript
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;
|
|
});
|