diff --git a/.github/workflows/maturity-scorecard.yml b/.github/workflows/maturity-scorecard.yml index 6e341a876573..59ec8c32f5bd 100644 --- a/.github/workflows/maturity-scorecard.yml +++ b/.github/workflows/maturity-scorecard.yml @@ -45,6 +45,12 @@ on: OPENCLAW_MATURITY_SCORECARD_AGENT_OPENAI_API_KEY: description: Optional OpenAI API key used by maturity scorecard agent steps required: false + OPENCLAW_QA_CONVEX_SITE_URL: + description: Optional Convex credential broker URL supplied by qa-live-shared + required: false + OPENCLAW_QA_CONVEX_SECRET_CI: + description: Optional Convex CI credential supplied by qa-live-shared + required: false # Mixed-trigger workflows must declare referenced secrets for actionlint. Reusable calls # remain artifact-only because exact caller and job workflow identities gate every use. CLAWSWEEPER_APP_PRIVATE_KEY: @@ -317,6 +323,8 @@ jobs: qa_profile: all secrets: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENCLAW_QA_CONVEX_SITE_URL: ${{ secrets.OPENCLAW_QA_CONVEX_SITE_URL }} + OPENCLAW_QA_CONVEX_SECRET_CI: ${{ secrets.OPENCLAW_QA_CONVEX_SECRET_CI }} publish: name: Publish maturity docs PR diff --git a/.github/workflows/openclaw-release-checks.yml b/.github/workflows/openclaw-release-checks.yml index 01eab0d64d3d..12461bd8d2fc 100644 --- a/.github/workflows/openclaw-release-checks.yml +++ b/.github/workflows/openclaw-release-checks.yml @@ -971,6 +971,8 @@ jobs: expected_sha: ${{ needs.resolve_target.outputs.revision }} secrets: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENCLAW_QA_CONVEX_SITE_URL: ${{ secrets.OPENCLAW_QA_CONVEX_SITE_URL }} + OPENCLAW_QA_CONVEX_SECRET_CI: ${{ secrets.OPENCLAW_QA_CONVEX_SECRET_CI }} qa_lab_parity_lane_release_checks: name: Run QA Lab parity lane (${{ matrix.lane }}) diff --git a/test/scripts/ci-workflow-guards.test.ts b/test/scripts/ci-workflow-guards.test.ts index 206aa26e52f2..080743c188d2 100644 --- a/test/scripts/ci-workflow-guards.test.ts +++ b/test/scripts/ci-workflow-guards.test.ts @@ -4607,8 +4607,15 @@ printf '%s\n' "\${CURL_SUCCESS_IP:-203.0.113.7}" "MANTIS_GITHUB_APP_PRIVATE_KEY", "OPENAI_API_KEY", "OPENCLAW_MATURITY_SCORECARD_AGENT_OPENAI_API_KEY", + "OPENCLAW_QA_CONVEX_SECRET_CI", + "OPENCLAW_QA_CONVEX_SITE_URL", ]); - for (const secret of ["CLAWSWEEPER_APP_PRIVATE_KEY", "MANTIS_GITHUB_APP_PRIVATE_KEY"]) { + for (const secret of [ + "CLAWSWEEPER_APP_PRIVATE_KEY", + "MANTIS_GITHUB_APP_PRIVATE_KEY", + "OPENCLAW_QA_CONVEX_SECRET_CI", + "OPENCLAW_QA_CONVEX_SITE_URL", + ]) { expect(maturityWorkflow.on.workflow_call.secrets[secret].required).toBe(false); } expect(qaEvidenceWorkflow.on.workflow_dispatch.inputs).not.toHaveProperty("fail_on_qa_failure"); @@ -4645,6 +4652,11 @@ printf '%s\n' "\${CURL_SUCCESS_IP:-203.0.113.7}" qa_profile: "all", }); expect(generateJob.with).not.toHaveProperty("fail_on_qa_failure"); + expect(generateJob.secrets).toMatchObject({ + OPENAI_API_KEY: "${{ secrets.OPENAI_API_KEY }}", + OPENCLAW_QA_CONVEX_SECRET_CI: "${{ secrets.OPENCLAW_QA_CONVEX_SECRET_CI }}", + OPENCLAW_QA_CONVEX_SITE_URL: "${{ secrets.OPENCLAW_QA_CONVEX_SITE_URL }}", + }); const workflowStep = maturityWorkflow.jobs.validate_selected_ref.steps.find( (step: WorkflowStep) => step.name === "Resolve job workflow identity", @@ -5019,7 +5031,11 @@ printf '%s\n' "\${CURL_SUCCESS_IP:-203.0.113.7}" }); expect(job.with).not.toHaveProperty("qa_profile"); expect(job.with).not.toHaveProperty("publish_pull_request"); - expect(Object.keys(job.secrets)).toEqual(["OPENAI_API_KEY"]); + expect(job.secrets).toMatchObject({ + OPENAI_API_KEY: "${{ secrets.OPENAI_API_KEY }}", + OPENCLAW_QA_CONVEX_SECRET_CI: "${{ secrets.OPENCLAW_QA_CONVEX_SECRET_CI }}", + OPENCLAW_QA_CONVEX_SITE_URL: "${{ secrets.OPENCLAW_QA_CONVEX_SITE_URL }}", + }); expect(summaryJob.needs).toContain("maturity_scorecard_release_checks"); expect(verifyStep.env.MATURITY_SCORECARD_RELEASE_CHECKS_RESULT).toBe( "${{ needs.maturity_scorecard_release_checks.result }}",