From 212a32648fe70e9f8088d8145736a0e31e6ba0b3 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 29 Apr 2026 00:52:43 +0100 Subject: [PATCH] fix(ci): speed up tarball checks and avoid CLI bootstrap --- scripts/check-openclaw-package-tarball.mjs | 31 +++++++++++++++----- src/gateway/gateway-cli-backend.live.test.ts | 5 +--- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/scripts/check-openclaw-package-tarball.mjs b/scripts/check-openclaw-package-tarball.mjs index b40c5e43864..f383203840b 100644 --- a/scripts/check-openclaw-package-tarball.mjs +++ b/scripts/check-openclaw-package-tarball.mjs @@ -4,6 +4,8 @@ // prebuilt package artifact with dist inventory, not a source checkout. import { spawnSync } from "node:child_process"; import fs from "node:fs"; +import os from "node:os"; +import path from "node:path"; import { LOCAL_BUILD_METADATA_DIST_PATHS } from "./lib/local-build-metadata-paths.mjs"; import { collectPackageDistImportErrors } from "./lib/package-dist-imports.mjs"; @@ -32,6 +34,20 @@ if (list.status !== 0) { fail(`tar -tf failed for ${tarball}: ${list.stderr || list.status}`); } +const extractDir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-package-tarball-")); +try { + const extract = spawnSync("tar", ["-xf", tarball, "-C", extractDir], { + encoding: "utf8", + stdio: ["ignore", "pipe", "pipe"], + }); + if (extract.status !== 0) { + fail(`tar -xf failed for ${tarball}: ${extract.stderr || extract.status}`); + } +} catch (error) { + fs.rmSync(extractDir, { recursive: true, force: true }); + throw error; +} + const entries = list.stdout .split(/\r?\n/u) .map((entry) => entry.trim()) @@ -107,14 +123,13 @@ function isLegacyLocalBuildMetadataCompatVersion(version) { } function readTarEntry(entryPath) { - const candidates = [entryPath, `package/${entryPath}`]; + const candidates = [ + path.join(extractDir, entryPath), + path.join(extractDir, "package", entryPath), + ]; for (const candidate of candidates) { - const result = spawnSync("tar", ["-xOf", tarball, candidate], { - encoding: "utf8", - stdio: ["ignore", "pipe", "pipe"], - }); - if (result.status === 0) { - return result.stdout; + if (fs.existsSync(candidate)) { + return fs.readFileSync(candidate, "utf8"); } } return ""; @@ -204,10 +219,12 @@ errors.push( ); if (errors.length > 0) { + fs.rmSync(extractDir, { recursive: true, force: true }); fail(`OpenClaw package tarball integrity failed:\n${errors.join("\n")}`); } for (const warning of warnings) { console.warn(`OpenClaw package tarball integrity warning: ${warning}`); } +fs.rmSync(extractDir, { recursive: true, force: true }); console.log("OpenClaw package tarball integrity passed."); diff --git a/src/gateway/gateway-cli-backend.live.test.ts b/src/gateway/gateway-cli-backend.live.test.ts index 1d3aaf23221..c90bd9c7a28 100644 --- a/src/gateway/gateway-cli-backend.live.test.ts +++ b/src/gateway/gateway-cli-backend.live.test.ts @@ -237,10 +237,7 @@ describeLive("gateway live (cli backend)", () => { : undefined; process.env.OPENCLAW_STATE_DIR = stateDir; const bundleMcp = backendResolved?.bundleMcp === true; - const bootstrapWorkspace = - backendResolved?.bundleMcpMode === "claude-config-file" - ? await createBootstrapWorkspace(tempDir) - : null; + const bootstrapWorkspace = await createBootstrapWorkspace(tempDir); const disableMcpConfig = process.env.OPENCLAW_LIVE_CLI_BACKEND_DISABLE_MCP_CONFIG !== "0"; let cliArgs = baseCliArgs; if (