Pin Ruff in CI to avoid surprise breakages #302

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

Originally created by @pheus on 2/19/2026

Proposed Changes

  • Pin ruff to a known-good version in CI instead of installing “latest” via pip install ruff (e.g., use a constraints file / dev requirements, or switch to astral-sh/ruff-action with an explicit version:).
  • Make our lint rule selection deterministic while preview = true is enabled in ruff.toml:
    • either set an explicit [lint].select = [...] (so Ruff default changes don’t unexpectedly expand the enforced rules), or
    • disable preview mode for CI and only enable it intentionally during planned upgrades.
  • Add a lightweight upgrade workflow (Dependabot / periodic bump PR) so Ruff updates are tested and adopted deliberately.

References

Justification

Our CI currently installs Ruff without any version constraints, so new upstream releases can change lint behavior overnight. Ruff 0.15.2 (released 2026-02-19) introduced changes that caused the ruff check netbox/ step (“Check PEP8 compliance”) to fail, breaking CI for unrelated PRs.
Pinning the tool (and avoiding implicit/default rule changes while using preview mode) will keep linting stable and make upgrades intentional, reviewable, and easier to troubleshoot.

*Originally created by @pheus on 2/19/2026* ### Proposed Changes - Pin `ruff` to a known-good version in CI instead of installing “latest” via `pip install ruff` (e.g., use a constraints file / dev requirements, or switch to `astral-sh/ruff-action` with an explicit `version:`). - Make our lint rule selection deterministic while `preview = true` is enabled in `ruff.toml`: - either set an explicit `[lint].select = [...]` (so Ruff default changes don’t unexpectedly expand the enforced rules), **or** - disable preview mode for CI and only enable it intentionally during planned upgrades. - Add a lightweight upgrade workflow (Dependabot / periodic bump PR) so Ruff updates are tested and adopted deliberately. **References** - Ruff 0.15.2 release notes (2026-02-19): https://github.com/astral-sh/ruff/releases/tag/0.15.2 - Example CI failure (PEP8/Ruff step): https://github.com/netbox-community/netbox/actions/runs/22203030779/job/64220469751?pr=21496 - CI installs Ruff unpinned (`pip install ruff ...`): https://github.com/netbox-community/netbox/blob/main/.github/workflows/ci.yml - NetBox Ruff config has `preview = true`: https://github.com/netbox-community/netbox/blob/main/ruff.toml ### Justification Our CI currently installs Ruff without any version constraints, so new upstream releases can change lint behavior overnight. Ruff 0.15.2 (released 2026-02-19) introduced changes that caused the `ruff check netbox/` step (“Check PEP8 compliance”) to fail, breaking CI for unrelated PRs. Pinning the tool (and avoiding implicit/default rule changes while using preview mode) will keep linting stable and make upgrades intentional, reviewable, and easier to troubleshoot.
MrUnknownDE added the status: acceptedtype: housekeepingnetboxstatus: 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: acceptedtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingtype: housekeepingnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetboxnetbox labels 2026-04-05 16:25:17 +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 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
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github/netbox#302