diff --git a/.github/codeql/codeql-gateway-runtime-boundary-critical-quality.yml b/.github/codeql/codeql-gateway-runtime-boundary-critical-quality.yml index 8ccd5f1e8d3..0744fdb38d6 100644 --- a/.github/codeql/codeql-gateway-runtime-boundary-critical-quality.yml +++ b/.github/codeql/codeql-gateway-runtime-boundary-critical-quality.yml @@ -14,8 +14,11 @@ query-filters: - security paths: + - src/gateway/method-scopes.ts - src/gateway/protocol - src/gateway/server-methods + - src/gateway/server-methods.ts + - src/gateway/server-methods-list.ts paths-ignore: - "**/node_modules" diff --git a/.github/workflows/codeql-critical-quality.yml b/.github/workflows/codeql-critical-quality.yml index ae33dd42c71..3737b744222 100644 --- a/.github/workflows/codeql-critical-quality.yml +++ b/.github/workflows/codeql-critical-quality.yml @@ -10,6 +10,7 @@ on: type: choice options: - all + - gateway-runtime-boundary - plugin-boundary - plugin-sdk-package-contract - plugin-sdk-reply-runtime @@ -22,6 +23,11 @@ on: - ".github/workflows/codeql-critical-quality.yml" - "packages/plugin-package-contract/**" - "packages/plugin-sdk/**" + - "src/gateway/method-scopes.ts" + - "src/gateway/protocol/**" + - "src/gateway/server-methods/**" + - "src/gateway/server-methods.ts" + - "src/gateway/server-methods-list.ts" - "src/plugin-sdk/**" - "src/plugins/**" schedule: @@ -37,9 +43,64 @@ env: permissions: actions: read contents: read + pull-requests: read security-events: write jobs: + quality-shards: + name: Select Critical Quality shards + runs-on: blacksmith-4vcpu-ubuntu-2404 + timeout-minutes: 5 + outputs: + gateway: ${{ steps.detect.outputs.gateway }} + plugin: ${{ steps.detect.outputs.plugin }} + plugin_sdk_package: ${{ steps.detect.outputs.plugin_sdk_package }} + steps: + - name: Detect PR shard paths + id: detect + env: + EVENT_NAME: ${{ github.event_name }} + GH_TOKEN: ${{ github.token }} + PR_NUMBER: ${{ github.event.pull_request.number }} + REPOSITORY: ${{ github.repository }} + run: | + set -euo pipefail + + gateway=false + plugin=false + plugin_sdk_package=false + + if [[ "${EVENT_NAME}" != "pull_request" ]]; then + gateway=true + plugin=true + plugin_sdk_package=true + else + while IFS= read -r file; do + case "${file}" in + .github/codeql/*|.github/workflows/codeql-critical-quality.yml) + gateway=true + plugin=true + plugin_sdk_package=true + ;; + src/gateway/method-scopes.ts|src/gateway/protocol/*|src/gateway/server-methods/*|src/gateway/server-methods.ts|src/gateway/server-methods-list.ts) + gateway=true + ;; + src/plugin-sdk/*|src/plugins/*) + plugin=true + ;; + packages/plugin-package-contract/*|packages/plugin-sdk/*|src/plugin-sdk/*) + plugin_sdk_package=true + ;; + esac + done < <(gh api --paginate "repos/${REPOSITORY}/pulls/${PR_NUMBER}/files" --jq '.[].filename') + fi + + { + echo "gateway=${gateway}" + echo "plugin=${plugin}" + echo "plugin_sdk_package=${plugin_sdk_package}" + } >> "${GITHUB_OUTPUT}" + core-auth-secrets: name: Critical Quality (core-auth-secrets) if: ${{ github.event_name != 'pull_request' && (github.event_name != 'workflow_dispatch' || inputs.profile == 'all') }} @@ -86,7 +147,8 @@ jobs: gateway-runtime-boundary: name: Critical Quality (gateway-runtime-boundary) - if: ${{ github.event_name != 'pull_request' && (github.event_name != 'workflow_dispatch' || inputs.profile == 'all') }} + needs: quality-shards + if: ${{ needs.quality-shards.outputs.gateway == 'true' && (github.event_name != 'pull_request' || !github.event.pull_request.draft) && (github.event_name == 'pull_request' || github.event_name != 'workflow_dispatch' || inputs.profile == 'all' || inputs.profile == 'gateway-runtime-boundary') }} runs-on: blacksmith-4vcpu-ubuntu-2404 timeout-minutes: 25 steps: @@ -306,7 +368,8 @@ jobs: plugin-boundary: name: Critical Quality (plugin-boundary) - if: ${{ (github.event_name != 'pull_request' || !github.event.pull_request.draft) && (github.event_name == 'pull_request' || github.event_name != 'workflow_dispatch' || inputs.profile == 'all' || inputs.profile == 'plugin-boundary') }} + needs: quality-shards + if: ${{ needs.quality-shards.outputs.plugin == 'true' && (github.event_name != 'pull_request' || !github.event.pull_request.draft) && (github.event_name == 'pull_request' || github.event_name != 'workflow_dispatch' || inputs.profile == 'all' || inputs.profile == 'plugin-boundary') }} runs-on: blacksmith-4vcpu-ubuntu-2404 timeout-minutes: 25 steps: @@ -328,7 +391,8 @@ jobs: plugin-sdk-package-contract: name: Critical Quality (plugin-sdk-package-contract) - if: ${{ (github.event_name != 'pull_request' || !github.event.pull_request.draft) && (github.event_name == 'pull_request' || github.event_name != 'workflow_dispatch' || inputs.profile == 'all' || inputs.profile == 'plugin-sdk-package-contract') }} + needs: quality-shards + if: ${{ needs.quality-shards.outputs.plugin_sdk_package == 'true' && (github.event_name != 'pull_request' || !github.event.pull_request.draft) && (github.event_name == 'pull_request' || github.event_name != 'workflow_dispatch' || inputs.profile == 'all' || inputs.profile == 'plugin-sdk-package-contract') }} runs-on: blacksmith-4vcpu-ubuntu-2404 timeout-minutes: 25 steps: diff --git a/docs/ci.md b/docs/ci.md index fd02a4bd305..3c90eab2fc5 100644 --- a/docs/ci.md +++ b/docs/ci.md @@ -299,10 +299,11 @@ The `CodeQL Critical Quality` workflow is the matching non-security shard. It runs only error-severity, non-security JavaScript/TypeScript quality queries over narrow high-value surfaces on the smaller Blacksmith Linux runner. Its pull request guard is intentionally smaller than the scheduled profile: non-draft -PRs only run the `plugin-boundary` and `plugin-sdk-package-contract` shards when -plugin loader, Plugin SDK, package-contract, CodeQL config, or quality workflow -files change. Its manual dispatch accepts -`profile=all|plugin-boundary|plugin-sdk-package-contract|plugin-sdk-reply-runtime|provider-runtime-boundary|session-diagnostics-boundary`; +PRs only run the matching `gateway-runtime-boundary`, `plugin-boundary`, and +`plugin-sdk-package-contract` shards for gateway protocol/server-method, plugin +loader, Plugin SDK, or package-contract changes. CodeQL config and quality +workflow changes run all three PR quality shards. Its manual dispatch accepts +`profile=all|gateway-runtime-boundary|plugin-boundary|plugin-sdk-package-contract|plugin-sdk-reply-runtime|provider-runtime-boundary|session-diagnostics-boundary`; the narrow profiles are teaching/iteration hooks for running one quality shard in isolation without dispatching the rest of the workflow. Its