fix(ci): harden cross-os release harness

This commit is contained in:
Peter Steinberger
2026-04-28 22:12:27 +01:00
parent 7b2b0d07e8
commit 25f7e062e1
3 changed files with 121 additions and 2 deletions

View File

@@ -4,6 +4,17 @@ set -euo pipefail
tsx_version="${OPENCLAW_RELEASE_TSX_VERSION:-${TSX_VERSION:-4.21.0}}"
script_path="${OPENCLAW_RELEASE_CHECKS_SCRIPT:-workflow/scripts/openclaw-cross-os-release-checks.ts}"
if ! command -v node >/dev/null 2>&1 || ! command -v npm >/dev/null 2>&1; then
if command -v cygpath >/dev/null 2>&1; then
for node_dir in /c/hostedtoolcache/windows/node/*/x64 /c/actions-runner/_work/_tool/node/*/x64; do
if [[ -x "${node_dir}/node.exe" ]]; then
export PATH="${node_dir}:${PATH}"
break
fi
done
fi
fi
temp_root="${OPENCLAW_RELEASE_TSX_TOOL_ROOT:-${RUNNER_TEMP:-${TMPDIR:-/tmp}}}"
if command -v cygpath >/dev/null 2>&1; then
temp_root="$(cygpath -u "${temp_root}")"
@@ -12,6 +23,15 @@ fi
tool_dir="${OPENCLAW_RELEASE_TSX_TOOL_DIR:-${temp_root}/openclaw-release-tsx-${tsx_version}}"
loader_path="${tool_dir}/node_modules/tsx/dist/loader.mjs"
command -v node >/dev/null 2>&1 || {
echo "node is required to run cross-OS release checks." >&2
exit 127
}
command -v npm >/dev/null 2>&1 || {
echo "npm is required to install the cross-OS release-check loader." >&2
exit 127
}
if [[ ! -f "${loader_path}" ]]; then
mkdir -p "${tool_dir}"
npm install --prefix "${tool_dir}" --no-save --no-package-lock "tsx@${tsx_version}" >/dev/null

View File

@@ -692,18 +692,22 @@ async function runUpgradeLane(params) {
"--timeout",
String(updateStepTimeoutSeconds()),
];
await runOpenClaw({
const updateResult = await runOpenClaw({
lane,
env: updateEnv,
args: updateArgs,
logPath: join(params.logsDir, "upgrade-update.log"),
timeoutMs: updateTimeoutMs(),
check: false,
});
verifyPackagedUpgradeUpdateResult(updateResult, {
candidateVersion: params.build.candidateVersion,
});
logLanePhase(lane, "update-status");
await runOpenClaw({
lane,
env,
env: updateEnv,
args: ["update", "status", "--json"],
logPath: join(params.logsDir, "upgrade-update-status.log"),
timeoutMs: 2 * 60 * 1000,
@@ -1228,6 +1232,46 @@ export function buildRealUpdateEnv(env) {
return updateEnv;
}
export function verifyPackagedUpgradeUpdateResult(result, options) {
if (result.exitCode === 0) {
return;
}
let payload = null;
try {
payload = JSON.parse(result.stdout);
} catch {
payload = null;
}
const steps = Array.isArray(payload?.steps) ? payload.steps : [];
const allStepsSucceeded = steps.every((step) => step?.exitCode === 0);
const afterVersion = typeof payload?.after?.version === "string" ? payload.after.version : "";
if (
payload?.status === "ok" &&
afterVersion === options.candidateVersion &&
allStepsSucceeded &&
isSelfSwappedPackageProcessExit(result.stderr)
) {
return;
}
throw new Error(
`Packaged upgrade failed (${result.exitCode}): ${trimForSummary(
`${result.stdout}\n${result.stderr}`,
)}`,
);
}
function isSelfSwappedPackageProcessExit(stderr) {
return (
typeof stderr === "string" &&
stderr.includes("[openclaw] Failed to start CLI:") &&
stderr.includes("ERR_MODULE_NOT_FOUND") &&
/[\\/]node_modules[\\/]openclaw[\\/]dist[\\/]/u.test(stderr)
);
}
export function resolveExplicitBaselineVersion(baselineSpec) {
const trimmed = baselineSpec.trim();
if (!trimmed || trimmed === "openclaw@latest") {