mirror of
https://github.com/BerriAI/litellm.git
synced 2026-08-28 05:25:59 +00:00
PR #37550 taught the backend unit-test shards to read the pull request's own file list, but four required jobs were never wired to that gate and ran in full on every pull request regardless of what it touched. A UI-only pull request still paid roughly 17 runner-minutes of Python work it could not have affected, and a backend-only one still installed and built the dashboard. Lint and the MCP suite now take the existing backend decision. The dashboard build and unit tests take a new ui decision, which tracks ui/ rather than reusing client: client deliberately runs whenever the backend changes, because it gates CircleCI's end-to-end jobs that drive a real proxy, while the build and the unit tests cannot see the backend at all. CI config counts as ui-relevant too, so a pull request that rewrites the dashboard workflows still exercises them instead of shipping unvalidated. The gate stays inside the job rather than moving to on.paths or to a job-level condition on the shard callers. A workflow filtered out by on.paths never starts and never reports, so a required check waits forever, and a skipped caller job publishes its own name instead of the nested "<shard> / Run tests" the ruleset requires. Both were measured before settling on this shape. Three setup steps in the shard base and in the documentation job also leaked past the gate, so a skipped shard still spent about twelve seconds installing uv and restoring its cache. They now carry the same condition, and the documentation job stops cloning litellm-docs when it has nothing to validate.
41 lines
1.7 KiB
YAML
41 lines
1.7 KiB
YAML
name: "Detect relevant changes"
|
|
description: >-
|
|
Classify the pull request's changed files with .circleci/scripts/classify_changes.sh
|
|
and expose decision=run|skip for one category. backend means anything outside ui/,
|
|
docs/ and markdown; ui means the dashboard sources alone. decision=skip lets callers
|
|
short-circuit expensive steps while the job still completes successfully and satisfies
|
|
its required status check, which a paths: filter cannot do because a workflow that
|
|
never starts never reports. The file list comes from the pull request itself rather
|
|
than from a git diff, because the checked-out merge ref is recomputed as the base
|
|
branch advances and would otherwise attribute the base branch's own commits to the
|
|
pull request. The decision defaults to run for any non pull_request event or whenever
|
|
the changed set cannot be resolved, so jobs are never skipped when the classification
|
|
is uncertain.
|
|
|
|
inputs:
|
|
category:
|
|
description: "Which classification to apply: backend, client or ui"
|
|
required: false
|
|
default: backend
|
|
github-token:
|
|
description: "Token used to list the pull request's files; needs pull-requests: read"
|
|
required: false
|
|
default: ${{ github.token }}
|
|
|
|
outputs:
|
|
decision:
|
|
description: "run when category-relevant files changed, otherwise skip"
|
|
value: ${{ steps.classify.outputs.decision }}
|
|
|
|
runs:
|
|
using: composite
|
|
steps:
|
|
- id: classify
|
|
shell: bash
|
|
env:
|
|
GH_TOKEN: ${{ inputs.github-token }}
|
|
CATEGORY: ${{ inputs.category }}
|
|
REPO: ${{ github.repository }}
|
|
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
CHANGED_FILE_COUNT: ${{ github.event.pull_request.changed_files }}
|
|
run: bash "${GITHUB_ACTION_PATH}/../../scripts/detect_changes.sh"
|