Skip to content

feat(helm): publish a chart alongside the image - #179

Merged
TheMeinerLP merged 1 commit into
mainfrom
feat/helm-chart
Aug 24, 2026
Merged

feat(helm): publish a chart alongside the image#179
TheMeinerLP merged 1 commit into
mainfrom
feat/helm-chart

Conversation

@TheMeinerLP

Copy link
Copy Markdown
Contributor

The backend is deployed from a generic micronaut chart that lives in the cluster repository and is shared with otis, so nothing in this repository describes how this service runs. Every deployment therefore waits on someone editing an image tag by hand over there — which is how dev ended up on 2.3.0 while prod ran 2.4.1: the bump in acb2a0b touched prod only.

A chart of our own, versioned from the same release as the image, removes that step. image.tag is left empty and falls back to .Chart.AppVersion, so pinning the chart pins the image — and an environment that tracks the newest chart release tracks the image with it.

What's here

  • charts/vulpes-backend/ — a fork of helm/micronaut, not a rewrite. The template helpers keep their micronaut.* names and the files are otherwise unchanged, so a later fix over there carries across with diff -r. Only what identifies this application differs: image repository, the 8080 the Micronaut server binds, and the Prometheus endpoint it exposes in every environment.
  • release-please-config.jsonChart.yaml added to extra-files, so the chart version and the app version move together with the release. Both markers sit at 2.5.0 to match .release-please-manifest.json.
  • .github/workflows/release-please.yml — a helm job that packages and pushes to oci://<harbor>/onelitefeather/charts. Chained into the release run for the same reason the docker job is: release-please tags with GITHUB_TOKEN, and such a tag starts no on: push: tags workflow. Both versions are passed from the release output rather than read from Chart.yaml, so the chart cannot be packaged pointing at an image tag nobody built.

Verification

Rendered the current cluster manifests against the new chart for both environments. Nothing changes but the helm.sh/chart label and the config checksum that includes it — no resource name, no selector. Resource names are held in place from the cluster repository with nameOverride/fullnameOverride, because .Chart.Name reaches app.kubernetes.io/name, which is in the Deployment's immutable selector and would need the Deployment deleted rather than upgraded.

helm lint passes.

Notes

  • The Harbor credentials (HARBOR_REGISTRY / HARBOR_USERNAME / HARBOR_PASSWORD) are organisation secrets here — the same ones stelaris uses for the identical job. The first release run is what confirms this repository is in scope for them.
  • This is a feat, so the first release carrying a chart will be 2.6.0. The matching cluster-repository change pins against that version.

The backend is deployed from a generic `micronaut` chart that lives in the
cluster repository and is shared with otis, so nothing here describes how this
service runs. Every deployment therefore waits on someone editing an image tag
by hand in that repository -- which is how dev ended up on 2.3.0 while prod ran
2.4.1.

A chart of our own, versioned from the same release as the image, removes that
step: image.tag is left empty and falls back to .Chart.AppVersion, so pinning
the chart pins the image and an environment that tracks the newest chart
release tracks the image with it.

The chart is a fork of helm/micronaut rather than a rewrite -- the template
helpers keep their `micronaut.*` names and the files are otherwise unchanged,
so a later fix over there carries across with `diff -r`. Only what identifies
this application is different: image repository, the 8080 the Micronaut server
binds, and the Prometheus endpoint it always exposes.

Packaged and pushed to the same Harbor project as the image, under charts/,
chained into the release run for the same reason the docker job is: a
GITHUB_TOKEN tag starts no `on: push: tags` workflow.
@github-actions

Copy link
Copy Markdown
Contributor

Test results

 42 files   42 suites   4s ⏱️
 79 tests  67 ✅ 12 💤 0 ❌
237 runs  201 ✅ 36 💤 0 ❌

Results for commit ee2adc2.

@TheMeinerLP
TheMeinerLP merged commit f41ee56 into main Aug 24, 2026
13 checks passed
TheMeinerLP added a commit to OneLiteFeatherNET/Kubernetes-FLUX that referenced this pull request Aug 24, 2026
Both environments were rendered from the generic helm/micronaut chart in this
repository and paired with an image tag edited by hand in each HelmRelease.
Nothing tied the two together, so they drifted: dev sat on 2.3.0 while prod ran
2.4.1, because the bump in acb2a0b touched prod only.

The backend now publishes a chart alongside its image, versioned from the same
release (OneLiteFeatherNET/Vulpes-Backend#179). image.tag is left empty and
falls back to .Chart.AppVersion, so the source pin is the only version there
is. Prod stays on an exact pin and is moved deliberately; dev takes an open
range and follows the newest release on its own -- the same split
stelaris-ui.yaml uses, and the reason two OCIRepositories point at one URL.

Rendered old against new for both environments: nothing changes but the
helm.sh/chart label and the config checksum that includes it, so prod sees a
single rolling restart. Resource names and the immutable Deployment selector
are held in place with nameOverride/fullnameOverride, since .Chart.Name reaches
app.kubernetes.io/name and renaming it would need the Deployment deleted rather
than upgraded.

Pinned to 2.6.0, the first release that will carry a chart -- 2.5.0 was cut
before the chart existed. Prod therefore moves from 2.4.1 straight to 2.6.0,
and dev picks up both releases it missed.

otis keeps using helm/micronaut, so that chart stays.

Not mergeable until #179 is in and that release has run.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant