Run Ruff earlier in CI to fail fast before tests #323

Closed
opened 2026-04-05 16:25:54 +02:00 by MrUnknownDE · 0 comments
Owner

Originally created by @pheus on 2/18/2026

Proposed Changes

Update the CI workflow so Ruff runs as early as possible, before the more time-consuming setup steps (docs build, frontend dependency install/validation, static asset checks, etc.). Ruff already runs before the test suite, but we can fail even faster by moving it ahead of the heavier preparation work.

This could be done in one of two ways:

  • Reorder steps in the existing CI job so ruff check netbox/ runs right after checkout + Python setup (and minimal dependency installation), before:
    • mkdocs build
    • yarn --cwd netbox/project-static / frontend validation
    • collectstatic, migration checks, bundle verification
  • Add a dedicated “lint” job/workflow that runs Ruff only (ideally once on a single Python version) and make the main matrix job depend on it (via needs:), so we fail fast without repeating Ruff for every Python version.

The goal is to keep this change focused on job/step ordering and CI efficiency, without changing Ruff rules.

Justification

Ruff is a fast check and will trigger more often as we expand its usage. Running it earlier provides quicker feedback to contributors and reduces wasted CI time by catching lint/format issues before we spend time building docs, preparing the frontend, and running other expensive steps.

*Originally created by @pheus on 2/18/2026* ### Proposed Changes Update the CI workflow so Ruff runs **as early as possible**, before the more time-consuming setup steps (docs build, frontend dependency install/validation, static asset checks, etc.). Ruff already runs before the test suite, but we can fail even faster by moving it ahead of the heavier preparation work. This could be done in one of two ways: - **Reorder steps in the existing CI job** so `ruff check netbox/` runs right after checkout + Python setup (and minimal dependency installation), *before*: - `mkdocs build` - `yarn --cwd netbox/project-static` / frontend validation - `collectstatic`, migration checks, bundle verification - **Add a dedicated “lint” job/workflow** that runs Ruff only (ideally once on a single Python version) and make the main matrix job depend on it (via `needs:`), so we fail fast without repeating Ruff for every Python version. The goal is to keep this change focused on job/step ordering and CI efficiency, without changing Ruff rules. ### Justification Ruff is a fast check and will trigger more often as we expand its usage. Running it earlier provides quicker feedback to contributors and reduces wasted CI time by catching lint/format issues before we spend time building docs, preparing the frontend, and running other expensive steps.
MrUnknownDE added the status: acceptedstatus: acceptednetboxstatus: acceptedtype: housekeepingstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptedstatus: acceptednetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeeping labels 2026-04-05 16:25:58 +02:00
Sign in to join this conversation.
No Label netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox netbox status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted status: accepted type: housekeeping type: housekeeping type: housekeeping type: housekeeping type: housekeeping type: housekeeping type: housekeeping type: housekeeping type: housekeeping type: housekeeping type: housekeeping type: housekeeping type: housekeeping type: housekeeping type: housekeeping
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github/netbox#323