
























@@ -59,6 +59,10 @@ jobs:
5959checks_node_core_dist_matrix: ${{ steps.manifest.outputs.checks_node_core_dist_matrix }}
6060run_check: ${{ steps.manifest.outputs.run_check }}
6161run_check_additional: ${{ steps.manifest.outputs.run_check_additional }}
62+run_plugin_prerelease_suite: ${{ steps.manifest.outputs.run_plugin_prerelease_suite }}
63+plugin_prerelease_ref: ${{ steps.manifest.outputs.plugin_prerelease_ref }}
64+plugin_prerelease_static_matrix: ${{ steps.manifest.outputs.plugin_prerelease_static_matrix }}
65+plugin_prerelease_docker_lanes: ${{ steps.manifest.outputs.plugin_prerelease_docker_lanes }}
6266run_build_smoke: ${{ steps.manifest.outputs.run_build_smoke }}
6367run_check_docs: ${{ steps.manifest.outputs.run_check_docs }}
6468run_control_ui_i18n: ${{ steps.manifest.outputs.run_control_ui_i18n }}
@@ -124,13 +128,20 @@ jobs:
124128OPENCLAW_CI_RUN_NODE_FAST_CI_ROUTING: ${{ github.event_name == 'workflow_dispatch' && 'false' || steps.changed_scope.outputs.run_node_fast_ci_routing || 'false' }}
125129OPENCLAW_CI_RUN_SKILLS_PYTHON: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.changed_scope.outputs.run_skills_python || 'false' }}
126130OPENCLAW_CI_RUN_CONTROL_UI_I18N: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.changed_scope.outputs.run_control_ui_i18n || 'false' }}
131+OPENCLAW_CI_CHECKOUT_REVISION: ${{ steps.checkout_ref.outputs.sha }}
132+OPENCLAW_CI_EVENT_NAME: ${{ github.event_name }}
133+OPENCLAW_CI_PR_HEAD_REPOSITORY: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name || github.repository }}
134+OPENCLAW_CI_PR_HEAD_SHA: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || '' }}
127135OPENCLAW_CI_REPOSITORY: ${{ github.repository }}
128136run: |
129137 node --input-type=module <<'EOF'
130138 import { appendFileSync } from "node:fs";
131139 import {
132140 createNodeTestShards,
133141 } from "./scripts/lib/ci-node-test-plan.mjs";
142+ import {
143+ assertPluginPrereleaseTestPlanComplete,
144+ } from "./scripts/lib/plugin-prerelease-test-plan.mjs";
134145 import {
135146 createChannelContractTestShards,
136147 } from "./scripts/lib/channel-contract-test-plan.mjs";
@@ -173,6 +184,16 @@ jobs:
173184 const runSkillsPython = parseBoolean(process.env.OPENCLAW_CI_RUN_SKILLS_PYTHON) && !docsOnly;
174185 const runControlUiI18n =
175186 parseBoolean(process.env.OPENCLAW_CI_RUN_CONTROL_UI_I18N) && !docsOnly;
187+ const pluginPrereleasePlan = assertPluginPrereleaseTestPlanComplete();
188+ const trustedPluginPrereleaseRef =
189+ process.env.OPENCLAW_CI_EVENT_NAME !== "pull_request" ||
190+ process.env.OPENCLAW_CI_PR_HEAD_REPOSITORY === process.env.OPENCLAW_CI_REPOSITORY;
191+ const pluginPrereleaseRef =
192+ process.env.OPENCLAW_CI_EVENT_NAME === "pull_request" && trustedPluginPrereleaseRef
193+ ? process.env.OPENCLAW_CI_PR_HEAD_SHA
194+ : process.env.OPENCLAW_CI_CHECKOUT_REVISION;
195+ const runPluginPrereleaseSuite =
196+ runNodeFull && isCanonicalRepository && trustedPluginPrereleaseRef;
176197 const extensionTestShardCount = isCanonicalRepository
177198 ? DEFAULT_EXTENSION_TEST_SHARD_COUNT
178199 : Math.max(DEFAULT_EXTENSION_TEST_SHARD_COUNT, 36);
@@ -264,6 +285,20 @@ jobs:
264285 checks_node_core_dist_matrix: createMatrix(nodeTestDistShards),
265286 run_check: runNodeFull,
266287 run_check_additional: runNodeFull,
288+ run_plugin_prerelease_suite: runPluginPrereleaseSuite,
289+ plugin_prerelease_ref: runPluginPrereleaseSuite ? pluginPrereleaseRef : "",
290+ plugin_prerelease_static_matrix: createMatrix(
291+ runPluginPrereleaseSuite
292+ ? pluginPrereleasePlan.staticChecks.map((check) => ({
293+ check_name: check.checkName,
294+ command: check.command,
295+ task: check.check,
296+ }))
297+ : [],
298+ ),
299+ plugin_prerelease_docker_lanes: runPluginPrereleaseSuite
300+ ? pluginPrereleasePlan.dockerLanes.join(" ")
301+ : "",
267302 run_build_smoke: runNodeFull,
268303 run_check_docs: docsChanged,
269304 run_control_ui_i18n: runControlUiI18n,
@@ -1621,6 +1656,91 @@ jobs:
16211656 exit 1
16221657 fi
162316581659+ plugin-prerelease-static-shard:
1660+permissions:
1661+contents: read
1662+name: ${{ matrix.check_name }}
1663+needs: [preflight]
1664+if: needs.preflight.outputs.run_plugin_prerelease_suite == 'true'
1665+runs-on: blacksmith-8vcpu-ubuntu-2404
1666+timeout-minutes: 45
1667+strategy:
1668+fail-fast: false
1669+matrix: ${{ fromJson(needs.preflight.outputs.plugin_prerelease_static_matrix) }}
1670+steps:
1671+ - name: Checkout
1672+uses: actions/checkout@v6
1673+with:
1674+ref: ${{ needs.preflight.outputs.checkout_revision }}
1675+fetch-depth: 1
1676+fetch-tags: false
1677+persist-credentials: false
1678+submodules: false
1679+1680+ - name: Setup Node environment
1681+uses: ./.github/actions/setup-node-env
1682+with:
1683+install-bun: "false"
1684+1685+ - name: Run plugin prerelease static shard
1686+env:
1687+PLUGIN_PRERELEASE_COMMAND: ${{ matrix.command }}
1688+PLUGIN_PRERELEASE_TASK: ${{ matrix.task }}
1689+shell: bash
1690+run: |
1691+ set -euo pipefail
1692+ echo "Running ${PLUGIN_PRERELEASE_TASK}: ${PLUGIN_PRERELEASE_COMMAND}"
1693+ bash -c "$PLUGIN_PRERELEASE_COMMAND"
1694+1695+ plugin-prerelease-docker-suite:
1696+name: plugin-prerelease-docker-suite
1697+needs: [preflight]
1698+if: needs.preflight.outputs.run_plugin_prerelease_suite == 'true'
1699+permissions:
1700+actions: read
1701+contents: read
1702+packages: write
1703+pull-requests: read
1704+uses: ./.github/workflows/openclaw-live-and-e2e-checks-reusable.yml
1705+with:
1706+ref: ${{ needs.preflight.outputs.plugin_prerelease_ref }}
1707+include_repo_e2e: false
1708+include_release_path_suites: false
1709+include_openwebui: false
1710+docker_lanes: ${{ needs.preflight.outputs.plugin_prerelease_docker_lanes }}
1711+include_live_suites: false
1712+live_models_only: false
1713+1714+plugin-prerelease-suite:
1715+permissions:
1716+contents: read
1717+name: plugin-prerelease-suite
1718+needs: [preflight, plugin-prerelease-static-shard, plugin-prerelease-docker-suite]
1719+if: ${{ !cancelled() && always() && needs.preflight.outputs.run_plugin_prerelease_suite == 'true' }}
1720+runs-on: ubuntu-24.04
1721+timeout-minutes: 5
1722+steps:
1723+ - name: Verify plugin prerelease suite
1724+env:
1725+DOCKER_RESULT: ${{ needs.plugin-prerelease-docker-suite.result }}
1726+STATIC_RESULT: ${{ needs.plugin-prerelease-static-shard.result }}
1727+shell: bash
1728+run: |
1729+ set -euo pipefail
1730+ failed=0
1731+ for result in \
1732+ "plugin-prerelease-static=${STATIC_RESULT}" \
1733+ "plugin-prerelease-docker=${DOCKER_RESULT}"
1734+ do
1735+ name="${result%%=*}"
1736+ status="${result#*=}"
1737+ if [ "$status" != "success" ]; then
1738+ echo "::error::${name} ended with ${status}"
1739+ failed=1
1740+ fi
1741+ done
1742+ exit "$failed"
1743+16241744 build-smoke:
16251745permissions:
16261746contents: read
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。