ci: time-box package acceptance legacy compat

This commit is contained in:
Peter Steinberger
2026-04-27 07:11:11 +01:00
parent e6d2c9b080
commit 44a504cd39
10 changed files with 256 additions and 16 deletions

View File

@@ -10,15 +10,13 @@ function withTarball(
inventory: string[],
files: Record<string, string>,
testBody: (tarball: string) => void,
version = "0.0.0",
) {
const root = mkdtempSync(join(tmpdir(), "openclaw-package-tarball-test-"));
try {
const packageRoot = join(root, "package");
mkdirSync(join(packageRoot, "dist"), { recursive: true });
writeFileSync(
join(packageRoot, "package.json"),
JSON.stringify({ name: "openclaw", version: "0.0.0" }),
);
writeFileSync(join(packageRoot, "package.json"), JSON.stringify({ name: "openclaw", version }));
writeFileSync(
join(packageRoot, "dist", "postinstall-inventory.json"),
JSON.stringify(inventory),
@@ -41,7 +39,7 @@ function withTarball(
}
describe("check-openclaw-package-tarball", () => {
it("allows legacy private QA inventory entries omitted from shipped tarballs", () => {
it("allows legacy private QA inventory entries omitted from shipped tarballs through 2026.4.25", () => {
withTarball(
["dist/index.js", "dist/extensions/qa-channel/runtime-api.js"],
{ "dist/index.js": "export {};\n" },
@@ -52,6 +50,24 @@ describe("check-openclaw-package-tarball", () => {
expect(result.stderr).toContain("legacy inventory references omitted private QA");
expect(result.stdout).toContain("OpenClaw package tarball integrity passed.");
},
"2026.4.25-beta.10",
);
});
it("rejects legacy private QA inventory omissions for newer packages", () => {
withTarball(
["dist/index.js", "dist/extensions/qa-channel/runtime-api.js"],
{ "dist/index.js": "export {};\n" },
(tarball) => {
const result = spawnSync("node", [CHECK_SCRIPT, tarball], { encoding: "utf8" });
expect(result.status).not.toBe(0);
expect(result.stderr).toContain(
"inventory references missing tar entry dist/extensions/qa-channel/runtime-api.js",
);
expect(result.stderr).not.toContain("legacy inventory references omitted private QA");
},
"2026.4.26",
);
});

View File

@@ -8,6 +8,8 @@ const INSTALL_E2E_RUNNER_PATH = "scripts/docker/install-sh-e2e/run.sh";
const OPENAI_WEB_SEARCH_MINIMAL_E2E_PATH = "scripts/e2e/openai-web-search-minimal-docker.sh";
const PLUGINS_DOCKER_E2E_PATH = "scripts/e2e/plugins-docker.sh";
const PLUGIN_UPDATE_DOCKER_E2E_PATH = "scripts/e2e/plugin-update-unchanged-docker.sh";
const DOCTOR_SWITCH_DOCKER_E2E_PATH = "scripts/e2e/doctor-install-switch-docker.sh";
const UPDATE_CHANNEL_SWITCH_DOCKER_E2E_PATH = "scripts/e2e/update-channel-switch-docker.sh";
const CENTRALIZED_BUILD_SCRIPTS = [
"scripts/docker/setup.sh",
"scripts/e2e/browser-cdp-snapshot-docker.sh",
@@ -75,10 +77,31 @@ describe("docker build helper", () => {
expect(runner).toContain("plugin install record changed unexpectedly");
expect(runner).toContain("index.installRecords ?? index.records ?? config.plugins?.installs");
expect(runner).not.toContain("Config changed unexpectedly");
expect(runner).toContain("Config changed unexpectedly for modern package");
expect(runner).not.toContain("before_hash");
});
it("caps package acceptance legacy compatibility at 2026.4.25", () => {
const scripts = [
readFileSync(DOCTOR_SWITCH_DOCKER_E2E_PATH, "utf8"),
readFileSync(UPDATE_CHANNEL_SWITCH_DOCKER_E2E_PATH, "utf8"),
readFileSync(PLUGINS_DOCKER_E2E_PATH, "utf8"),
readFileSync(PLUGIN_UPDATE_DOCKER_E2E_PATH, "utf8"),
];
for (const script of scripts) {
expect(script).toContain("2026, 4, 25");
}
expect(scripts.join("\n")).toContain("OPENCLAW_PACKAGE_ACCEPTANCE_LEGACY_COMPAT");
expect(scripts.join("\n")).toContain(
"Package $package_version must support gateway install --wrapper.",
);
expect(scripts.join("\n")).toContain("expected persisted update.channel dev");
expect(scripts.join("\n")).toContain(
"expected modern installRecords in installed plugin index",
);
});
it("passes installer tag env to bash, not curl", () => {
const runner = readFileSync(INSTALL_E2E_RUNNER_PATH, "utf8");