diff --git a/docs/concepts/qa-e2e-automation.md b/docs/concepts/qa-e2e-automation.md index 68e35f189f3..b0a55d8e4a2 100644 --- a/docs/concepts/qa-e2e-automation.md +++ b/docs/concepts/qa-e2e-automation.md @@ -65,9 +65,10 @@ model calls must not export `StreamAbandoned` on successful turns; raw diagnosti `openclaw.content.*` attributes must stay out of the trace. It writes `otel-smoke-summary.json` next to the QA suite artifacts. -The normal Docker aggregate also runs an observability lane. It builds or -reuses a source-backed Docker observability image, runs the OTEL trace smoke -inside the container, then runs the `docker-prometheus-smoke` QA scenario with the +The normal Docker aggregate and release-path core chunk also run an +observability lane. It reuses the shared package-installed functional Docker +image, mounts the QA harness files read-only, runs the OTEL trace smoke inside +the container, then runs the `docker-prometheus-smoke` QA scenario with the `diagnostics-prometheus` plugin enabled. Set `OPENCLAW_DOCKER_OBSERVABILITY_LOOPS=` to repeat both checks inside one Docker run while preserving per-loop artifacts under diff --git a/docs/help/testing.md b/docs/help/testing.md index 7da6a728b1f..c08edc47d37 100644 --- a/docs/help/testing.md +++ b/docs/help/testing.md @@ -617,7 +617,7 @@ The live-model Docker runners also bind-mount only the needed CLI auth homes (or - CLI backend smoke: `pnpm test:docker:live-cli-backend` (script: `scripts/test-live-cli-backend-docker.sh`) - Codex app-server harness smoke: `pnpm test:docker:live-codex-harness` (script: `scripts/test-live-codex-harness-docker.sh`) - Gateway + dev agent: `pnpm test:docker:live-gateway` (script: `scripts/test-live-gateway-models-docker.sh`) -- Docker observability smoke: included in `pnpm test:docker:all` and `pnpm test:docker:local:all` (script: `scripts/e2e/docker-observability-smoke.sh`). It runs QA-lab OTEL and Prometheus diagnostics checks inside a source-backed Docker image. Set `OPENCLAW_DOCKER_OBSERVABILITY_LOOPS=` to repeat both checks in one container run. +- Docker observability smoke: included in `pnpm test:docker:all`, `pnpm test:docker:local:all`, and the release-path `core` chunk (script: `scripts/e2e/docker-observability-smoke.sh`). It runs QA-lab OTEL and Prometheus diagnostics checks inside the shared package-installed functional Docker image, with only QA harness files mounted read-only. Set `OPENCLAW_DOCKER_OBSERVABILITY_LOOPS=` to repeat both checks in one container run. - Open WebUI live smoke: `pnpm test:docker:openwebui` (script: `scripts/e2e/openwebui-docker.sh`) - Onboarding wizard (TTY, full scaffolding): `pnpm test:docker:onboard` (script: `scripts/e2e/onboard-docker.sh`) - Npm tarball onboarding/channel/agent smoke: `pnpm test:docker:npm-onboard-channel-agent` installs the packed OpenClaw tarball globally in Docker, configures OpenAI via env-ref onboarding plus Telegram by default, verifies doctor repairs activated plugin runtime deps, and runs one mocked OpenAI agent turn. Reuse a prebuilt tarball with `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz`, skip the host rebuild with `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0`, or switch channel with `OPENCLAW_NPM_ONBOARD_CHANNEL=discord`. diff --git a/scripts/e2e/Dockerfile.observability b/scripts/e2e/Dockerfile.observability deleted file mode 100644 index 55ada3f2f22..00000000000 --- a/scripts/e2e/Dockerfile.observability +++ /dev/null @@ -1,55 +0,0 @@ -# syntax=docker/dockerfile:1.7 - -FROM node:24-bookworm-slim@sha256:e8e2e91b1378f83c5b2dd15f0247f34110e2fe895f6ca7719dbb780f929368eb AS observability-runner - -RUN apt-get update \ - && apt-get install -y --no-install-recommends ca-certificates git \ - && rm -rf /var/lib/apt/lists/* - -RUN corepack enable - -RUN useradd --create-home --shell /bin/bash appuser \ - && mkdir -p /app \ - && chown appuser:appuser /app - -ENV HOME="/home/appuser" -ENV NODE_OPTIONS="--disable-warning=ExperimentalWarning" -ENV OPENCLAW_DISABLE_BONJOUR="1" - -USER appuser -WORKDIR /app - -COPY --chown=appuser:appuser package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./ -COPY --chown=appuser:appuser ui/package.json ./ui/package.json -COPY --chown=appuser:appuser patches ./patches -COPY --chown=appuser:appuser scripts/postinstall-bundled-plugins.mjs scripts/preinstall-package-manager-warning.mjs scripts/npm-runner.mjs scripts/windows-cmd-helpers.mjs ./scripts/ -RUN --mount=type=bind,source=extensions,target=/tmp/extensions,readonly \ - find /tmp/extensions -mindepth 2 -maxdepth 2 -name package.json -print | \ - while IFS= read -r manifest; do \ - dest="${manifest#/tmp/}"; \ - mkdir -p "$(dirname "$dest")"; \ - cp "$manifest" "$dest"; \ - done - -RUN --mount=type=cache,id=openclaw-pnpm-store,target=/home/appuser/.local/share/pnpm/store,sharing=locked \ - pnpm install --frozen-lockfile - -COPY --chown=appuser:appuser .oxlintrc.json tsconfig.json tsconfig.plugin-sdk.dts.json tsconfig.oxlint*.json tsdown.config.ts vitest.config.ts openclaw.mjs ./ -COPY --chown=appuser:appuser src ./src -COPY --chown=appuser:appuser test ./test -COPY --chown=appuser:appuser scripts ./scripts -COPY --chown=appuser:appuser docs ./docs -COPY --chown=appuser:appuser packages ./packages -COPY --chown=appuser:appuser qa ./qa -COPY --chown=appuser:appuser skills ./skills -COPY --chown=appuser:appuser ui ./ui -COPY --chown=appuser:appuser extensions ./extensions -COPY --chown=appuser:appuser vendor/a2ui/renderers/lit ./vendor/a2ui/renderers/lit -COPY --chown=appuser:appuser apps/shared/OpenClawKit/Sources/OpenClawKit/Resources ./apps/shared/OpenClawKit/Sources/OpenClawKit/Resources -COPY --chown=appuser:appuser apps/shared/OpenClawKit/Tools/CanvasA2UI ./apps/shared/OpenClawKit/Tools/CanvasA2UI - -RUN pnpm build -RUN mkdir -p dist/control-ui \ - && printf '%s\n' 'OpenClaw Control UI' > dist/control-ui/index.html - -CMD ["bash"] diff --git a/scripts/e2e/docker-observability-smoke.sh b/scripts/e2e/docker-observability-smoke.sh index 885c1179d90..a488ec14a14 100644 --- a/scripts/e2e/docker-observability-smoke.sh +++ b/scripts/e2e/docker-observability-smoke.sh @@ -1,10 +1,13 @@ #!/usr/bin/env bash +# Runs QA diagnostics smoke checks inside the shared package-installed Docker +# E2E image. The OpenClaw app under test comes from the prepared npm tarball; +# only QA harness files are mounted read-only. set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" source "$ROOT_DIR/scripts/lib/docker-e2e-image.sh" -IMAGE_NAME="$(docker_e2e_resolve_image "openclaw-docker-observability-e2e:local" OPENCLAW_DOCKER_OBSERVABILITY_E2E_IMAGE)" +IMAGE_NAME="$(docker_e2e_resolve_image "openclaw-docker-observability-e2e:local" OPENCLAW_DOCKER_OBSERVABILITY_E2E_IMAGE OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE)" SKIP_BUILD="${OPENCLAW_DOCKER_OBSERVABILITY_E2E_SKIP_BUILD:-0}" LOOPS="${OPENCLAW_DOCKER_OBSERVABILITY_LOOPS:-1}" OUTPUT_DIR="${OPENCLAW_DOCKER_OBSERVABILITY_OUTPUT_DIR:-$ROOT_DIR/.artifacts/docker-observability/$(date +%Y%m%d-%H%M%S)}" @@ -16,11 +19,15 @@ fi mkdir -p "$OUTPUT_DIR" -docker_e2e_build_or_reuse "$IMAGE_NAME" docker-observability "$ROOT_DIR/scripts/e2e/Dockerfile.observability" "$ROOT_DIR" "" "$SKIP_BUILD" +docker_e2e_build_or_reuse "$IMAGE_NAME" docker-observability "$ROOT_DIR/scripts/e2e/Dockerfile" "$ROOT_DIR" "" "$SKIP_BUILD" +docker_e2e_harness_mount_args echo "Running Docker observability smoke with $LOOPS loop(s)..." run_logged docker-observability docker run --rm \ -e "OPENCLAW_DOCKER_OBSERVABILITY_LOOPS=$LOOPS" \ + "${DOCKER_E2E_HARNESS_ARGS[@]}" \ + -v "$ROOT_DIR/scripts/qa-otel-smoke.ts:/app/scripts/qa-otel-smoke.ts:ro" \ + -v "$ROOT_DIR/qa:/app/qa:ro" \ -v "$OUTPUT_DIR:/app/.artifacts/docker-observability-current" \ "$IMAGE_NAME" \ bash -lc ' diff --git a/scripts/lib/docker-e2e-scenarios.mjs b/scripts/lib/docker-e2e-scenarios.mjs index bddda074b03..227adae9d00 100644 --- a/scripts/lib/docker-e2e-scenarios.mjs +++ b/scripts/lib/docker-e2e-scenarios.mjs @@ -184,10 +184,13 @@ export const mainLanes = [ { resources: ["service"], weight: 3 }, ), serviceLane("gateway-network", "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:gateway-network"), - serviceLane("observability", "bash scripts/e2e/docker-observability-smoke.sh", { - e2eImageKind: false, - weight: 3, - }), + serviceLane( + "observability", + "OPENCLAW_SKIP_DOCKER_BUILD=1 bash scripts/e2e/docker-observability-smoke.sh", + { + weight: 3, + }, + ), serviceLane( "agents-delete-shared-workspace", "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:agents-delete-shared-workspace", @@ -342,6 +345,13 @@ const releasePathChunks = { "pi-bundle-mcp-tools", "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:pi-bundle-mcp-tools", ), + serviceLane( + "observability", + "OPENCLAW_SKIP_DOCKER_BUILD=1 bash scripts/e2e/docker-observability-smoke.sh", + { + weight: 3, + }, + ), serviceLane("mcp-channels", "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channels", { resources: ["npm"], weight: 3,