From 58552f6d7c8b20f68a8c6539a4599ecfb5abef43 Mon Sep 17 00:00:00 2001 From: Vincent Koc <25068+vincentkoc@users.noreply.github.com> Date: Tue, 23 Jun 2026 23:29:26 +0800 Subject: [PATCH] ci: make release maturity scorecard opt-in --- .github/workflows/openclaw-release-checks.yml | 18 +++++++++++++++++- test/scripts/ci-workflow-guards.test.ts | 19 +++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/.github/workflows/openclaw-release-checks.yml b/.github/workflows/openclaw-release-checks.yml index 748f1c159c57..7ccf77368afc 100644 --- a/.github/workflows/openclaw-release-checks.yml +++ b/.github/workflows/openclaw-release-checks.yml @@ -44,6 +44,11 @@ on: required: false default: false type: boolean + run_maturity_scorecard: + description: Render advisory maturity scorecard release docs; default release checks rely on dedicated package, QA, live, and E2E gates + required: false + default: false + type: boolean rerun_group: description: Release check group to run required: false @@ -106,6 +111,7 @@ jobs: mode: ${{ steps.inputs.outputs.mode }} release_profile: ${{ steps.inputs.outputs.release_profile }} run_release_soak: ${{ steps.inputs.outputs.run_release_soak }} + run_maturity_scorecard: ${{ steps.inputs.outputs.run_maturity_scorecard }} rerun_group: ${{ steps.inputs.outputs.rerun_group }} live_suite_filter: ${{ steps.inputs.outputs.live_suite_filter }} cross_os_suite_filter: ${{ steps.inputs.outputs.cross_os_suite_filter }} @@ -279,6 +285,7 @@ jobs: RELEASE_MODE_INPUT: ${{ inputs.mode }} RELEASE_PROFILE_INPUT: ${{ inputs.release_profile }} RELEASE_RUN_RELEASE_SOAK_INPUT: ${{ inputs.run_release_soak }} + RELEASE_RUN_MATURITY_SCORECARD_INPUT: ${{ inputs.run_maturity_scorecard }} RELEASE_RERUN_GROUP_INPUT: ${{ inputs.rerun_group }} RELEASE_LIVE_SUITE_FILTER_INPUT: ${{ inputs.live_suite_filter }} RELEASE_CROSS_OS_SUITE_FILTER_INPUT: ${{ inputs.cross_os_suite_filter }} @@ -319,6 +326,12 @@ jobs: else run_release_soak=true fi + run_maturity_scorecard="$(printf '%s' "$RELEASE_RUN_MATURITY_SCORECARD_INPUT" | tr '[:upper:]' '[:lower:]')" + if [[ "$run_maturity_scorecard" != "true" && "$run_maturity_scorecard" != "1" && "$run_maturity_scorecard" != "yes" ]]; then + run_maturity_scorecard=false + else + run_maturity_scorecard=true + fi release_profile="$RELEASE_PROFILE_INPUT" if [[ "$release_profile" == "minimum" ]]; then release_profile=beta @@ -422,6 +435,7 @@ jobs: printf 'mode=%s\n' "$RELEASE_MODE_INPUT" printf 'release_profile=%s\n' "$release_profile" printf 'run_release_soak=%s\n' "$run_release_soak" + printf 'run_maturity_scorecard=%s\n' "$run_maturity_scorecard" printf 'rerun_group=%s\n' "$RELEASE_RERUN_GROUP_INPUT" printf 'live_suite_filter=%s\n' "$RELEASE_LIVE_SUITE_FILTER_INPUT" printf 'cross_os_suite_filter=%s\n' "$RELEASE_CROSS_OS_SUITE_FILTER_INPUT" @@ -444,6 +458,7 @@ jobs: RELEASE_MODE: ${{ inputs.mode }} RELEASE_PROFILE: ${{ steps.inputs.outputs.release_profile }} RUN_RELEASE_SOAK: ${{ steps.inputs.outputs.run_release_soak }} + RUN_MATURITY_SCORECARD: ${{ steps.inputs.outputs.run_maturity_scorecard }} RELEASE_RERUN_GROUP: ${{ inputs.rerun_group }} RELEASE_LIVE_SUITE_FILTER: ${{ inputs.live_suite_filter }} RELEASE_CROSS_OS_SUITE_FILTER: ${{ inputs.cross_os_suite_filter }} @@ -461,6 +476,7 @@ jobs: echo "- Cross-OS mode: \`${RELEASE_MODE}\`" echo "- Release profile: \`${RELEASE_PROFILE}\`" echo "- Release soak lanes: \`${RUN_RELEASE_SOAK}\`" + echo "- Maturity scorecard docs: \`${RUN_MATURITY_SCORECARD}\`" echo "- Rerun group: \`${RELEASE_RERUN_GROUP}\`" if [[ -n "${RELEASE_LIVE_SUITE_FILTER// }" ]]; then echo "- Live suite filter: \`${RELEASE_LIVE_SUITE_FILTER}\`" @@ -770,7 +786,7 @@ jobs: maturity_scorecard_release_checks: name: Render maturity scorecard release docs needs: [resolve_target] - if: contains(fromJSON('["all","qa"]'), needs.resolve_target.outputs.rerun_group) + if: contains(fromJSON('["all","qa"]'), needs.resolve_target.outputs.rerun_group) && needs.resolve_target.outputs.run_maturity_scorecard == 'true' permissions: actions: read contents: read diff --git a/test/scripts/ci-workflow-guards.test.ts b/test/scripts/ci-workflow-guards.test.ts index 6a0cb9af7abe..d56d72adffe3 100644 --- a/test/scripts/ci-workflow-guards.test.ts +++ b/test/scripts/ci-workflow-guards.test.ts @@ -727,18 +727,33 @@ describe("ci workflow guards", () => { expect(openDocsPrStep.if).toBe("${{ github.event_name == 'workflow_dispatch' }}"); }); - it("runs maturity scorecard from release checks", () => { + it("keeps maturity scorecard release docs opt-in from release checks", () => { const releaseWorkflow = readReleaseChecksWorkflow(); const job = releaseWorkflow.jobs.maturity_scorecard_release_checks; const summaryJob = releaseWorkflow.jobs.summary; const verifyStep = summaryJob.steps.find( (step) => step.name === "Verify release check results", ); + const inputs = releaseWorkflow.on.workflow_dispatch.inputs; + const resolveJob = releaseWorkflow.jobs.resolve_target; + const summarizeStep = resolveJob.steps.find((step) => step.name === "Summarize validated ref"); expect(releaseWorkflow.jobs).not.toHaveProperty("qa_profile_release_evidence_release_checks"); + expect(inputs.run_maturity_scorecard).toMatchObject({ + required: false, + default: false, + type: "boolean", + }); + expect(resolveJob.outputs.run_maturity_scorecard).toBe( + "${{ steps.inputs.outputs.run_maturity_scorecard }}", + ); + expect(summarizeStep.env.RUN_MATURITY_SCORECARD).toBe( + "${{ steps.inputs.outputs.run_maturity_scorecard }}", + ); + expect(summarizeStep.run).toContain("- Maturity scorecard docs:"); expect(job.name).toBe("Render maturity scorecard release docs"); expect(job.if).toBe( - 'contains(fromJSON(\'["all","qa"]\'), needs.resolve_target.outputs.rerun_group)', + "contains(fromJSON('[\"all\",\"qa\"]'), needs.resolve_target.outputs.rerun_group) && needs.resolve_target.outputs.run_maturity_scorecard == 'true'", ); expect(job.permissions).toMatchObject({ actions: "read",