Files
openclaw/scripts/lib/docker-release-policy.mjs
T
Dallin Romney ec500af40a fix(release): isolate extended-stable Docker aliases (#112822)
* fix(release): isolate extended-stable Docker aliases

(cherry picked from commit db9915fedb)

# Conflicts:
#	.agents/skills/release-openclaw-maintainer/SKILL.md
#	.agents/skills/release-openclaw-maintainer/references/extended-stable-backports.md
#	.github/workflows/docker-release.yml
#	docs/docs_map.md
#	docs/install/docker.md
#	docs/reference/RELEASING.md

* fix(release): harden Docker channel promotion

(cherry picked from commit 505a6fe922)

* docs(release): pin Docker policy into tagged tree

(cherry picked from commit 3ff98457ba)

# Conflicts:
#	.agents/skills/release-openclaw-maintainer/SKILL.md
#	.agents/skills/release-openclaw-maintainer/references/extended-stable-backports.md
#	docs/reference/RELEASING.md

* refactor(release): isolate Docker channel promotion

(cherry picked from commit 3d02c5c821)

# Conflicts:
#	.agents/skills/release-openclaw-maintainer/SKILL.md
#	docs/reference/RELEASING.md

* fix(release): queue Docker publications

(cherry picked from commit b7cb1697ea)

* fix(release): harden docker channel promotion

(cherry picked from commit 7510aa52ce)

# Conflicts:
#	docs/reference/RELEASING.md
#	scripts/lib/npm-publish-plan.d.mts
#	scripts/lib/npm-publish-plan.mjs
#	scripts/openclaw-npm-postpublish-verify.ts

* fix(release): promote Docker aliases after verification

(cherry picked from commit a13cba1484)

# Conflicts:
#	.agents/skills/release-openclaw-maintainer/SKILL.md
#	docs/reference/RELEASING.md

* fix(release): harden Docker channel promotion

(cherry picked from commit ecc07ba7a3)

# Conflicts:
#	docs/ci.md
#	scripts/verify-docker-attestations.d.mts

* fix(release): adapt Docker promotion to maintenance policy helpers
2026-07-22 18:19:35 -07:00

81 lines
2.6 KiB
JavaScript

import { isDirectRunUrl } from "./direct-run.mjs";
import { classifyReleaseTrain, parseReleaseVersion } from "./npm-publish-plan.mjs";
const STABLE_ALIASES = Object.freeze({
default: Object.freeze(["latest", "main"]),
slim: Object.freeze(["slim", "main-slim"]),
browser: Object.freeze(["latest-browser", "main-browser"]),
});
const EXTENDED_STABLE_ALIASES = Object.freeze({
default: Object.freeze(["extended-stable"]),
slim: Object.freeze(["extended-stable-slim"]),
browser: Object.freeze(["extended-stable-browser"]),
});
const NO_MOVING_ALIASES = Object.freeze({
default: Object.freeze([]),
slim: Object.freeze([]),
browser: Object.freeze([]),
});
/**
* @typedef {object} DockerReleasePolicy
* @property {string} version
* @property {"stable" | "extended-stable" | "beta"} channel
* @property {{default: readonly string[], slim: readonly string[], browser: readonly string[]}} movingAliases
*/
/**
* Keep Docker's moving channels aligned with the release-version contract.
* Patch 33+ finals belong to the trailing-month extended-stable line; they
* must never move the regular latest/main aliases.
*
* @param {string} version
* @returns {DockerReleasePolicy}
*/
export function resolveDockerReleasePolicy(version) {
const parsed = parseReleaseVersion(version);
if (parsed === null) {
throw new Error(`Unsupported Docker release version "${version}".`);
}
const releaseTrain = classifyReleaseTrain(parsed);
if (releaseTrain === "alpha") {
throw new Error("Docker alpha image publishing is disabled.");
}
if (releaseTrain === "beta") {
return { version: parsed.version, channel: "beta", movingAliases: NO_MOVING_ALIASES };
}
if (releaseTrain === "extended-stable") {
return {
version: parsed.version,
channel: "extended-stable",
movingAliases: EXTENDED_STABLE_ALIASES,
};
}
if (releaseTrain === "unsupported-extended-stable-correction") {
throw new Error(
`Extended-stable Docker publication requires a final YYYY.M.PATCH version; found "${version}".`,
);
}
return { version: parsed.version, channel: "stable", movingAliases: STABLE_ALIASES };
}
function main() {
const version = process.argv[2]?.trim();
if (!version) {
throw new Error("Usage: node scripts/lib/docker-release-policy.mjs <version>");
}
process.stdout.write(`${JSON.stringify(resolveDockerReleasePolicy(version))}\n`);
}
if (isDirectRunUrl(process.argv[1], import.meta.url)) {
try {
main();
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
console.error(`docker-release-policy: ${message}`);
process.exitCode = 1;
}
}