feat: normalize deployment inventory evidence

This commit is contained in:
NuklearRabbit
2026-07-29 17:39:22 +02:00
parent 6b93391a9b
commit 5d3731a853
13 changed files with 433 additions and 45 deletions
+35
View File
@@ -0,0 +1,35 @@
"use strict";
const crypto = require("node:crypto");
const { normalizeRemoteUrl } = require("../shared/repository-match.cjs");
function canonicalRemote(value) {
const normalized = normalizeRemoteUrl(value);
return normalized ? `${normalized.host}/${normalized.path}`.toLowerCase() : "";
}
function deploymentIdentity({ workload, profile = null, repository = null }) {
const remote = canonicalRemote(workload?.metadata?.sourceRepository || repository?.sshUrl || repository?.cloneUrl || profile?.cloneUrl);
return {
repository: remote || String(workload?.link?.repositoryFullName || repository?.fullName || profile?._repositoryFullName || "").toLowerCase(),
branch: String(workload?.metadata?.branch || profile?.branch || repository?.defaultBranch || "").toLowerCase(),
serverId: String(workload?.serverId || profile?.serverId || ""),
environment: String(profile?.environment || "production").toLowerCase(),
composeProject: String(workload?.compose?.project || profile?.composeProject || "").toLowerCase(),
deploymentRoot: String(workload?.compose?.workingDir || profile?.composeWorkingDir || workload?.remoteFolderCandidate || profile?.remoteFolder || "").replace(/\\/g, "/").replace(/\/+$/, "").toLowerCase(),
containers: (workload?.containers || []).map((item) => String(item.id || item.name || "").toLowerCase()).sort(),
liveSha: String(workload?.metadata?.liveRevision || "").toLowerCase(),
profileId: String(profile?.id || workload?.link?.profileId || ""),
};
}
function evidenceHash(identity, evidence = {}) {
const stable = (value) => Array.isArray(value) ? value.map(stable) : value && typeof value === "object" ? Object.fromEntries(Object.keys(value).sort().map((key) => [key, stable(value[key])])) : value;
return crypto.createHash("sha256").update(JSON.stringify(stable({ identity, evidence }))).digest("hex");
}
function authorityKey(identity) {
return [identity.repository, identity.serverId, identity.environment].join("|");
}
module.exports = { canonicalDeploymentRemote: canonicalRemote, deploymentIdentity, deploymentEvidenceHash: evidenceHash, deploymentAuthorityKey: authorityKey };