diff --git a/scripts/gitops-render.mjs b/scripts/gitops-render.mjs index 5a4d5532..e4f7ffeb 100644 --- a/scripts/gitops-render.mjs +++ b/scripts/gitops-render.mjs @@ -3920,6 +3920,7 @@ function devopsInfraGitMirrorManifest(args, deploy) { const mirrorBranchesJson = JSON.stringify(mirrorBranches); const sourceBranchesJson = JSON.stringify(sourceBranches); const gitopsBranchesJson = JSON.stringify(gitopsBranches); + const sourceSnapshotRefPrefix = "refs/unidesk/snapshots/hwlab-node-runtime"; const laneConfig = configObject(configObject(deploy.lanes, "deploy.lanes")[args.lane], `deploy.lanes.${args.lane}`); const gitMirrorConfig = configObject(laneConfig.gitMirror, `deploy.lanes.${args.lane}.gitMirror`); const gitMirrorProxy = configObject(gitMirrorConfig.egressProxy, `deploy.lanes.${args.lane}.gitMirror.egressProxy`); @@ -4058,6 +4059,7 @@ unset GIT_SSH_COMMAND`; set -eu repo_url="ssh://git@ssh.github.com:443/pikasTech/HWLAB.git" repo_path="/cache/pikasTech/HWLAB.git" +source_snapshot_ref_prefix=${shellSingleQuote(sourceSnapshotRefPrefix)} lock_dir="/cache/.hwlab-sync.lock" sync_started_ms=$(node -e 'console.log(Date.now())') now_ms() { node -e 'console.log(Date.now())'; } @@ -4139,6 +4141,13 @@ while read -r sha ref; do fi git -C "$repo_path" update-ref "refs/heads/$name" "$sha" done < /tmp/hwlab-stage-heads +for source_branch in ${sourceBranchArgs}; do + source_sha=$(git -C "$repo_path" show-ref --verify --hash "refs/heads/$source_branch" 2>/dev/null || true) + if [ -n "$source_sha" ]; then + source_stage_ref="\${source_snapshot_ref_prefix%/}/$source_branch/$source_sha" + git -C "$repo_path" update-ref "$source_stage_ref" "$source_sha" + fi +done while read -r sha ref; do [ -n "$sha" ] || continue name=$(printf '%s\n' "$ref" | sed 's#^refs/mirror-stage/tags/##') @@ -4177,6 +4186,7 @@ for source_branch in ${sourceBranchArgs}; do done printf '%s\n' "$published_at" > /cache/HWLAB.last-sync export published_at +export source_snapshot_ref_prefix export mirror_branches_json=${shellSingleQuote(mirrorBranchesJson)} export source_branches_json=${shellSingleQuote(sourceBranchesJson)} export gitops_branches_json=${shellSingleQuote(gitopsBranchesJson)} @@ -4186,6 +4196,7 @@ const repo = "/cache/pikasTech/HWLAB.git"; const mirrorBranches = JSON.parse(process.env.mirror_branches_json || "[]"); const sourceBranches = JSON.parse(process.env.source_branches_json || "[]"); const gitopsBranches = JSON.parse(process.env.gitops_branches_json || "[]"); +const sourceSnapshotRefPrefix = (process.env.source_snapshot_ref_prefix || "refs/unidesk/snapshots/hwlab-node-runtime").replace(/\/+$/u, ""); function rev(ref) { try { return execFileSync("git", ["-C", repo, "rev-parse", ref], { encoding: "utf8" }).trim() || null; } catch { return null; } } @@ -4194,7 +4205,15 @@ for (const branch of mirrorBranches) { refs["refs/heads/" + branch] = rev("refs/heads/" + branch); refs["refs/mirror-stage/heads/" + branch] = rev("refs/mirror-stage/heads/" + branch); } -const sourceInSync = sourceBranches.every((branch) => refs["refs/heads/" + branch] && refs["refs/heads/" + branch] === refs["refs/mirror-stage/heads/" + branch]); +const sourceSnapshots = {}; +for (const branch of sourceBranches) { + const source = refs["refs/heads/" + branch] || null; + const stageRef = source ? sourceSnapshotRefPrefix + "/" + branch + "/" + source : null; + const sourceSnapshot = stageRef ? rev(stageRef) : null; + if (stageRef) refs[stageRef] = sourceSnapshot; + sourceSnapshots[branch] = { stageRef, sourceSnapshot }; +} +const sourceInSync = sourceBranches.every((branch) => refs["refs/heads/" + branch] && refs["refs/heads/" + branch] === refs["refs/mirror-stage/heads/" + branch] && sourceSnapshots[branch]?.sourceSnapshot === refs["refs/mirror-stage/heads/" + branch]); const gitopsInSync = gitopsBranches.every((branch) => refs["refs/heads/" + branch] && refs["refs/heads/" + branch] === refs["refs/mirror-stage/heads/" + branch]); const pendingFlush = gitopsBranches.some((branch) => refs["refs/heads/" + branch] && refs["refs/mirror-stage/heads/" + branch] && refs["refs/heads/" + branch] !== refs["refs/mirror-stage/heads/" + branch]); const payload = { @@ -4205,6 +4224,7 @@ const payload = { pendingFlush, sourceInSync, gitopsInSync, + sourceSnapshots, refs }; console.log(JSON.stringify(payload)); diff --git a/scripts/gitops-render.test.ts b/scripts/gitops-render.test.ts index ea055309..36837031 100644 --- a/scripts/gitops-render.test.ts +++ b/scripts/gitops-render.test.ts @@ -277,10 +277,15 @@ test("v02 render follows TypeScript runtime checks and does not self-patch boots assert.doesNotMatch(gitMirrorScript, /refs\/heads\/G14-gitops:refs\/mirror-stage\/heads\/G14-gitops/u); assert.doesNotMatch(gitMirrorScript, /refs\/heads\/\*:refs\/mirror-stage\/heads\/\*/u); assert.match(gitMirrorScript, /git -C "\$repo_path" update-ref "refs\/heads\/\$name" "\$sha"/u); + assert.match(gitMirrorScript, /source_snapshot_ref_prefix='refs\/unidesk\/snapshots\/hwlab-node-runtime'/u); + assert.match(gitMirrorScript, /source_stage_ref="\$\{source_snapshot_ref_prefix%\/\}\/\$source_branch\/\$source_sha"/u); + assert.match(gitMirrorScript, /git -C "\$repo_path" update-ref "\$source_stage_ref" "\$source_sha"/u); assert.match(gitMirrorScript, /git-mirror-sync-timing/u); assert.match(gitMirrorScript, /emit_timing fetch succeeded/u); assert.match(gitMirrorScript, /emit_timing total succeeded/u); assert.match(gitMirrorScript, /sourceInSync/u); + assert.match(gitMirrorScript, /sourceSnapshots/u); + assert.match(gitMirrorScript, /refs\/unidesk\/snapshots\/hwlab-node-runtime/u); assert.match(gitMirrorScript, /refs\/mirror-stage\/heads\/v0\.2/u); assert.match(gitMirrorScript, /refs\/mirror-stage\/heads\/v0\.3/u); assert.match(gitMirrorScript, /for gitops_branch in 'v0\.2-gitops' 'v0\.3-gitops'/u);