70 lines
2.6 KiB
JavaScript
70 lines
2.6 KiB
JavaScript
const unknownValue = "unknown";
|
|
|
|
export function normalizeIsoTimestamp(value) {
|
|
const source = String(value ?? "").trim();
|
|
if (!source) return null;
|
|
if (/^\d+$/u.test(source)) {
|
|
const seconds = Number.parseInt(source, 10);
|
|
if (Number.isSafeInteger(seconds)) {
|
|
const date = new Date(seconds * 1000);
|
|
if (Number.isFinite(date.getTime())) return date.toISOString();
|
|
}
|
|
}
|
|
const date = new Date(source);
|
|
return Number.isFinite(date.getTime()) ? date.toISOString() : null;
|
|
}
|
|
|
|
export function imageTagFromReference(imageReference) {
|
|
const source = String(imageReference ?? "").trim();
|
|
const slashIndex = source.lastIndexOf("/");
|
|
const colonIndex = source.lastIndexOf(":");
|
|
if (colonIndex <= slashIndex) return null;
|
|
return source.slice(colonIndex + 1) || null;
|
|
}
|
|
|
|
export function shortRevision(value) {
|
|
const source = String(value ?? "").trim();
|
|
return source.length >= 7 ? source.slice(0, 7) : source || unknownValue;
|
|
}
|
|
|
|
export function buildMetadataFromEnv(env = process.env, { serviceId = "hwlab-unknown", fallbackImageRepository = null } = {}) {
|
|
const commitId = firstNonEmpty(env.HWLAB_COMMIT_ID, env.HWLAB_GIT_SHA, env.GIT_COMMIT) ?? unknownValue;
|
|
const revision = firstNonEmpty(env.HWLAB_REVISION, commitId) ?? unknownValue;
|
|
const fallbackRepository = fallbackImageRepository ?? `ghcr.io/pikastech/${serviceId}`;
|
|
const imageReference = firstNonEmpty(env.HWLAB_IMAGE, `${fallbackRepository}:${shortRevision(commitId)}`) ?? unknownValue;
|
|
const imageTag = firstNonEmpty(env.HWLAB_IMAGE_TAG, imageTagFromReference(imageReference), shortRevision(commitId)) ?? unknownValue;
|
|
const buildCreatedAt = normalizeIsoTimestamp(
|
|
firstNonEmpty(env.HWLAB_BUILD_CREATED_AT, env.HWLAB_IMAGE_CREATED_AT, env.SOURCE_DATE_EPOCH, env.BUILD_DATE)
|
|
);
|
|
const buildSource = firstNonEmpty(env.HWLAB_BUILD_SOURCE, "runtime-env") ?? "runtime-env";
|
|
|
|
return {
|
|
revision,
|
|
commit: {
|
|
id: commitId,
|
|
source: buildSource
|
|
},
|
|
image: {
|
|
reference: imageReference,
|
|
tag: imageTag,
|
|
digest: firstNonEmpty(env.HWLAB_IMAGE_DIGEST, unknownValue) ?? unknownValue
|
|
},
|
|
build: {
|
|
createdAt: buildCreatedAt,
|
|
source: buildSource,
|
|
provenance: firstNonEmpty(env.HWLAB_BUILD_PROVENANCE, null),
|
|
metadataSource: buildCreatedAt ? "runtime-env:HWLAB_BUILD_CREATED_AT" : "unavailable",
|
|
unavailableReason: buildCreatedAt ? null : "HWLAB_BUILD_CREATED_AT missing from runtime environment"
|
|
}
|
|
};
|
|
}
|
|
|
|
function firstNonEmpty(...values) {
|
|
for (const value of values) {
|
|
if (value === null || value === undefined) continue;
|
|
const text = String(value).trim();
|
|
if (text) return text;
|
|
}
|
|
return null;
|
|
}
|