[ci] split configure so jobs can start earlier #10481
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # This workflow is used to override the set of languages analyzed, | |
| # and to provide custom queries or build logic. | |
| name: "CodeQL Advanced" | |
| on: | |
| push: | |
| branches: | |
| - 'main' | |
| - 'releases/*' | |
| - 'staging/*' | |
| - 'experimental/*' | |
| - 'features/*' | |
| pull_request: | |
| branches: | |
| - 'main' | |
| - 'releases/*' | |
| - 'staging/*' | |
| - 'experimental/*' | |
| - 'features/*' | |
| merge_group: | |
| schedule: | |
| - cron: '37 9 * * 2' | |
| jobs: | |
| analyze: | |
| # Skip merge_group to avoid duplicate runs (code already scanned on pull_request) | |
| # See https://github.com/github/codeql-action/issues/1537 | |
| if: ${{ github.event_name != 'merge_group' }} | |
| name: Analyze (${{ matrix.language }}) | |
| # Runner size impacts CodeQL analysis time. To learn more, please see: | |
| # - https://gh.io/recommended-hardware-resources-for-running-codeql | |
| # - https://gh.io/supported-runners-and-hardware-resources | |
| # - https://gh.io/using-larger-runners (GitHub.com only) | |
| # Consider using larger runners or machines with greater resources for possible analysis time improvements. | |
| runs-on: 'ubuntu-latest' | |
| permissions: | |
| packages: read # required to fetch internal or private CodeQL packs | |
| security-events: write | |
| # read permissions below are only required for workflows in private repositories | |
| actions: read | |
| contents: read | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, | |
| # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. | |
| # For analyzing a compiled language, you can modify the 'build-mode' for that language to customize how | |
| # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages | |
| - language: python | |
| build-mode: none # Consider setting this to manual and providing a build command to get more accurate scanning | |
| # FIXME: enable code scanning for C++ | |
| # - language: c-cpp | |
| # build-mode: manual # Consider setting this to manual and providing a build command to get more accurate scanning | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| # Initializes the CodeQL tools for scanning. | |
| - name: Initialize CodeQL | |
| uses: github/codeql-action/init@v4 | |
| with: | |
| languages: ${{ matrix.language }} | |
| build-mode: ${{ matrix.build-mode }} | |
| # If you wish to specify custom queries, you can do so here or in a config file. | |
| # By default, queries listed here will override any specified in a config file. | |
| # Prefix the list here with "+" to use these queries and those in the config file. | |
| # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs | |
| # queries: security-extended,security-and-quality | |
| # If the analyze step fails for one of the languages you are analyzing with | |
| # "We were unable to automatically build your code", modify the matrix above | |
| # to set the build mode to "manual" for that language. Then modify this step | |
| # to build your code. | |
| - if: matrix.build-mode == 'manual' | |
| shell: bash | |
| run: | | |
| echo 'If you are using a "manual" build mode for one or more of the' \ | |
| 'languages you are analyzing, replace this with the commands to build' \ | |
| 'your code, for example:' | |
| exit 1 | |
| - name: Perform CodeQL Analysis | |
| uses: github/codeql-action/analyze@v4 | |
| with: | |
| category: "/language:${{matrix.language}}" | |
| # CodeQL status is not reported in merge queues. See https://github.com/github/codeql-action/issues/1537. | |
| # Workaround: verify CodeQL passed via API keyed by pull_request.number so the PR gets a required status. | |
| check_codeql_status: | |
| name: Check CodeQL Status | |
| needs: analyze | |
| permissions: | |
| contents: read | |
| checks: read | |
| pull-requests: read | |
| runs-on: ubuntu-latest | |
| if: ${{ github.event_name == 'pull_request' }} | |
| steps: | |
| - name: Authenticate gh CLI | |
| run: | | |
| gh auth login --with-token <<< "${{ secrets.GITHUB_TOKEN }}" | |
| - name: Check CodeQL Status | |
| run: | | |
| # Query by pull_request.number so the check is tied to the PR (required for merge-queue workaround). | |
| # Find the "Analyze (language)" check run (the one that completes); filterBy "CodeQL" returns a different check that stays QUEUED. | |
| pr_number="${{ github.event.pull_request.number }}" | |
| owner="${{ github.event.repository.owner.login }}" | |
| repo="${{ github.event.repository.name }}" | |
| max_attempts=24 | |
| attempt=0 | |
| conclusion="" | |
| while [ $attempt -lt $max_attempts ]; do | |
| # Inline pr_number in the query so we only pass string variables (gh -f sends all as strings otherwise). | |
| response=$(gh api graphql -f query="query(\$owner: String!, \$repo: String!) { | |
| repository(owner: \$owner, name: \$repo) { | |
| pullRequest(number: $pr_number) { | |
| commits(last: 1) { | |
| nodes { | |
| commit { | |
| checkSuites(first: 20) { | |
| nodes { | |
| checkRuns(first: 20) { | |
| nodes { | |
| name | |
| status | |
| conclusion | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }" -f owner="$owner" -f repo="$repo") | |
| # Find the check run whose name starts with "Analyze (" (the CodeQL matrix job) | |
| conclusion=$(echo "$response" | jq -r ' | |
| .data.repository.pullRequest.commits.nodes[0].commit.checkSuites.nodes[] | |
| | .checkRuns.nodes[] | select(.name | startswith("Analyze (")) | .conclusion | |
| ' | head -1) | |
| status=$(echo "$response" | jq -r ' | |
| .data.repository.pullRequest.commits.nodes[0].commit.checkSuites.nodes[] | |
| | .checkRuns.nodes[] | select(.name | startswith("Analyze (")) | .status | |
| ' | head -1) | |
| if [ "$conclusion" != "null" ] && [ -n "$conclusion" ]; then | |
| break | |
| fi | |
| attempt=$((attempt + 1)) | |
| echo "CodeQL check (PR #$pr_number) status=$status conclusion=$conclusion (attempt $attempt/$max_attempts), waiting 10s..." | |
| sleep 10 | |
| done | |
| if [ "$conclusion" != "SUCCESS" ]; then | |
| echo "$response" | jq . | |
| echo "CodeQL check failed (conclusion=$conclusion)" | |
| exit 1 | |
| fi | |
| echo "CodeQL check passed." |