


























@@ -58,6 +58,7 @@ on:
5858 - qa-parity
5959 - qa-live
6060 - npm-telegram
61+ - performance
6162live_suite_filter:
6263description: Optional exact live/E2E suite id, or comma-separated QA live lanes such as qa-live-matrix,qa-live-telegram; blank runs all selected live suites
6364required: false
@@ -181,6 +182,11 @@ jobs:
181182 else
182183 echo "- Normal CI: skipped by rerun group"
183184 fi
185+ if [[ "$RERUN_GROUP" == "all" || "$RERUN_GROUP" == "performance" ]]; then
186+ echo "- Product performance: \`OpenClaw Performance\` with \`target_ref=${TARGET_SHA}\`"
187+ else
188+ echo "- Product performance: skipped by rerun group"
189+ fi
184190 if [[ "$RERUN_GROUP" == "all" || "$RERUN_GROUP" == "plugin-prerelease" ]]; then
185191 echo "- Plugin prerelease: \`Plugin Prerelease\` with \`target_ref=${TARGET_SHA}\`"
186192 else
@@ -938,9 +944,127 @@ jobs:
938944 exit 1
939945 fi
940946947+ performance:
948+name: Run product performance evidence
949+needs: [resolve_target, docker_runtime_assets_preflight]
950+if: ${{ always() && needs.resolve_target.result == 'success' && contains(fromJSON('["all","performance"]'), inputs.rerun_group) && (inputs.rerun_group != 'all' || needs.docker_runtime_assets_preflight.result == 'success') }}
951+runs-on: ubuntu-24.04
952+timeout-minutes: 120
953+outputs:
954+run_id: ${{ steps.dispatch.outputs.run_id }}
955+url: ${{ steps.dispatch.outputs.url }}
956+conclusion: ${{ steps.dispatch.outputs.conclusion }}
957+steps:
958+ - name: Dispatch and monitor OpenClaw Performance
959+id: dispatch
960+env:
961+GH_TOKEN: ${{ github.token }}
962+TARGET_SHA: ${{ needs.resolve_target.outputs.sha }}
963+CHILD_WORKFLOW_REF: ${{ github.ref_name }}
964+run: |
965+ set -euo pipefail
966+967+ gh_with_retry() {
968+ local output status attempt
969+ for attempt in 1 2 3 4 5 6; do
970+ set +e
971+ output="$(gh "$@" 2>&1)"
972+ status=$?
973+ set -e
974+ if [[ "$status" -eq 0 ]]; then
975+ printf '%s\n' "$output"
976+ return 0
977+ fi
978+ if [[ "$output" == *"Bad credentials"* || "$output" == *"HTTP 401"* || "$output" == *"secondary rate limit"* || "$output" == *"API rate limit"* ]]; then
979+ echo "::warning::gh $* failed on attempt ${attempt}: ${output}" >&2
980+ sleep $((attempt * 10))
981+ continue
982+ fi
983+ printf '%s\n' "$output" >&2
984+ return "$status"
985+ done
986+ printf '%s\n' "$output" >&2
987+ return "$status"
988+ }
989+990+ {
991+ echo "### Product performance"
992+ echo
993+ echo "- Target SHA: \`${TARGET_SHA}\`"
994+ echo "- Profile: \`release\`"
995+ echo "- Repeat: \`3\`"
996+ echo "- Deep profile: \`false\`"
997+ echo "- Live OpenAI candidate: \`false\`"
998+ echo "- Release impact: advisory"
999+ } >> "$GITHUB_STEP_SUMMARY"
1000+1001+ before_json="$(gh_with_retry run list --workflow openclaw-performance.yml --event workflow_dispatch --limit 100 --json databaseId --jq '[.[].databaseId]')"
1002+1003+ gh_with_retry workflow run openclaw-performance.yml \
1004+ --ref "$CHILD_WORKFLOW_REF" \
1005+ -f target_ref="$TARGET_SHA" \
1006+ -f profile=release \
1007+ -f repeat=3 \
1008+ -f deep_profile=false \
1009+ -f live_openai_candidate=false \
1010+ -f fail_on_regression=false
1011+1012+ run_id=""
1013+ for _ in $(seq 1 60); do
1014+ run_id="$(
1015+ BEFORE_IDS="$before_json" gh_with_retry run list --workflow openclaw-performance.yml --event workflow_dispatch --limit 50 --json databaseId,createdAt \
1016+ --jq 'map(select(.databaseId as $id | (env.BEFORE_IDS | fromjson | index($id) | not))) | sort_by(.createdAt) | reverse | .[0].databaseId // empty'
1017+ )"
1018+ if [[ -n "$run_id" ]]; then
1019+ break
1020+ fi
1021+ sleep 5
1022+ done
1023+1024+ if [[ -z "$run_id" ]]; then
1025+ echo "::warning::Could not find dispatched run for openclaw-performance.yml."
1026+ exit 0
1027+ fi
1028+1029+ echo "Dispatched openclaw-performance.yml: https://github.com/${GITHUB_REPOSITORY}/actions/runs/${run_id}"
1030+ echo "run_id=${run_id}" >> "$GITHUB_OUTPUT"
1031+1032+ cancel_child() {
1033+ if [[ -n "${run_id:-}" ]]; then
1034+ echo "Cancelling child workflow openclaw-performance.yml: ${run_id}" >&2
1035+ gh run cancel "$run_id" >/dev/null 2>&1 || true
1036+ fi
1037+ }
1038+ trap cancel_child EXIT INT TERM
1039+1040+ poll_count=0
1041+ while true; do
1042+ status="$(gh_with_retry run view "$run_id" --json status --jq '.status')"
1043+ if [[ "$status" == "completed" ]]; then
1044+ break
1045+ fi
1046+ poll_count=$((poll_count + 1))
1047+ if (( poll_count % 10 == 0 )); then
1048+ echo "Still waiting on openclaw-performance.yml: https://github.com/${GITHUB_REPOSITORY}/actions/runs/${run_id}"
1049+ gh_with_retry run view "$run_id" --json jobs --jq '.jobs[] | select(.status != "completed") | {name, status, url}' || true
1050+ fi
1051+ sleep 30
1052+ done
1053+ trap - EXIT INT TERM
1054+1055+ conclusion="$(gh_with_retry run view "$run_id" --json conclusion --jq '.conclusion')"
1056+ url="$(gh_with_retry run view "$run_id" --json url --jq '.url')"
1057+ echo "openclaw-performance.yml finished with ${conclusion}: ${url}"
1058+ echo "url=${url}" >> "$GITHUB_OUTPUT"
1059+ echo "conclusion=${conclusion}" >> "$GITHUB_OUTPUT"
1060+ if [[ "$conclusion" != "success" ]]; then
1061+ echo "::warning::OpenClaw Performance is advisory and ended with ${conclusion}: ${url}"
1062+ gh_with_retry run view "$run_id" --json jobs --jq '.jobs[] | select(.conclusion != "success" and .conclusion != "skipped") | {name, conclusion, url}' || true
1063+ fi
1064+9411065 summary:
9421066name: Verify full validation
943-needs: [resolve_target, docker_runtime_assets_preflight, normal_ci, plugin_prerelease, release_checks, npm_telegram]
1067+needs: [resolve_target, docker_runtime_assets_preflight, normal_ci, plugin_prerelease, release_checks, npm_telegram, performance]
9441068if: always()
9451069runs-on: ubuntu-24.04
9461070timeout-minutes: 5
@@ -952,10 +1076,12 @@ jobs:
9521076PLUGIN_PRERELEASE_RUN_ID: ${{ needs.plugin_prerelease.outputs.run_id }}
9531077RELEASE_CHECKS_RUN_ID: ${{ needs.release_checks.outputs.run_id }}
9541078NPM_TELEGRAM_RUN_ID: ${{ needs.npm_telegram.outputs.run_id }}
1079+PERFORMANCE_RUN_ID: ${{ needs.performance.outputs.run_id }}
9551080NORMAL_CI_RESULT: ${{ needs.normal_ci.result }}
9561081PLUGIN_PRERELEASE_RESULT: ${{ needs.plugin_prerelease.result }}
9571082RELEASE_CHECKS_RESULT: ${{ needs.release_checks.result }}
9581083NPM_TELEGRAM_RESULT: ${{ needs.npm_telegram.result }}
1084+PERFORMANCE_RESULT: ${{ needs.performance.result }}
9591085DOCKER_RUNTIME_ASSETS_PREFLIGHT_RESULT: ${{ needs.docker_runtime_assets_preflight.result }}
9601086RERUN_GROUP: ${{ inputs.rerun_group }}
9611087TARGET_SHA: ${{ needs.resolve_target.outputs.sha }}
@@ -1088,6 +1214,7 @@ jobs:
10881214 append_child_row "plugin_prerelease" "$PLUGIN_PRERELEASE_RUN_ID" "$PLUGIN_PRERELEASE_RESULT"
10891215 append_child_row "release_checks" "$RELEASE_CHECKS_RUN_ID" "$RELEASE_CHECKS_RESULT"
10901216 append_child_row "npm_telegram" "$NPM_TELEGRAM_RUN_ID" "$NPM_TELEGRAM_RESULT"
1217+ append_child_row "product_performance" "$PERFORMANCE_RUN_ID" "$PERFORMANCE_RESULT"
10911218 }
1092121910931220 summarize_child_timing() {
@@ -1246,6 +1373,7 @@ jobs:
12461373 summarize_child_timing "plugin_prerelease" "$PLUGIN_PRERELEASE_RUN_ID"
12471374 summarize_child_timing "release_checks" "$RELEASE_CHECKS_RUN_ID"
12481375 summarize_child_timing "npm_telegram" "$NPM_TELEGRAM_RUN_ID"
1376+ summarize_child_timing "product_performance" "$PERFORMANCE_RUN_ID"
1249137712501378 if [[ "$failed" != "0" ]]; then
12511379 summarize_failed_child "normal_ci" "$NORMAL_CI_RUN_ID"
@@ -1361,6 +1489,7 @@ jobs:
13611489 --arg pluginPrereleaseRunId "$PLUGIN_PRERELEASE_RUN_ID" \
13621490 --arg releaseChecksRunId "$RELEASE_CHECKS_RUN_ID" \
13631491 --arg npmTelegramRunId "$NPM_TELEGRAM_RUN_ID" \
1492+ --arg performanceRunId "$PERFORMANCE_RUN_ID" \
13641493 '{
13651494 version: 1,
13661495 workflowName: $workflowName,
@@ -1376,7 +1505,8 @@ jobs:
13761505 normalCi: $normalCiRunId,
13771506 pluginPrerelease: $pluginPrereleaseRunId,
13781507 releaseChecks: $releaseChecksRunId,
1379- npmTelegram: $npmTelegramRunId
1508+ npmTelegram: $npmTelegramRunId,
1509+ productPerformance: $performanceRunId
13801510 }
13811511 }' > "${manifest_dir}/full-release-validation-manifest.json"
13821512此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。