Runner Utilization Report #163
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
| name: Runner Utilization Report | |
| on: | |
| schedule: | |
| - cron: '0 8 * * *' # Daily at 8 AM UTC | |
| pull_request: | |
| paths: | |
| - '.github/workflows/runner-utilization.yml' | |
| - 'scripts/ci/utils/runner_utilization_report.py' | |
| workflow_dispatch: | |
| inputs: | |
| hours: | |
| description: 'Time window in hours' | |
| required: false | |
| default: '24' | |
| type: string | |
| filter: | |
| description: 'Filter runner labels (e.g., 5090, h200)' | |
| required: false | |
| type: string | |
| # Sandbox PRs (e.g. tom/kv_canary) push dozens of times in a row. Without this | |
| # group, every push spawns another 24h API scan that races the previous ones | |
| # and drains the shared 15k/hr installation token quota. Cancel-in-progress | |
| # keeps at most one Runner Utilization run per ref alive at a time. | |
| concurrency: | |
| group: runner-utilization-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| report: | |
| name: Generate Report | |
| # Skip fork PRs entirely, and require the `run-ci` label on same-repo PRs | |
| # so unlabeled iteration pushes (e.g. long-lived sandbox branches) don't | |
| # fire the 24h API scan. schedule and workflow_dispatch always run. | |
| if: >- | |
| github.event_name != 'pull_request' || | |
| (github.event.pull_request.head.repo.full_name == github.repository && | |
| contains(github.event.pull_request.labels.*.name, 'run-ci')) | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.10' | |
| - name: Unit-test report logic | |
| # Pure-logic tests (stdlib only, no API calls) — guards the | |
| # queue-time accounting and status/link rendering before the | |
| # (API-heavy) report runs. | |
| run: | | |
| python -m unittest discover -s scripts/ci/utils \ | |
| -p 'test_runner_utilization_report.py' -v | |
| - name: Generate Utilization Report | |
| timeout-minutes: 30 | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| # PR-trigger is just a script smoke check; scan a 20-minute window | |
| # (0.34h) to bound API cost. schedule / dispatch run the full report. | |
| python scripts/ci/utils/runner_utilization_report.py \ | |
| --repo ${{ github.repository }} \ | |
| --hours ${{ (github.event_name == 'pull_request' && '0.34') || inputs.hours || '24' }} \ | |
| ${{ inputs.filter && format('--filter {0}', inputs.filter) || '' }} |