Skip to content

ci(rust-ci): pin the toolchain instead of tracking stable#89

Merged
Jaro-c merged 1 commit into
mainfrom
ci/pin-rust-toolchain
Jul 15, 2026
Merged

ci(rust-ci): pin the toolchain instead of tracking stable#89
Jaro-c merged 1 commit into
mainfrom
ci/pin-rust-toolchain

Conversation

@Jaro-c

@Jaro-c Jaro-c commented Jul 15, 2026

Copy link
Copy Markdown
Member

Every build, lint and test job installed stable, so the toolchain moved on its own the day upstream shipped a release — and every consumer's open PRs went red at once for a change nobody made.

That is not hypothetical. Rust 1.97.0 landed on 2026-07-07, widened clippy's question_mark lint to reach code that had been fine for months, and -D warnings made it fatal. Every open PR in podup was red on Format & lint regardless of what it touched — blocking a security fix (the release-key rotation) and a release, until the lint was fixed in podup#1008. Nobody had upgraded anything.

Adds a toolchain input defaulting to the pin, used by all seven jobs that were on stable:

job was now
lint, test, test-extra, coverage, package, semver, doc stable ${{ inputs.toolchain }}
msrv ${{ inputs.msrv }} unchanged

The MSRV job keeps its own input — the floor a user needs to compile is a separate question from which toolchain CI builds with. Inputs go through env: rather than shell interpolation, matching rust-fuzz and the existing MSRV step (the v1.7.0 hardening).

This is the same fix v1.8.0 gave python-ci's ruff/pytest pins, for the same stated reason — "an unpinned ruff would change lint/test behaviour for every Python consumer the day a new release ships, with no per-repo buffer" — applied to the lane that missed it.

Adoption is a no-op today. 1.97 resolves to rustc 1.97.0 (2d8144b78 2026-07-07), which is exactly what CI already runs — verified locally against the same hash in podup's failing job log. Consumers get the compiler they already have, and stop drifting. Bump the pin via a new .github release so each repo adopts a new toolchain deliberately, sees which lints it gained, and fixes them on its own schedule.

Wants a v1.9.0 release after merge, then a pin bump in the Rust consumers.

Every build, lint and test job installed `stable`, so the toolchain moved
on its own the day upstream shipped a release -- and every consumer's open
pull requests went red at once for a change nobody made.

That happened on 2026-07-07: Rust 1.97.0 landed, widened clippy's
question_mark lint to reach code that had been fine for months, and with
`-D warnings` it was fatal. Every open PR in podup was red on Format &
lint regardless of what it touched, blocking a security fix and a release
until the lint was fixed. Nobody had upgraded anything.

Add a `toolchain` input, defaulting to the pin, and use it in all seven
jobs that were on `stable`. The MSRV job keeps its own `msrv` input --
that is the floor a user needs, a separate question from which toolchain
CI builds with. Inputs go through `env:` rather than shell interpolation,
matching rust-fuzz and the MSRV step.

This is the same fix v1.8.0 applied to python-ci's ruff/pytest pins, for
the same reason, on the lane that missed it.

Adoption is a no-op today: `1.97` resolves to rustc 1.97.0 (2d8144b78),
which is exactly what CI already runs, so consumers change compiler on
their own schedule -- bump this pin via a new release, see which lints
you gained, fix them deliberately.

Signed-off-by: Jaro-c <75870284+Jaro-c@users.noreply.github.com>
@Jaro-c
Jaro-c merged commit e22b97f into main Jul 15, 2026
4 checks passed
@Jaro-c
Jaro-c deleted the ci/pin-rust-toolchain branch July 15, 2026 06:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant