
























@@ -4,54 +4,27 @@ set -euo pipefail
44ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
55source "$ROOT_DIR/scripts/lib/docker-e2e-image.sh"
66IMAGE_NAME="$(docker_e2e_resolve_image "openclaw-onboard-e2e" OPENCLAW_ONBOARD_E2E_IMAGE)"
7-OPENCLAW_TEST_STATE_FUNCTION_B64="$(
8- node "$ROOT_DIR/scripts/lib/openclaw-test-state.mjs" shell-function \
9- | base64 \
10- | tr -d '\n'
11-)"
7+OPENCLAW_TEST_STATE_FUNCTION_B64="$(docker_e2e_test_state_function_b64)"
128139docker_e2e_build_or_reuse "$IMAGE_NAME" onboard
10+docker_e2e_harness_mount_args
14111512echo "Running onboarding E2E..."
1613docker run --rm -t \
1714 -e "OPENCLAW_TEST_STATE_FUNCTION_B64=$OPENCLAW_TEST_STATE_FUNCTION_B64" \
15+"${DOCKER_E2E_HARNESS_ARGS[@]}" \
1816"$IMAGE_NAME" bash -lc '
1917 set -euo pipefail
2018 trap "" PIPE
2119 export TERM=xterm-256color
20+ source scripts/lib/openclaw-e2e-instance.sh
2221 eval "$(printf "%s" "${OPENCLAW_TEST_STATE_FUNCTION_B64:?missing OPENCLAW_TEST_STATE_FUNCTION_B64}" | base64 -d)"
2322 ONBOARD_FLAGS="--flow quickstart --auth-choice skip --skip-channels --skip-skills --skip-daemon --skip-ui"
24- # tsdown may emit dist/index.js or dist/index.mjs depending on runtime/bundler.
25- if [ -f dist/index.mjs ]; then
26- OPENCLAW_ENTRY="dist/index.mjs"
27- elif [ -f dist/index.js ]; then
28- OPENCLAW_ENTRY="dist/index.js"
29- else
30- echo "Missing dist/index.(m)js (build output):"
31- ls -la dist || true
32- exit 1
33- fi
23+ OPENCLAW_ENTRY="$(openclaw_e2e_resolve_entrypoint)"
3424 export OPENCLAW_ENTRY
35253626 # Provide a minimal trash shim to avoid noisy "missing trash" logs in containers.
37- export PATH="/tmp/openclaw-bin:$PATH"
38- mkdir -p /tmp/openclaw-bin
39- cat > /tmp/openclaw-bin/trash <<'"'"'TRASH'"'"'
40-#!/usr/bin/env bash
41-set -euo pipefail
42-trash_dir="$HOME/.Trash"
43-mkdir -p "$trash_dir"
44-for target in "$@"; do
45- [ -e "$target" ] || continue
46- base="$(basename "$target")"
47- dest="$trash_dir/$base"
48- if [ -e "$dest" ]; then
49- dest="$trash_dir/${base}-$(date +%s)-$$"
50- fi
51- mv "$target" "$dest"
52-done
53-TRASH
54- chmod +x /tmp/openclaw-bin/trash
27+ openclaw_e2e_install_trash_shim
55285629 send() {
5730 local payload="$1"
@@ -120,29 +93,12 @@ TRASH
12093 }
1219412295 start_gateway() {
123- node "$OPENCLAW_ENTRY" gateway --port 18789 --bind loopback --allow-unconfigured > /tmp/gateway-e2e.log 2>&1 &
124- GATEWAY_PID="$!"
96+ GATEWAY_PID="$(openclaw_e2e_start_gateway "$OPENCLAW_ENTRY" 18789 /tmp/gateway-e2e.log)"
12597 }
1269812799 wait_for_gateway() {
128100 for _ in $(seq 1 20); do
129- if node --input-type=module -e "
130- import net from 'node:net';
131- const socket = net.createConnection({ host: '127.0.0.1', port: 18789 });
132- const timeout = setTimeout(() => {
133- socket.destroy();
134- process.exit(1);
135- }, 500);
136- socket.on('connect', () => {
137- clearTimeout(timeout);
138- socket.end();
139- process.exit(0);
140- });
141- socket.on('error', () => {
142- clearTimeout(timeout);
143- process.exit(1);
144- });
145- " >/dev/null 2>&1; then
101+ if openclaw_e2e_probe_tcp 127.0.0.1 18789 500 >/dev/null 2>&1; then
146102 return 0
147103 fi
148104 if [ -f /tmp/gateway-e2e.log ] && grep -E -q "listening on ws://[^ ]+:18789" /tmp/gateway-e2e.log; then
@@ -158,11 +114,7 @@ TRASH
158114 }
159115160116 stop_gateway() {
161- local gw_pid="$1"
162- if [ -n "$gw_pid" ]; then
163- kill "$gw_pid" 2>/dev/null || true
164- wait "$gw_pid" || true
165- fi
117+ openclaw_e2e_stop_process "$1"
166118 }
167119168120 run_wizard_cmd() {
@@ -229,32 +181,6 @@ TRASH
229181 openclaw_test_state_create "$state_ref" empty
230182 }
231183232- assert_file() {
233- local file_path="$1"
234- if [ ! -f "$file_path" ]; then
235- echo "Missing file: $file_path"
236- exit 1
237- fi
238- }
239-240- assert_dir() {
241- local dir_path="$1"
242- if [ ! -d "$dir_path" ]; then
243- echo "Missing dir: $dir_path"
244- exit 1
245- fi
246- }
247-248- run_case_logged() {
249- local label="$1"
250- shift
251- local log_path="/tmp/openclaw-onboard-${label}.log"
252- if ! "$@" >"$log_path" 2>&1; then
253- cat "$log_path"
254- exit 1
255- fi
256- }
257-258184 select_skip_hooks() {
259185 # Hooks multiselect: pick "Skip for now".
260186 wait_for_log "Enable hooks?" 60
@@ -306,7 +232,7 @@ TRASH
306232307233 run_case_local_basic() {
308234 set_isolated_openclaw_env local-basic
309- run_case_logged local-basic node "$OPENCLAW_ENTRY" onboard \
235+ openclaw_e2e_run_logged local-basic node "$OPENCLAW_ENTRY" onboard \
310236 --non-interactive \
311237 --accept-risk \
312238 --flow quickstart \
@@ -322,10 +248,10 @@ TRASH
322248 config_path="$OPENCLAW_CONFIG_PATH"
323249 sessions_dir="$OPENCLAW_STATE_DIR/agents/main/sessions"
324250325- assert_file "$config_path"
326- assert_dir "$sessions_dir"
251+ openclaw_e2e_assert_file "$config_path"
252+ openclaw_e2e_assert_dir "$sessions_dir"
327253 for file in AGENTS.md BOOTSTRAP.md IDENTITY.md SOUL.md TOOLS.md USER.md; do
328- assert_file "$workspace_dir/$file"
254+ openclaw_e2e_assert_file "$workspace_dir/$file"
329255 done
330256331257 CONFIG_PATH="$config_path" WORKSPACE_DIR="$workspace_dir" node --input-type=module - <<'"'"'NODE'"'"'
@@ -380,15 +306,15 @@ NODE
380306 run_case_remote_non_interactive() {
381307 set_isolated_openclaw_env remote-non-interactive
382308 # Smoke test non-interactive remote config write.
383- run_case_logged remote-non-interactive node "$OPENCLAW_ENTRY" onboard --non-interactive --accept-risk \
309+ openclaw_e2e_run_logged remote-non-interactive node "$OPENCLAW_ENTRY" onboard --non-interactive --accept-risk \
384310 --mode remote \
385311 --remote-url ws://gateway.local:18789 \
386312 --remote-token remote-token \
387313 --skip-skills \
388314 --skip-health
389315390316 config_path="$OPENCLAW_CONFIG_PATH"
391- assert_file "$config_path"
317+ openclaw_e2e_assert_file "$config_path"
392318393319 CONFIG_PATH="$config_path" node --input-type=module - <<'"'"'NODE'"'"'
394320import fs from "node:fs";
@@ -431,7 +357,7 @@ NODE
431357}
432358JSON
433359434- run_case_logged reset-config node "$OPENCLAW_ENTRY" onboard \
360+ openclaw_e2e_run_logged reset-config node "$OPENCLAW_ENTRY" onboard \
435361 --non-interactive \
436362 --accept-risk \
437363 --flow quickstart \
@@ -444,7 +370,7 @@ JSON
444370 --skip-health
445371446372 config_path="$OPENCLAW_CONFIG_PATH"
447- assert_file "$config_path"
373+ openclaw_e2e_assert_file "$config_path"
448374449375 CONFIG_PATH="$config_path" node --input-type=module - <<'"'"'NODE'"'"'
450376import fs from "node:fs";
@@ -475,7 +401,7 @@ NODE
475401 run_wizard_cmd channels channels "node \"$OPENCLAW_ENTRY\" configure --section channels" send_channels_flow
476402477403 config_path="$OPENCLAW_CONFIG_PATH"
478- assert_file "$config_path"
404+ openclaw_e2e_assert_file "$config_path"
479405480406 CONFIG_PATH="$config_path" node --input-type=module - <<'"'"'NODE'"'"'
481407import fs from "node:fs";
@@ -526,7 +452,7 @@ JSON
526452 run_wizard_cmd skills "$home_dir" "node \"$OPENCLAW_ENTRY\" configure --section skills" send_skills_flow
527453528454 config_path="$OPENCLAW_CONFIG_PATH"
529- assert_file "$config_path"
455+ openclaw_e2e_assert_file "$config_path"
530456531457 CONFIG_PATH="$config_path" node --input-type=module - <<'"'"'NODE'"'"'
532458import fs from "node:fs";
@@ -552,18 +478,9 @@ if (errors.length > 0) {
552478NODE
553479 }
554480555- assert_log_not_contains() {
556- local file_path="$1"
557- local needle="$2"
558- if grep -q "$needle" "$file_path"; then
559- echo "Unexpected log output: $needle"
560- exit 1
561- fi
562- }
563-564481 validate_local_basic_log() {
565482 local log_path="$1"
566- assert_log_not_contains "$log_path" "systemctl --user unavailable"
483+ openclaw_e2e_assert_log_not_contains "$log_path" "systemctl --user unavailable"
567484 }
568485569486 run_case_local_basic
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。