@@ -488,66 +488,50 @@ jobs:
|
488 | 488 | shell: bash |
489 | 489 | run: | |
490 | 490 | set -euo pipefail |
491 | | - |
492 | | - failures=() |
493 | | - |
494 | | - run_lane() { |
495 | | - local label="$1" |
496 | | - shift |
497 | | - |
498 | | - echo "::group::${label}" |
499 | | - local status=0 |
500 | | - "$@" || status=$? |
501 | | - echo "::endgroup::" |
502 | | - |
503 | | - if [[ "$status" -ne 0 ]]; then |
504 | | - failures+=("${label} exited ${status}") |
505 | | - fi |
506 | | - } |
507 | | - |
508 | | - run_openwebui_lane() { |
509 | | - if [[ "${INCLUDE_OPENWEBUI}" != "true" ]]; then |
510 | | - echo "Skipping Open WebUI Docker E2E because include_openwebui=false." |
511 | | - return 0 |
512 | | - fi |
513 | | - run_lane "Open WebUI Docker E2E" pnpm test:docker:openwebui |
| 491 | + export OPENCLAW_DOCKER_ALL_PROFILE=release-path |
| 492 | + export OPENCLAW_DOCKER_ALL_CHUNK="${DOCKER_E2E_CHUNK}" |
| 493 | + export OPENCLAW_DOCKER_ALL_BUILD=0 |
| 494 | + export OPENCLAW_DOCKER_ALL_PREFLIGHT=0 |
| 495 | + export OPENCLAW_DOCKER_ALL_FAIL_FAST=0 |
| 496 | + export OPENCLAW_DOCKER_ALL_INCLUDE_OPENWEBUI="${INCLUDE_OPENWEBUI}" |
| 497 | + export OPENCLAW_DOCKER_ALL_LOG_DIR=".artifacts/docker-tests/release-${DOCKER_E2E_CHUNK}" |
| 498 | + export OPENCLAW_DOCKER_ALL_TIMINGS_FILE=".artifacts/docker-tests/release-${DOCKER_E2E_CHUNK}-timings.json" |
| 499 | + |
| 500 | + pnpm test:docker:all |
| 501 | + |
| 502 | + - name: Summarize Docker E2E chunk |
| 503 | +if: always() |
| 504 | +shell: bash |
| 505 | +run: | |
| 506 | + set -euo pipefail |
| 507 | + summary=".artifacts/docker-tests/release-${DOCKER_E2E_CHUNK}/summary.json" |
| 508 | + if [[ ! -f "$summary" ]]; then |
| 509 | + echo "Docker chunk summary missing: \`$summary\`" >> "$GITHUB_STEP_SUMMARY" |
| 510 | + exit 0 |
| 511 | + fi |
| 512 | + node --input-type=module - "$summary" <<'NODE' >> "$GITHUB_STEP_SUMMARY" |
| 513 | + import fs from "node:fs"; |
| 514 | + const summary = JSON.parse(fs.readFileSync(process.argv[2], "utf8")); |
| 515 | + const lanes = Array.isArray(summary.lanes) ? summary.lanes : []; |
| 516 | + console.log(`### Docker E2E chunk: ${summary.chunk ?? "unknown"}`); |
| 517 | + console.log(""); |
| 518 | + console.log(`Status: \`${summary.status}\``); |
| 519 | + console.log(""); |
| 520 | + console.log("| Lane | Status | Seconds | Timed out |"); |
| 521 | + console.log("| --- | ---: | ---: | --- |"); |
| 522 | + for (const lane of lanes) { |
| 523 | + const status = lane.status === 0 ? "pass" : `fail ${lane.status}`; |
| 524 | + console.log(`| \`${lane.name}\` | ${status} | ${lane.elapsedSeconds ?? ""} | ${lane.timedOut ? "yes" : "no"} |`); |
514 | 525 | } |
| 526 | + NODE |
515 | 527 | |
516 | | - case "${DOCKER_E2E_CHUNK}" in |
517 | | - core) |
518 | | - run_lane "QR Import Docker E2E" pnpm test:docker:qr |
519 | | - run_lane "Onboarding Docker E2E" pnpm test:docker:onboard |
520 | | - run_lane "Gateway Network Docker E2E" pnpm test:docker:gateway-network |
521 | | - run_lane "Config Reload Docker E2E" pnpm test:docker:config-reload |
522 | | - run_lane "Session Runtime Context Docker E2E" pnpm test:docker:session-runtime-context |
523 | | - run_lane "Pi Bundle MCP Tools Docker E2E" pnpm test:docker:pi-bundle-mcp-tools |
524 | | - run_lane "MCP Channels Docker E2E" pnpm test:docker:mcp-channels |
525 | | - ;; |
526 | | - package-update) |
527 | | - run_lane "Installer Docker E2E" env OPENCLAW_E2E_MODELS=both pnpm test:install:e2e |
528 | | - run_lane "Npm Onboard Channel Agent Docker E2E" pnpm test:docker:npm-onboard-channel-agent |
529 | | - run_lane "Doctor Install Switch Docker E2E" pnpm test:docker:doctor-switch |
530 | | - run_lane "Update Channel Switch Docker E2E" pnpm test:docker:update-channel-switch |
531 | | - ;; |
532 | | - plugins-integrations) |
533 | | - run_lane "Plugins Docker E2E" pnpm test:docker:plugins |
534 | | - run_lane "Plugin Update Docker E2E" pnpm test:docker:plugin-update |
535 | | - run_lane "Bundled Channel Runtime Deps Docker E2E" pnpm test:docker:bundled-channel-deps |
536 | | - run_lane "Cron MCP Cleanup Docker E2E" pnpm test:docker:cron-mcp-cleanup |
537 | | - run_lane "OpenAI Web Search Minimal Docker E2E" pnpm test:docker:openai-web-search-minimal |
538 | | - run_openwebui_lane |
539 | | - ;; |
540 | | - *) |
541 | | - echo "Unknown Docker E2E chunk: ${DOCKER_E2E_CHUNK}" >&2 |
542 | | - exit 1 |
543 | | - ;; |
544 | | - esac |
545 | | - |
546 | | - if (( ${#failures[@]} > 0 )); then |
547 | | - printf 'Docker E2E chunk %s failed:\n' "${DOCKER_E2E_CHUNK}" >&2 |
548 | | - printf -- '- %s\n' "${failures[@]}" >&2 |
549 | | - exit 1 |
550 | | - fi |
| 528 | + - name: Upload Docker E2E chunk artifacts |
| 529 | +if: always() |
| 530 | +uses: actions/upload-artifact@v7 |
| 531 | +with: |
| 532 | +name: docker-e2e-${{ matrix.chunk_id }} |
| 533 | +path: .artifacts/docker-tests/ |
| 534 | +if-no-files-found: ignore |
551 | 535 | |
552 | 536 | validate_docker_openwebui: |
553 | 537 | needs: [validate_selected_ref, prepare_docker_e2e_image] |
|