




















@@ -43,6 +43,7 @@ on:
4343options:
4444 - all
4545 - ci
46+ - plugin-prerelease
4647 - release-checks
4748 - install-smoke
4849 - cross-os
@@ -131,11 +132,16 @@ jobs:
131132 echo "- Child workflow ref: \`${CHILD_WORKFLOW_REF}\`"
132133 echo "- Rerun group: \`${RERUN_GROUP}\`"
133134 if [[ "$RERUN_GROUP" == "all" || "$RERUN_GROUP" == "ci" ]]; then
134- echo "- Normal CI: \`CI\` with \`target_ref=${TARGET_SHA}\` and release-only lanes enabled"
135+ echo "- Normal CI: \`CI\` with \`target_ref=${TARGET_SHA}\`"
135136 else
136137 echo "- Normal CI: skipped by rerun group"
137138 fi
138- if [[ "$RERUN_GROUP" != "ci" && "$RERUN_GROUP" != "npm-telegram" ]]; then
139+ if [[ "$RERUN_GROUP" == "all" || "$RERUN_GROUP" == "plugin-prerelease" ]]; then
140+ echo "- Plugin prerelease: \`Plugin Prerelease\` with \`target_ref=${TARGET_SHA}\`"
141+ else
142+ echo "- Plugin prerelease: skipped by rerun group"
143+ fi
144+ if [[ "$RERUN_GROUP" == "all" || "$RERUN_GROUP" == "release-checks" || "$RERUN_GROUP" == "install-smoke" || "$RERUN_GROUP" == "cross-os" || "$RERUN_GROUP" == "live-e2e" || "$RERUN_GROUP" == "package" || "$RERUN_GROUP" == "qa" || "$RERUN_GROUP" == "qa-parity" || "$RERUN_GROUP" == "qa-live" ]]; then
139145 echo "- Release/live/Docker/package/QA: \`OpenClaw Release Checks\`"
140146 else
141147 echo "- Release/live/Docker/package/QA: skipped by rerun group"
@@ -263,7 +269,105 @@ jobs:
263269 }
264270265271 cancel_same_sha_push_ci
266- dispatch_and_wait ci.yml -f target_ref="$TARGET_SHA" -f full_release_validation=true
272+ dispatch_and_wait ci.yml -f target_ref="$TARGET_SHA" -f include_android=true
273+274+ plugin_prerelease:
275+name: Run plugin prerelease validation
276+needs: [resolve_target]
277+if: contains(fromJSON('["all","plugin-prerelease"]'), inputs.rerun_group)
278+runs-on: ubuntu-24.04
279+timeout-minutes: 300
280+outputs:
281+run_id: ${{ steps.dispatch.outputs.run_id }}
282+url: ${{ steps.dispatch.outputs.url }}
283+conclusion: ${{ steps.dispatch.outputs.conclusion }}
284+steps:
285+ - name: Dispatch and monitor plugin prerelease
286+id: dispatch
287+env:
288+GH_TOKEN: ${{ github.token }}
289+TARGET_REF: ${{ inputs.ref }}
290+TARGET_SHA: ${{ needs.resolve_target.outputs.sha }}
291+CHILD_WORKFLOW_REF: ${{ github.ref_name }}
292+run: |
293+ set -euo pipefail
294+295+ dispatch_and_wait() {
296+ local workflow="$1"
297+ shift
298+299+ local before_json dispatch_output run_id status conclusion url
300+ before_json="$(gh run list --workflow "$workflow" --event workflow_dispatch --limit 100 --json databaseId --jq '[.[].databaseId]')"
301+302+ dispatch_output="$(gh workflow run "$workflow" --ref "$CHILD_WORKFLOW_REF" "$@" 2>&1)"
303+ printf '%s\n' "$dispatch_output"
304+ run_id="$(
305+ printf '%s\n' "$dispatch_output" |
306+ sed -nE 's#.*actions/runs/([0-9]+).*#\1#p' |
307+ tail -n 1
308+ )"
309+310+ if [[ -z "$run_id" ]]; then
311+ for _ in $(seq 1 60); do
312+ run_id="$(
313+ BEFORE_IDS="$before_json" gh run list --workflow "$workflow" --event workflow_dispatch --limit 50 --json databaseId,createdAt \
314+ --jq 'map(select(.databaseId as $id | (env.BEFORE_IDS | fromjson | index($id) | not))) | sort_by(.createdAt) | reverse | .[0].databaseId // empty'
315+ )"
316+ if [[ -n "$run_id" ]]; then
317+ break
318+ fi
319+ sleep 5
320+ done
321+ fi
322+323+ if [[ -z "${run_id:-}" ]]; then
324+ echo "Could not find dispatched run for ${workflow}." >&2
325+ exit 1
326+ fi
327+328+ echo "Dispatched ${workflow}: https://github.com/${GITHUB_REPOSITORY}/actions/runs/${run_id}"
329+ echo "run_id=${run_id}" >> "$GITHUB_OUTPUT"
330+331+ cleanup_child_run() {
332+ local exit_code=$?
333+ trap - EXIT INT TERM
334+ local child_status
335+ child_status="$(gh run view "$run_id" --json status --jq '.status' 2>/dev/null || true)"
336+ if [[ "$child_status" != "completed" ]]; then
337+ echo "Cancelling child ${workflow} run ${run_id} after parent exit (${exit_code})."
338+ gh run cancel "$run_id" || gh api -X POST "repos/${GITHUB_REPOSITORY}/actions/runs/${run_id}/force-cancel" || true
339+ fi
340+ return "$exit_code"
341+ }
342+ trap cleanup_child_run EXIT INT TERM
343+344+ while true; do
345+ status="$(gh run view "$run_id" --json status --jq '.status')"
346+ if [[ "$status" == "completed" ]]; then
347+ break
348+ fi
349+ sleep 30
350+ done
351+ trap - EXIT INT TERM
352+353+ conclusion="$(gh run view "$run_id" --json conclusion --jq '.conclusion')"
354+ url="$(gh run view "$run_id" --json url --jq '.url')"
355+ echo "${workflow} finished with ${conclusion}: ${url}"
356+ echo "url=${url}" >> "$GITHUB_OUTPUT"
357+ echo "conclusion=${conclusion}" >> "$GITHUB_OUTPUT"
358+ if [[ "$conclusion" != "success" ]]; then
359+ gh run view "$run_id" --json jobs --jq '.jobs[] | select(.conclusion != "success" and .conclusion != "skipped") | {name, conclusion, url}' || true
360+ fi
361+ }
362+363+ {
364+ echo "### Plugin prerelease"
365+ echo
366+ echo "- Target ref: \`${TARGET_REF}\`"
367+ echo "- Target SHA: \`${TARGET_SHA}\`"
368+ } >> "$GITHUB_STEP_SUMMARY"
369+370+ dispatch_and_wait plugin-prerelease.yml -f target_ref="$TARGET_SHA" -f expected_sha="$TARGET_SHA"
267371268372 release_checks:
269373name: Run release/live/Docker/QA validation
@@ -467,7 +571,7 @@ jobs:
467571468572 summary:
469573name: Verify full validation
470-needs: [normal_ci, release_checks, npm_telegram]
574+needs: [normal_ci, plugin_prerelease, release_checks, npm_telegram]
471575if: always()
472576runs-on: ubuntu-24.04
473577timeout-minutes: 5
@@ -532,9 +636,11 @@ jobs:
532636env:
533637GH_TOKEN: ${{ github.token }}
534638NORMAL_CI_RUN_ID: ${{ needs.normal_ci.outputs.run_id }}
639+PLUGIN_PRERELEASE_RUN_ID: ${{ needs.plugin_prerelease.outputs.run_id }}
535640RELEASE_CHECKS_RUN_ID: ${{ needs.release_checks.outputs.run_id }}
536641NPM_TELEGRAM_RUN_ID: ${{ needs.npm_telegram.outputs.run_id }}
537642NORMAL_CI_RESULT: ${{ needs.normal_ci.result }}
643+PLUGIN_PRERELEASE_RESULT: ${{ needs.plugin_prerelease.result }}
538644RELEASE_CHECKS_RESULT: ${{ needs.release_checks.result }}
539645NPM_TELEGRAM_RESULT: ${{ needs.npm_telegram.result }}
540646run: |
@@ -604,6 +710,12 @@ jobs:
604710 check_child "normal_ci" "$NORMAL_CI_RUN_ID" 1 || failed=1
605711 fi
606712713+ if [[ "$PLUGIN_PRERELEASE_RESULT" == "skipped" && -z "${PLUGIN_PRERELEASE_RUN_ID// }" ]]; then
714+ check_child "plugin_prerelease" "" 0 || failed=1
715+ else
716+ check_child "plugin_prerelease" "$PLUGIN_PRERELEASE_RUN_ID" 1 || failed=1
717+ fi
718+607719 if [[ "$RELEASE_CHECKS_RESULT" == "skipped" && -z "${RELEASE_CHECKS_RUN_ID// }" ]]; then
608720 check_child "release_checks" "" 0 || failed=1
609721 else
@@ -617,6 +729,7 @@ jobs:
617729 fi
618730619731 summarize_child_timing "normal_ci" "$NORMAL_CI_RUN_ID"
732+ summarize_child_timing "plugin_prerelease" "$PLUGIN_PRERELEASE_RUN_ID"
620733 summarize_child_timing "release_checks" "$RELEASE_CHECKS_RUN_ID"
621734 summarize_child_timing "npm_telegram" "$NPM_TELEGRAM_RUN_ID"
622735此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。