mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 10:00:42 +00:00
fix(ci): harden cross-os release harness
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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") {
|
||||
|
||||
Reference in New Issue
Block a user