test(onboard): guard docker e2e resources · openclaw/openclaw@80aa6d7
vincentkoc
·
2026-05-26
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -5,12 +5,43 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
5 | 5 | source "$ROOT_DIR/scripts/lib/docker-e2e-image.sh" |
6 | 6 | IMAGE_NAME="$(docker_e2e_resolve_image "openclaw-onboard-e2e" OPENCLAW_ONBOARD_E2E_IMAGE)" |
7 | 7 | OPENCLAW_TEST_STATE_FUNCTION_B64="$(docker_e2e_test_state_function_b64)" |
| 8 | +MAX_MEMORY_MIB="${OPENCLAW_ONBOARD_MAX_MEMORY_MIB:-2048}" |
| 9 | +MAX_CPU_PERCENT="${OPENCLAW_ONBOARD_MAX_CPU_PERCENT:-1200}" |
| 10 | +CONTAINER_NAME="openclaw-onboard-e2e-$$" |
| 11 | +RUN_LOG="$(mktemp "${TMPDIR:-/tmp}/openclaw-onboard.XXXXXX")" |
| 12 | +STATS_LOG="$(mktemp "${TMPDIR:-/tmp}/openclaw-onboard-stats.XXXXXX")" |
| 13 | + |
| 14 | +cleanup() { |
| 15 | + docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true |
| 16 | +} |
| 17 | +trap cleanup EXIT |
8 | 18 | |
9 | 19 | docker_e2e_build_or_reuse "$IMAGE_NAME" onboard |
10 | 20 | |
11 | 21 | echo "Running onboarding E2E..." |
12 | | -docker_e2e_run_with_harness -t \ |
| 22 | +docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true |
| 23 | +docker_e2e_harness_mount_args |
| 24 | +docker run --name "$CONTAINER_NAME" "${DOCKER_E2E_HARNESS_ARGS[@]}" -t \ |
13 | 25 | -e "OPENCLAW_TEST_STATE_FUNCTION_B64=$OPENCLAW_TEST_STATE_FUNCTION_B64" \ |
14 | | -"$IMAGE_NAME" bash scripts/e2e/lib/onboard/scenario.sh |
| 26 | +"$IMAGE_NAME" bash scripts/e2e/lib/onboard/scenario.sh >"$RUN_LOG" 2>&1 & |
| 27 | +docker_pid="$!" |
| 28 | + |
| 29 | +while kill -0 "$docker_pid" 2>/dev/null; do |
| 30 | +if docker inspect "$CONTAINER_NAME" >/dev/null 2>&1; then |
| 31 | + docker stats --no-stream --format '{{json .}}' "$CONTAINER_NAME" >>"$STATS_LOG" 2>/dev/null || true |
| 32 | +fi |
| 33 | + sleep 2 |
| 34 | +done |
| 35 | + |
| 36 | +set +e |
| 37 | +wait "$docker_pid" |
| 38 | +run_status="$?" |
| 39 | +set -e |
| 40 | + |
| 41 | +cat "$RUN_LOG" |
| 42 | + |
| 43 | +node scripts/e2e/lib/docker-stats/assert-resource-ceiling.mjs "$STATS_LOG" "$MAX_MEMORY_MIB" "$MAX_CPU_PERCENT" onboard |
15 | 44 | |
| 45 | +rm -f "$RUN_LOG" "$STATS_LOG" |
16 | 46 | echo "E2E complete." |
| 47 | +exit "$run_status" |
| Original file line number | Diff line number | Diff line change |
|---|
@@ -18,6 +18,7 @@ const OPENAI_WEB_SEARCH_MINIMAL_SCENARIO_PATH =
|
18 | 18 | const OPENAI_WEB_SEARCH_MINIMAL_CLIENT_PATH = |
19 | 19 | "scripts/e2e/lib/openai-web-search-minimal/client.mjs"; |
20 | 20 | const OPENWEBUI_DOCKER_E2E_PATH = "scripts/e2e/openwebui-docker.sh"; |
| 21 | +const ONBOARD_DOCKER_E2E_PATH = "scripts/e2e/onboard-docker.sh"; |
21 | 22 | const PLUGIN_BINDING_COMMAND_ESCAPE_DOCKER_E2E_PATH = |
22 | 23 | "scripts/e2e/plugin-binding-command-escape-docker.sh"; |
23 | 24 | const PLUGIN_BINDING_COMMAND_ESCAPE_DOCKERFILE_PATH = |
@@ -114,6 +115,17 @@ describe("docker build helper", () => {
|
114 | 115 | expect(dockerfile).toContain("procps"); |
115 | 116 | }); |
116 | 117 | |
| 118 | +it("keeps onboarding Docker E2E resource-guarded", () => { |
| 119 | +const runner = readFileSync(ONBOARD_DOCKER_E2E_PATH, "utf8"); |
| 120 | + |
| 121 | +expect(runner).toContain("OPENCLAW_ONBOARD_MAX_MEMORY_MIB"); |
| 122 | +expect(runner).toContain("OPENCLAW_ONBOARD_MAX_CPU_PERCENT"); |
| 123 | +expect(runner).toContain("--name \"$CONTAINER_NAME\""); |
| 124 | +expect(runner).toContain("docker stats --no-stream"); |
| 125 | +expect(runner).toContain("assert-resource-ceiling.mjs"); |
| 126 | +expect(runner).not.toContain("docker_e2e_run_with_harness -t"); |
| 127 | +}); |
| 128 | + |
117 | 129 | it("copies root lifecycle scripts before cleanup-smoke installs dependencies", () => { |
118 | 130 | const dockerfile = readFileSync(CLEANUP_SMOKE_DOCKERFILE_PATH, "utf8"); |
119 | 131 | const installIndex = dockerfile.indexOf("pnpm install --frozen-lockfile"); |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。