


























@@ -0,0 +1,165 @@
1+#!/usr/bin/env bash
2+set -euo pipefail
3+4+ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5+source "$ROOT_DIR/scripts/lib/docker-e2e-image.sh"
6+7+IMAGE_NAME="$(docker_e2e_resolve_image "openclaw-update-channel-switch-e2e" OPENCLAW_UPDATE_CHANNEL_SWITCH_E2E_IMAGE)"
8+SKIP_BUILD="${OPENCLAW_UPDATE_CHANNEL_SWITCH_E2E_SKIP_BUILD:-0}"
9+10+docker_e2e_build_or_reuse "$IMAGE_NAME" update-channel-switch "$ROOT_DIR/scripts/e2e/Dockerfile" "$ROOT_DIR" "" "$SKIP_BUILD"
11+12+echo "Running update channel switch E2E..."
13+docker run --rm \
14+ -e COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \
15+ -e OPENCLAW_SKIP_CHANNELS=1 \
16+ -e OPENCLAW_SKIP_PROVIDERS=1 \
17+"$IMAGE_NAME" \
18+ bash -lc 'set -euo pipefail
19+20+export npm_config_loglevel=error
21+export npm_config_fund=false
22+export npm_config_audit=false
23+export npm_config_prefix=/tmp/npm-prefix
24+export NPM_CONFIG_PREFIX=/tmp/npm-prefix
25+export PNPM_HOME=/tmp/pnpm-home
26+export PATH="/tmp/npm-prefix/bin:/tmp/pnpm-home:$PATH"
27+export CI=true
28+export OPENCLAW_DISABLE_BUNDLED_PLUGINS=1
29+export OPENCLAW_NO_ONBOARD=1
30+export OPENCLAW_NO_PROMPT=1
31+32+cat > /app/.gitignore <<'"'"'GITIGNORE'"'"'
33+node_modules
34+**/node_modules/
35+dist
36+dist-runtime
37+.turbo
38+coverage
39+GITIGNORE
40+41+node --import tsx scripts/write-package-dist-inventory.ts
42+43+git config --global user.email "docker-e2e@openclaw.local"
44+git config --global user.name "OpenClaw Docker E2E"
45+git config --global gc.auto 0
46+git -C /app init -q
47+git -C /app config gc.auto 0
48+git -C /app add -A
49+git -C /app commit -qm "test fixture"
50+fixture_sha="$(git -C /app rev-parse HEAD)"
51+52+pkg_tgz="$(npm pack --ignore-scripts --silent --pack-destination /tmp /app | tail -n 1 | tr -d "\r")"
53+pkg_tgz_path="/tmp/$pkg_tgz"
54+if [ ! -f "$pkg_tgz_path" ]; then
55+ echo "npm pack failed (expected $pkg_tgz_path)"
56+ exit 1
57+fi
58+59+npm install -g --prefix /tmp/npm-prefix --omit=optional "$pkg_tgz_path"
60+61+home_dir="$(mktemp -d /tmp/openclaw-update-channel-switch-home.XXXXXX)"
62+export HOME="$home_dir"
63+mkdir -p "$HOME/.openclaw"
64+cat > "$HOME/.openclaw/openclaw.json" <<'"'"'JSON'"'"'
65+{
66+ "update": {
67+ "channel": "stable"
68+ },
69+ "plugins": {}
70+}
71+JSON
72+73+export OPENCLAW_GIT_DIR=/app
74+export OPENCLAW_UPDATE_DEV_TARGET_REF="$fixture_sha"
75+76+echo "==> package -> git dev channel"
77+set +e
78+dev_json="$(openclaw update --channel dev --yes --json --no-restart)"
79+dev_status=$?
80+set -e
81+printf "%s\n" "$dev_json"
82+if [ "$dev_status" -ne 0 ]; then
83+ exit "$dev_status"
84+fi
85+DEV_JSON="$dev_json" node - <<'"'"'NODE'"'"'
86+const payload = JSON.parse(process.env.DEV_JSON);
87+if (payload.status !== "ok") {
88+ throw new Error(`expected dev update status ok, got ${payload.status}`);
89+}
90+if (payload.mode !== "git") {
91+ throw new Error(`expected dev update mode git, got ${payload.mode}`);
92+}
93+if (payload.postUpdate?.plugins?.status !== "ok") {
94+ throw new Error(`expected plugin post-update ok, got ${JSON.stringify(payload.postUpdate?.plugins)}`);
95+}
96+NODE
97+98+node - <<'"'"'NODE'"'"'
99+const fs = require("node:fs");
100+const path = require("node:path");
101+const configPath = path.join(process.env.HOME, ".openclaw", "openclaw.json");
102+const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
103+if (config.update?.channel !== "dev") {
104+ throw new Error(`expected persisted update.channel dev, got ${JSON.stringify(config.update?.channel)}`);
105+}
106+NODE
107+108+status_json="$(openclaw update status --json)"
109+printf "%s\n" "$status_json"
110+STATUS_JSON="$status_json" node - <<'"'"'NODE'"'"'
111+const payload = JSON.parse(process.env.STATUS_JSON);
112+if (payload.update?.installKind !== "git") {
113+ throw new Error(`expected git install after dev switch, got ${payload.update?.installKind}`);
114+}
115+if (payload.channel?.value !== "dev" || payload.channel?.source !== "config") {
116+ throw new Error(`expected dev config channel after dev switch, got ${JSON.stringify(payload.channel)}`);
117+}
118+NODE
119+120+echo "==> git -> package stable channel"
121+set +e
122+stable_json="$(openclaw update --channel stable --tag "$pkg_tgz_path" --yes --json --no-restart)"
123+stable_status=$?
124+set -e
125+printf "%s\n" "$stable_json"
126+if [ "$stable_status" -ne 0 ]; then
127+ exit "$stable_status"
128+fi
129+STABLE_JSON="$stable_json" node - <<'"'"'NODE'"'"'
130+const payload = JSON.parse(process.env.STABLE_JSON);
131+if (payload.status !== "ok") {
132+ throw new Error(`expected stable update status ok, got ${payload.status}`);
133+}
134+if (!["npm", "pnpm", "bun"].includes(payload.mode)) {
135+ throw new Error(`expected package-manager mode after stable switch, got ${payload.mode}`);
136+}
137+if (payload.postUpdate?.plugins?.status !== "ok") {
138+ throw new Error(`expected plugin post-update ok, got ${JSON.stringify(payload.postUpdate?.plugins)}`);
139+}
140+NODE
141+142+node - <<'"'"'NODE'"'"'
143+const fs = require("node:fs");
144+const path = require("node:path");
145+const configPath = path.join(process.env.HOME, ".openclaw", "openclaw.json");
146+const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
147+if (config.update?.channel !== "stable") {
148+ throw new Error(`expected persisted update.channel stable, got ${JSON.stringify(config.update?.channel)}`);
149+}
150+NODE
151+152+status_json="$(openclaw update status --json)"
153+printf "%s\n" "$status_json"
154+STATUS_JSON="$status_json" node - <<'"'"'NODE'"'"'
155+const payload = JSON.parse(process.env.STATUS_JSON);
156+if (payload.update?.installKind !== "package") {
157+ throw new Error(`expected package install after stable switch, got ${payload.update?.installKind}`);
158+}
159+if (payload.channel?.value !== "stable" || payload.channel?.source !== "config") {
160+ throw new Error(`expected stable config channel after stable switch, got ${JSON.stringify(payload.channel)}`);
161+}
162+NODE
163+164+echo "OK"
165+'
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。