ci: propose the NixOS base image nixpkgs pin bump on a schedule - #3482
Conversation
The base image pins an exact nixpkgs release, which is what makes it reproducible but also what makes it go stale silently: nothing moves the pin, so nothing picks up upstream's security fixes. nixos-26.05 has taken 100+ commits in the last month alone. Add a monthly job that resolves the current release of whatever series the pin is already on and, if it moved, opens a draft PR updating build.sh and the README pin table. It deliberately does not build and does not publish. The value is turning "the userland is drifting" into a reviewable diff that CI can run the distro build test against; publishing stays manual, because the publish job's only gate inspects the rootfs tar, and a tar can pass every assertion while the image cannot boot — which is exactly what 25.05 replacing $toplevel/init with the systemd binary produced. The bot refuses to cross a series: 24.05 -> 26.05 needed an activation shim, a stateVersion decision and real KVM verification, none of which a cron should attempt. It uses the GitHub App token rather than GITHUB_TOKEN so the bump PR actually triggers CI, and it verifies the release's nixexprs tarball is served before proposing a pin the build could not fetch. Also drops the README's duplicate dated release row, so the release id lives in exactly two places the job keeps in sync rather than three it could skew.
PR SummaryLow Risk Overview Reviewed by Cursor Bugbot for commit 327191e. Bugbot is set up for automated code reviews on this repo. Configure here. |
❌ 2 Tests Failed:
View the full list of 2 ❄️ flaky test(s)
To view more test analytics, go to the Test Analytics Dashboard |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit e515fdd. Configure here.
Review findings, both real. secrets.app_id/app_secret are workflow_call secret inputs declared by pr-no-generated-changes.yml, not repository secrets, so minting the token would have failed on every scheduled run; use the version-bumper App (vars.VERSION_BUMPER_APPID / secrets.VERSION_BUMPER_SECRET), which is org-level and exactly this job's purpose. The retry guard also only skipped on an open PR, so a branch left behind by a failed run made the next push non-fast-forward and the bump could never reopen. Skip on a PR in any state — a closed one means the release was rejected and re-proposing it monthly would be nagging — and delete a branch that no PR references at all.

The base image pins an exact nixpkgs release — that's what makes it reproducible, and also what makes it go stale silently, since nothing moves the pin.
nixos-26.05has taken 100+ commits in the last month, none of which we'd pick up.This adds a monthly job that resolves the current release of whatever series the pin is already on and, if it moved, opens a draft PR updating
build.shand the README pin table. It deliberately does not build and does not publish: the value is turning "the userland is drifting" into a reviewable diff CI can run the distro build test against. Publishing stays manual, because the publish job's only gate inspects the rootfs tar — and a tar can pass every assertion while the image still cannot boot, which is exactly what 25.05 replacing$toplevel/initwith the systemd binary produced. The bot also refuses to cross a series: 24.05 → 26.05 needed an activation shim, astateVersiondecision and real KVM verification, none of which a cron should attempt.Uses the GitHub App token rather than
GITHUB_TOKENso the bump PR actually triggers CI, and checks the release'snixexprs.tar.xzis served before proposing a pin the build couldn't fetch. Verified by simulation against the current pin: the resolve step reads26.05/nixos-26.05.6503.21ea275a7c46, the channel resolves to the same id (so today it correctly no-ops), the series guard passes, and a simulated newer release rewrites both files with zero stale mentions left.