01 · Start from what runs
The cluster, not just the repo.
The daily upgrade scan starts from the live HelmReleases,
OCI sources and container images, and links each back to the file
in git that declares it. A release that exists only in git, or only
in the cluster, is handled differently from one that is in both.
Here: kube-prometheus-stack, pinned at
61.3.2, with a values block your team has tuned over
the years.
02 · What is out there
Check the chart repository for every newer release.
It fetches the chart's index.yaml (or lists OCI tags),
with your repository credentials where needed, drops pre-releases,
and skips versions you or we have marked known-bad.
Container images get the same treatment through Docker Hub, GHCR
and your own registries.
03 · Read the changelogs
Every hop between here and there, oldest first.
Release notes come from GitHub releases, then from
CHANGELOG.md / UPGRADE.md when a project
publishes no releases. Each breaking change is extracted and
classified: a values rename, a required step, a CRD change, a
migration path.
If a changelog could not be fetched, the MR says so in a banner and
risk goes up. Missing evidence is never reported as "no breaking
changes".
04 · Does it affect you?
A breaking change only counts if it touches your values.
Each finding is checked against your HelmRelease values, and against
a render of the chart with those values. Helm never installs the
versions in between, so a change introduced in 63 and reverted in 64
is irrelevant to a jump past 64.
Required-step changes are hard stops no matter what your
values say.
05 · Pick the boundary
The highest version before the first change that applies.
The rule is simple and written into the MR: with breaking-change
evidence in range, stop just before it and quote the excerpt. With
none, go up to a year of releases in one step.
Here the first stop that applies is 67.0.0, so the
target is 66.7.1. That is five majors in one reviewed
MR, and the next step becomes its own MR once this one is merged.
06 · Render both versions
See what really changes in the cluster.
helm template runs at the current and the target
version with your values, and the two outputs are diffed. That
shows what the version string hides: new CRDs, changed selectors,
a container that gains an argument.
Changes to load-bearing fields (container specs, Service ports,
RBAC, storage) raise the risk and are called out in the MR.
07 · Ask the API server
Would the cluster accept this? Asked before you review.
The rendered objects are validated against the CRD schemas the
cluster actually serves, and sent as a server-side dry-run
under a dedicated identity that an admission policy limits to
dry-run only. It can ask, it can never apply.
08 · The proposal
A one-line diff, and everything you need to trust it.
The diff is tiny. The MR body carries the reasoning: why this
version and not the newest, which breaking changes apply and what
to do about them, what could not be evaluated, and what to watch
after merging. The full MR is below.