




















@@ -364,92 +364,22 @@ jobs:
364364validate_docker_e2e:
365365needs: [validate_selected_ref, prepare_docker_e2e_image]
366366if: inputs.include_release_path_suites
367+name: Docker E2E (${{ matrix.label }})
367368runs-on: blacksmith-32vcpu-ubuntu-2404
368369timeout-minutes: ${{ matrix.timeout_minutes }}
369370strategy:
370371fail-fast: false
371372matrix:
372373include:
373- - suite_id: docker-onboard
374-label: Onboarding Docker E2E
375-command: pnpm test:docker:onboard
376-timeout_minutes: 60
377-release_path: true
378- - suite_id: docker-npm-onboard-channel-agent
379-label: Npm Onboard Channel Agent Docker E2E
380-command: pnpm test:docker:npm-onboard-channel-agent
381-timeout_minutes: 90
382-release_path: true
383- - suite_id: docker-gateway-network
384-label: Gateway Network Docker E2E
385-command: pnpm test:docker:gateway-network
386-timeout_minutes: 60
387-release_path: true
388- - suite_id: docker-openai-web-search-minimal
389-label: OpenAI Web Search Minimal Docker E2E
390-command: pnpm test:docker:openai-web-search-minimal
391-timeout_minutes: 60
392-release_path: true
393- - suite_id: docker-mcp-channels
394-label: MCP Channels Docker E2E
395-command: pnpm test:docker:mcp-channels
396-timeout_minutes: 60
397-release_path: true
398- - suite_id: docker-pi-bundle-mcp-tools
399-label: Pi Bundle MCP Tools Docker E2E
400-command: pnpm test:docker:pi-bundle-mcp-tools
401-timeout_minutes: 60
402-release_path: true
403- - suite_id: docker-cron-mcp-cleanup
404-label: Cron MCP Cleanup Docker E2E
405-command: pnpm test:docker:cron-mcp-cleanup
406-timeout_minutes: 60
407-release_path: true
408- - suite_id: docker-plugins
409-label: Plugins Docker E2E
410-command: pnpm test:docker:plugins
411-timeout_minutes: 75
412-release_path: true
413- - suite_id: docker-plugin-update
414-label: Plugin Update Docker E2E
415-command: pnpm test:docker:plugin-update
416-timeout_minutes: 60
417-release_path: true
418- - suite_id: docker-config-reload
419-label: Config Reload Docker E2E
420-command: pnpm test:docker:config-reload
421-timeout_minutes: 60
422-release_path: true
423- - suite_id: docker-bundled-channel-deps
424-label: Bundled Channel Runtime Deps Docker E2E
425-command: pnpm test:docker:bundled-channel-deps
426-timeout_minutes: 75
427-release_path: true
428- - suite_id: docker-doctor-switch
429-label: Doctor Install Switch Docker E2E
430-command: pnpm test:docker:doctor-switch
431-timeout_minutes: 60
432-release_path: true
433- - suite_id: docker-update-channel-switch
434-label: Update Channel Switch Docker E2E
435-command: pnpm test:docker:update-channel-switch
436-timeout_minutes: 60
437-release_path: true
438- - suite_id: docker-session-runtime-context
439-label: Session Runtime Context Docker E2E
440-command: pnpm test:docker:session-runtime-context
441-timeout_minutes: 60
442-release_path: true
443- - suite_id: docker-qr
444-label: QR Import Docker E2E
445-command: pnpm test:docker:qr
446-timeout_minutes: 60
447-release_path: true
448- - suite_id: docker-install-e2e
449-label: Installer Docker E2E
450-command: pnpm test:install:e2e
374+ - chunk_id: core
375+label: core
451376timeout_minutes: 120
452-release_path: true
377+ - chunk_id: package-update
378+label: package/update
379+timeout_minutes: 180
380+ - chunk_id: plugins-integrations
381+label: plugins/integrations
382+timeout_minutes: 180
453383env:
454384OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
455385OPENAI_BASE_URL: ${{ secrets.OPENAI_BASE_URL }}
@@ -497,6 +427,8 @@ jobs:
497427FIREWORKS_API_KEY: ${{ secrets.FIREWORKS_API_KEY }}
498428OPENCLAW_DOCKER_E2E_IMAGE: ${{ needs.prepare_docker_e2e_image.outputs.image }}
499429OPENCLAW_SKIP_DOCKER_BUILD: "1"
430+INCLUDE_OPENWEBUI: ${{ inputs.include_openwebui }}
431+DOCKER_E2E_CHUNK: ${{ matrix.chunk_id }}
500432steps:
501433 - name: Checkout selected ref
502434uses: actions/checkout@v6
@@ -521,22 +453,18 @@ jobs:
521453 - name: Hydrate live auth/profile inputs
522454run: bash scripts/ci-hydrate-live-auth.sh
523455524- - name: Configure suite-specific env
456+ - name: Pull shared Docker E2E image
525457shell: bash
526458run: |
527459 set -euo pipefail
528- case "${{ matrix.suite_id }}" in
529- docker-install-e2e)
530- echo "OPENCLAW_E2E_MODELS=both" >> "$GITHUB_ENV"
531- ;;
532- esac
460+ docker pull "${OPENCLAW_DOCKER_E2E_IMAGE}"
533461534- - name: Validate suite credentials
462+ - name: Validate chunk credentials
535463shell: bash
536464run: |
537465 set -euo pipefail
538- case "${{ matrix.suite_id }}" in
539- docker-install-e2e)
466+ case "${DOCKER_E2E_CHUNK}" in
467+ package-update)
540468 [[ -n "${OPENAI_API_KEY:-}" ]] || {
541469 echo "OPENAI_API_KEY is required for installer Docker E2E." >&2
542470 exit 1
@@ -546,14 +474,84 @@ jobs:
546474 exit 1
547475 fi
548476 ;;
477+ plugins-integrations)
478+ if [[ "${INCLUDE_OPENWEBUI}" == "true" ]]; then
479+ [[ -n "${OPENAI_API_KEY:-}" ]] || {
480+ echo "OPENAI_API_KEY is required for the Open WebUI Docker smoke." >&2
481+ exit 1
482+ }
483+ fi
484+ ;;
549485 esac
550486551- - name: Run ${{ matrix.label }}
552-run: ${{ matrix.command }}
487+ - name: Run Docker E2E chunk
488+shell: bash
489+run: |
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
514+ }
515+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
553551554552 validate_docker_openwebui:
555553needs: [validate_selected_ref, prepare_docker_e2e_image]
556-if: inputs.include_openwebui
554+if: inputs.include_openwebui && !inputs.include_release_path_suites
557555runs-on: blacksmith-32vcpu-ubuntu-2404
558556timeout-minutes: 75
559557env:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。