From 9777526eaaec7431ca2091897e608ccd3d681be6 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Tue, 26 May 2026 14:46:03 +0200 Subject: [PATCH] fix(e2e): bound docker npm install phases --- .../e2e/lib/doctor-install-switch/scenario.sh | 4 +-- .../plugin-update/corrupt-update-scenario.sh | 2 +- .../release-upgrade-user-journey/scenario.sh | 5 ++- scripts/e2e/lib/upgrade-survivor/run.sh | 2 +- scripts/e2e/multi-node-update-docker.sh | 3 +- scripts/e2e/update-channel-switch-docker.sh | 8 +++-- test/scripts/docker-build-helper.test.ts | 35 +++++++++++++++++++ 7 files changed, 51 insertions(+), 8 deletions(-) diff --git a/scripts/e2e/lib/doctor-install-switch/scenario.sh b/scripts/e2e/lib/doctor-install-switch/scenario.sh index 1e24abbcbc8..7beb80eec1d 100644 --- a/scripts/e2e/lib/doctor-install-switch/scenario.sh +++ b/scripts/e2e/lib/doctor-install-switch/scenario.sh @@ -24,7 +24,7 @@ mkdir -p "$git_root" tar -xzf "$package_tgz" -C "$git_root" --strip-components=1 ( cd "$git_root" - npm install --omit=optional --no-fund --no-audit >/tmp/openclaw-git-install.log 2>&1 + openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install --omit=optional --no-fund --no-audit >/tmp/openclaw-git-install.log 2>&1 git init -q git config user.email "docker-e2e@openclaw.local" git config user.name "OpenClaw Docker E2E" @@ -32,7 +32,7 @@ tar -xzf "$package_tgz" -C "$git_root" --strip-components=1 git commit -qm "test fixture" ) npm_log="/tmp/openclaw-doctor-switch-npm-install.log" -if ! npm install -g --prefix /tmp/npm-prefix --omit=optional "$package_tgz" >"$npm_log" 2>&1; then +if ! openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install -g --prefix /tmp/npm-prefix --omit=optional "$package_tgz" >"$npm_log" 2>&1; then cat "$npm_log" exit 1 fi diff --git a/scripts/e2e/lib/plugin-update/corrupt-update-scenario.sh b/scripts/e2e/lib/plugin-update/corrupt-update-scenario.sh index 69e59ef1c58..65da11fdaa4 100644 --- a/scripts/e2e/lib/plugin-update/corrupt-update-scenario.sh +++ b/scripts/e2e/lib/plugin-update/corrupt-update-scenario.sh @@ -19,7 +19,7 @@ export OPENCLAW_NO_PROMPT=1 baseline="${OPENCLAW_UPDATE_CORRUPT_PLUGIN_BASELINE:-openclaw@latest}" echo "Installing baseline OpenClaw package: $baseline" -if ! npm install -g --prefix /tmp/npm-prefix --omit=optional "$baseline" >/tmp/openclaw-update-corrupt-baseline-install.log 2>&1; then +if ! openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install -g --prefix /tmp/npm-prefix --omit=optional "$baseline" >/tmp/openclaw-update-corrupt-baseline-install.log 2>&1; then cat /tmp/openclaw-update-corrupt-baseline-install.log >&2 || true exit 1 fi diff --git a/scripts/e2e/lib/release-upgrade-user-journey/scenario.sh b/scripts/e2e/lib/release-upgrade-user-journey/scenario.sh index fbae7ef4daf..eaabfb061d9 100755 --- a/scripts/e2e/lib/release-upgrade-user-journey/scenario.sh +++ b/scripts/e2e/lib/release-upgrade-user-journey/scenario.sh @@ -69,7 +69,10 @@ start_gateway() { } echo "Installing published baseline $BASELINE_SPEC..." -npm install -g "$BASELINE_SPEC" --no-fund --no-audit >/tmp/openclaw-release-upgrade-baseline-install.log 2>&1 +if ! openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install -g "$BASELINE_SPEC" --no-fund --no-audit >/tmp/openclaw-release-upgrade-baseline-install.log 2>&1; then + cat /tmp/openclaw-release-upgrade-baseline-install.log >&2 || true + exit 1 +fi command -v openclaw >/dev/null baseline_root="$(openclaw_e2e_package_root)" baseline_entry="$(openclaw_e2e_package_entrypoint "$baseline_root")" diff --git a/scripts/e2e/lib/upgrade-survivor/run.sh b/scripts/e2e/lib/upgrade-survivor/run.sh index b5ba32be8f8..3a2bb6887e4 100644 --- a/scripts/e2e/lib/upgrade-survivor/run.sh +++ b/scripts/e2e/lib/upgrade-survivor/run.sh @@ -649,7 +649,7 @@ reset_run_state() { install_baseline() { normalize_baseline echo "Installing baseline package: $baseline_spec" - if ! npm install -g --prefix "$npm_config_prefix" "$baseline_spec" --no-fund --no-audit >"$BASELINE_INSTALL_LOG" 2>&1; then + if ! openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install -g --prefix "$npm_config_prefix" "$baseline_spec" --no-fund --no-audit >"$BASELINE_INSTALL_LOG" 2>&1; then echo "baseline npm install failed" >&2 cat "$BASELINE_INSTALL_LOG" >&2 || true return 1 diff --git a/scripts/e2e/multi-node-update-docker.sh b/scripts/e2e/multi-node-update-docker.sh index 5ba15dab29f..f1c75434213 100755 --- a/scripts/e2e/multi-node-update-docker.sh +++ b/scripts/e2e/multi-node-update-docker.sh @@ -55,6 +55,7 @@ docker_e2e_run_with_harness \ "$IMAGE_NAME" \ timeout "$DOCKER_RUN_TIMEOUT" bash -lc ' set -euo pipefail +source scripts/lib/openclaw-e2e-instance.sh ARTIFACTS=/tmp/artifacts exec > >(tee "$ARTIFACTS/run.log") 2>&1 @@ -106,7 +107,7 @@ export npm_config_audit=false export PATH="$NPM_PREFIX_A/bin:$NODE_A_DIR:$PATH" echo "Installing OpenClaw package under node-A prefix: $NPM_PREFIX_A" -npm install -g /tmp/openclaw-current.tgz --no-fund --no-audit >"$ARTIFACTS/install-a.log" 2>&1 +openclaw_e2e_install_package "$ARTIFACTS/install-a.log" "OpenClaw package under node-A prefix" "$NPM_PREFIX_A" echo "Installed. Checking openclaw location..." OPENCLAW_A="$(command -v openclaw)" diff --git a/scripts/e2e/update-channel-switch-docker.sh b/scripts/e2e/update-channel-switch-docker.sh index 95711b89496..7390ee943e5 100755 --- a/scripts/e2e/update-channel-switch-docker.sh +++ b/scripts/e2e/update-channel-switch-docker.sh @@ -60,7 +60,7 @@ tar -xzf "$package_tgz" -C "$git_root" --strip-components=1 node scripts/e2e/lib/update-channel-switch/assertions.mjs prepare-git-fixture "$git_root" ( cd "$git_root" - if ! npm install --omit=optional --no-fund --no-audit >/tmp/openclaw-git-install.log 2>&1; then + if ! openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install --omit=optional --no-fund --no-audit >/tmp/openclaw-git-install.log 2>&1; then cat /tmp/openclaw-git-install.log >&2 || true exit 1 fi @@ -79,7 +79,11 @@ fixture_sha="$(git -C "$git_root" rev-parse HEAD)" pkg_tgz_path="$package_tgz" -npm install -g --prefix /tmp/npm-prefix --omit=optional "$pkg_tgz_path" +package_install_log="/tmp/openclaw-update-channel-switch-package-install.log" +if ! openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install -g --prefix /tmp/npm-prefix --omit=optional "$pkg_tgz_path" >"$package_install_log" 2>&1; then + cat "$package_install_log" >&2 || true + exit 1 +fi package_version="$(node -p "JSON.parse(require(\"node:fs\").readFileSync(\"/tmp/npm-prefix/lib/node_modules/openclaw/package.json\", \"utf8\")).version")" OPENCLAW_PACKAGE_ACCEPTANCE_LEGACY_COMPAT="$( node scripts/e2e/lib/package-compat.mjs "$package_version" diff --git a/test/scripts/docker-build-helper.test.ts b/test/scripts/docker-build-helper.test.ts index 4975a33ba1f..968b5bbf08b 100644 --- a/test/scripts/docker-build-helper.test.ts +++ b/test/scripts/docker-build-helper.test.ts @@ -51,6 +51,8 @@ const PLUGINS_DOCKER_ASSERTIONS_PATH = "scripts/e2e/lib/plugins/assertions.mjs"; const PLUGINS_DOCKER_NPM_REGISTRY_PATH = "scripts/e2e/lib/plugins/npm-registry-server.mjs"; const PLUGIN_UPDATE_DOCKER_E2E_PATH = "scripts/e2e/plugin-update-unchanged-docker.sh"; const PLUGIN_UPDATE_SCENARIO_PATH = "scripts/e2e/lib/plugin-update/unchanged-scenario.sh"; +const PLUGIN_UPDATE_CORRUPT_SCENARIO_PATH = + "scripts/e2e/lib/plugin-update/corrupt-update-scenario.sh"; const PLUGIN_UPDATE_PROBE_PATH = "scripts/e2e/lib/plugin-update/probe.mjs"; const DOCTOR_SWITCH_DOCKER_E2E_PATH = "scripts/e2e/doctor-install-switch-docker.sh"; const DOCTOR_SWITCH_SCENARIO_PATH = "scripts/e2e/lib/doctor-install-switch/scenario.sh"; @@ -58,6 +60,9 @@ const PACKAGE_COMPAT_PATH = "scripts/e2e/lib/package-compat.mjs"; const UPDATE_CHANNEL_SWITCH_DOCKER_E2E_PATH = "scripts/e2e/update-channel-switch-docker.sh"; const UPDATE_CHANNEL_SWITCH_ASSERTIONS_PATH = "scripts/e2e/lib/update-channel-switch/assertions.mjs"; +const RELEASE_UPGRADE_USER_JOURNEY_SCENARIO_PATH = + "scripts/e2e/lib/release-upgrade-user-journey/scenario.sh"; +const UPGRADE_SURVIVOR_RUN_SCRIPT = "scripts/e2e/lib/upgrade-survivor/run.sh"; const GATEWAY_NETWORK_DOCKER_E2E_PATH = "scripts/e2e/gateway-network-docker.sh"; const CENTRALIZED_BUILD_SCRIPTS = [ "scripts/docker/setup.sh", @@ -495,6 +500,36 @@ grep -qx -- "OPENCLAW_E2E_NPM_INSTALL_TIMEOUT=42s" "$TMPDIR/package-args" } }); + it("wraps direct Docker E2E npm installs with the shared timeout helper", () => { + const multiNode = readFileSync(MULTI_NODE_UPDATE_DOCKER_E2E_PATH, "utf8"); + const updateChannel = readFileSync(UPDATE_CHANNEL_SWITCH_DOCKER_E2E_PATH, "utf8"); + const doctorSwitch = readFileSync(DOCTOR_SWITCH_SCENARIO_PATH, "utf8"); + const releaseUpgrade = readFileSync(RELEASE_UPGRADE_USER_JOURNEY_SCENARIO_PATH, "utf8"); + const upgradeSurvivor = readFileSync(UPGRADE_SURVIVOR_RUN_SCRIPT, "utf8"); + const pluginCorrupt = readFileSync(PLUGIN_UPDATE_CORRUPT_SCENARIO_PATH, "utf8"); + + expect(multiNode).toContain( + 'openclaw_e2e_install_package "$ARTIFACTS/install-a.log" "OpenClaw package under node-A prefix" "$NPM_PREFIX_A"', + ); + expect(updateChannel).toContain( + 'openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install --omit=optional --no-fund --no-audit', + ); + expect(updateChannel).toContain( + 'openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install -g --prefix /tmp/npm-prefix --omit=optional "$pkg_tgz_path"', + ); + expect(doctorSwitch).toContain( + 'openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install --omit=optional --no-fund --no-audit', + ); + expect(doctorSwitch).toContain( + 'openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install -g --prefix /tmp/npm-prefix --omit=optional "$package_tgz"', + ); + for (const script of [releaseUpgrade, upgradeSurvivor, pluginCorrupt]) { + expect(script).toContain( + 'openclaw_e2e_maybe_timeout "${OPENCLAW_E2E_NPM_INSTALL_TIMEOUT:-600s}" npm install -g', + ); + } + }); + it("keeps the harness run wrapper available with pre-sourced Docker command helpers", () => { const workDir = mkdtempSync(join(tmpdir(), "openclaw-docker-package-helper-guard-"));