
























@@ -450,9 +450,18 @@ jobs:
450450 - chunk_id: plugins-runtime-install-b
451451label: plugins/runtime install B
452452timeout_minutes: 180
453- - chunk_id: bundled-channels
454-label: bundled channels
455-timeout_minutes: 180
453+ - chunk_id: bundled-channels-core
454+label: bundled channels core
455+timeout_minutes: 90
456+ - chunk_id: bundled-channels-update-a
457+label: bundled channels update A
458+timeout_minutes: 90
459+ - chunk_id: bundled-channels-update-b
460+label: bundled channels update B
461+timeout_minutes: 90
462+ - chunk_id: bundled-channels-contracts
463+label: bundled channels contracts
464+timeout_minutes: 90
456465env:
457466OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
458467OPENAI_BASE_URL: ${{ secrets.OPENAI_BASE_URL }}
@@ -629,12 +638,43 @@ jobs:
629638path: .artifacts/docker-tests/
630639if-no-files-found: ignore
631640641+plan_docker_lane_groups:
642+needs: validate_selected_ref
643+if: inputs.docker_lanes != ''
644+runs-on: ubuntu-24.04
645+timeout-minutes: 5
646+outputs:
647+groups_json: ${{ steps.plan.outputs.groups_json }}
648+steps:
649+ - name: Plan targeted Docker lane groups
650+id: plan
651+shell: bash
652+env:
653+LANES: ${{ inputs.docker_lanes }}
654+run: |
655+ set -euo pipefail
656+ groups_json="$(
657+ LANES="$LANES" node <<'NODE'
658+ const lanes = [...new Set(String(process.env.LANES || "").split(/[,\s]+/u).map((lane) => lane.trim()).filter(Boolean))];
659+ if (lanes.length === 0) {
660+ throw new Error("docker_lanes is required when planning targeted Docker lane groups.");
661+ }
662+ const sanitize = (lane) => lane.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "targeted";
663+ process.stdout.write(JSON.stringify(lanes.map((lane) => ({ label: sanitize(lane), docker_lanes: lane }))));
664+ NODE
665+ )"
666+ echo "groups_json=${groups_json}" >> "$GITHUB_OUTPUT"
667+632668 validate_docker_lanes:
633-needs: [validate_selected_ref, prepare_docker_e2e_image]
669+needs: [validate_selected_ref, prepare_docker_e2e_image, plan_docker_lane_groups]
634670if: inputs.docker_lanes != ''
635-name: Docker E2E targeted lanes
671+name: Docker E2E targeted lanes (${{ matrix.group.label }})
636672runs-on: blacksmith-32vcpu-ubuntu-2404
637673timeout-minutes: 180
674+strategy:
675+fail-fast: false
676+matrix:
677+group: ${{ fromJson(needs.plan_docker_lane_groups.outputs.groups_json) }}
638678env:
639679OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
640680OPENAI_BASE_URL: ${{ secrets.OPENAI_BASE_URL }}
@@ -688,7 +728,7 @@ jobs:
688728OPENCLAW_CURRENT_PACKAGE_TGZ: .artifacts/docker-e2e-package/openclaw-current.tgz
689729OPENCLAW_SKIP_DOCKER_BUILD: "1"
690730INCLUDE_OPENWEBUI: ${{ inputs.include_openwebui }}
691-DOCKER_E2E_LANES: ${{ inputs.docker_lanes }}
731+DOCKER_E2E_LANES: ${{ matrix.group.docker_lanes }}
692732steps:
693733 - name: Checkout selected ref
694734uses: actions/checkout@v6
@@ -733,6 +773,8 @@ jobs:
733773 plan_path=".artifacts/docker-tests/targeted-plan.json"
734774 node scripts/test-docker-all.mjs --plan-json > "$plan_path"
735775 node scripts/docker-e2e.mjs github-outputs "$plan_path" >> "$GITHUB_OUTPUT"
776+ suffix="$(printf '%s' "$LANES" | tr ',[:space:]' '-' | tr -cd 'A-Za-z0-9._-' | sed -E 's/-+/-/g; s/^-//; s/-$//')"
777+ echo "artifact_suffix=${suffix:-targeted}" >> "$GITHUB_OUTPUT"
736778 echo "plan_json=$plan_path" >> "$GITHUB_OUTPUT"
737779738780 - name: Download OpenClaw Docker E2E package
@@ -782,8 +824,8 @@ jobs:
782824 export OPENCLAW_DOCKER_ALL_PREFLIGHT=0
783825 export OPENCLAW_DOCKER_ALL_FAIL_FAST=0
784826 export OPENCLAW_DOCKER_ALL_INCLUDE_OPENWEBUI="${INCLUDE_OPENWEBUI}"
785- export OPENCLAW_DOCKER_ALL_LOG_DIR=".artifacts/docker-tests/targeted"
786- export OPENCLAW_DOCKER_ALL_TIMINGS_FILE=".artifacts/docker-tests/targeted-timings.json"
827+ export OPENCLAW_DOCKER_ALL_LOG_DIR=".artifacts/docker-tests/targeted-${{ steps.plan.outputs.artifact_suffix }}"
828+ export OPENCLAW_DOCKER_ALL_TIMINGS_FILE=".artifacts/docker-tests/targeted-${{ steps.plan.outputs.artifact_suffix }}-timings.json"
787829 export OPENCLAW_DOCKER_ALL_PNPM_COMMAND="$(command -v pnpm)"
788830 if [[ "${{ steps.plan.outputs.needs_live_image }}" == "1" ]]; then
789831 pnpm test:docker:live-build
@@ -797,7 +839,7 @@ jobs:
797839shell: bash
798840run: |
799841 set -euo pipefail
800- summary=".artifacts/docker-tests/targeted/summary.json"
842+ summary=".artifacts/docker-tests/targeted-${{ steps.plan.outputs.artifact_suffix }}/summary.json"
801843 if [[ ! -f "$summary" ]]; then
802844 echo "Docker targeted summary missing: \`$summary\`" >> "$GITHUB_STEP_SUMMARY"
803845 exit 0
@@ -808,7 +850,7 @@ jobs:
808850if: always()
809851uses: actions/upload-artifact@v7
810852with:
811-name: docker-e2e-targeted
853+name: docker-e2e-${{ steps.plan.outputs.artifact_suffix }}
812854path: .artifacts/docker-tests/
813855if-no-files-found: ignore
814856此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。