fix(release): reconnect GitHub Releases, enforce tag-parity, fix install docs#76
Conversation
…all docs The chart-publishing migration (Pages -> Docker Hub -> GHCR, PRs #53/#71/#75) moved the artifact but left the release surface disconnected: - No GitHub Release is created on a tag since chart-releaser was removed in #53, so the Releases page is frozen at 0.5.1 while 0.6.x ships to GHCR. - The parity lint only checked version==appVersion and pointed at update-helm-version.yml, a workflow #53 deleted. Changes (no rendered-manifest changes -> zero impact on lab/staging/prod): - docker-publish.yml: create a GitHub Release per tag with the packaged chart .tgz attached (contents: write). - lint.yml: parity check now also asserts Chart.yaml matches the release tag on vX.Y.Z pushes; dropped the dead update-helm-version.yml reference; skip Go lint on tags. - README.md / chart README: GHCR install as the primary path at the correct published version (0.6.1), documented the tag-driven release process. Deliberately NOT bumping Chart.yaml here: version/appVersion feed the app.kubernetes.io/version pod-template label, so an out-of-band bump would roll the controller in every env on the next ArgoCD sync. External GHCR installs are already deterministic because the publish job bakes --app-version from the git tag (values.yaml image.tag is "" -> defaults to appVersion). The parity gate now forces the in-repo bump at actual release time, where a rollout is expected.
bc68340 to
7801e5b
Compare
shingonoide
left a comment
There was a problem hiding this comment.
Thanks for reconnecting the Releases pipeline. The core fix is sound: v0.6.0 and v0.6.1 exist while the Releases page is still frozen at openfilter-pipelines-controller-0.5.1, so re-adding gh release create/upload on tag push is the right call, the view-then-clobber pattern is safe to re-run, and the documented OCI install path resolves to what helm push actually produces. CI is green.
Two points before this counts as a hard guarantee:
-
The parity gate does not actually block a bad publish. chart-version-parity runs in lint.yml, while the chart publish and Release creation run in docker-publish.yml. The two workflows trigger independently on the same tag push with no cross-workflow dependency (no needs, no workflow_run), and there is no required-status-check ruleset on tag pushes. A tag whose Chart.yaml does not match will fail the parity job in lint.yml while docker-publish.yml still publishes the mismatched chart and creates the Release. The deployment README wording ("a stale Chart.yaml fails CI before anything is published") overstates this: the gate detects drift but does not prevent the publish. Please move the parity assertion into docker-publish.yml's publish-chart job (or make publish-chart depend on it) so the guarantee actually holds, or soften the README wording to match.
-
The Go-lint skip guard is broader than the trigger. lint.yml uses if: !startsWith(github.ref, 'refs/tags/'), which skips Go lint on any tag ref, while the trigger only admits v*... Harmless today, but if the tag trigger is ever widened, Go lint would silently skip. Tightening the guard to match avoids that latent footgun.
Nits (non-blocking): the Release naming moves to git-tag style (v0.6.1) versus the historical chart-releaser style (openfilter-pipelines-controller-0.5.1), a small discontinuity on the Releases page; and the 0.6.1 pins in the install examples will go stale on the next release, though the added "track the git tags" prose mitigates that.
Per review: a failing lint job does not block the separate publish workflow, so asserting tag-parity in lint.yml only produced an advisory red check while the mistagged chart still shipped. Move the Chart.yaml-==-tag assertion into the publish-chart job (the only step that runs on the tag AND gates publishing) so a mistagged release fails to publish. lint.yml keeps version==appVersion for pre-merge PR feedback; dropped the tag trigger and tag-only lint skip.
leandrobmarinho
left a comment
There was a problem hiding this comment.
The release-process reconnect itself is correct and well-verified: the in-job 'Assert Chart.yaml matches the release tag' step now genuinely gates the publish from inside publish-chart (set -eu/exit 1 before package/push), the Create-Release step is idempotent (view -> upload --clobber, else create), the tgz name matches helm package output, and contents:write is the right minimum permission. One doc-accuracy issue inline.
…arity Per review (leandrobmarinho): the Releasing section said lint.yml's chart-version-parity 'on a release tag, asserts they match the tag' — but that check only does version==appVersion on PRs and never sees the tag. The actual tag-parity gate is the 'Assert Chart.yaml matches the release tag' step in docker-publish.yml's publish-chart job, which exits non-zero before package/push. Re-point the prose so a future maintainer doesn't remove the real gate believing lint.yml covers it.
lucasmundim
left a comment
There was a problem hiding this comment.
Thanks for the careful review — both points are addressed in 19491d6 (pushed after this review):
- Parity gate now blocks the publish. I moved the
Chart.yaml == tagassertion out oflint.ymlintodocker-publish.yml'spublish-chartjob as theAssert Chart.yaml matches the release tagstep (set -eu/exit 1before package/push), so a mismatched tag fails the publish itself rather than just an advisory lint check. The README wording was re-pointed to this gate in 8668ee4. - Go-lint skip guard removed. I dropped both the
tags:trigger and theif: !startsWith(github.ref, 'refs/tags/')guard fromlint.yml, so there's no tag-ref skip left to widen.
On the nits: the vX.Y.Z Release naming is intentional (the new flow tags git tags rather than chart-releaser names), and the 0.6.1 doc pins are knowingly version-pinned, mitigated by the "track the git tags" prose.
leandrobmarinho
left a comment
There was a problem hiding this comment.
Re-reviewed at the current head (8668ee4). My README finding is fixed: the Releasing section now correctly states that lint.yml's chart-version-parity is a PR-only version==appVersion check that never sees the tag, and credits the actual tag-parity gate to the 'Assert Chart.yaml matches the release tag' step in docker-publish.yml's publish-chart job (with a matching clarifying comment added in lint.yml itself) - so the docs no longer risk a maintainer removing the real gate. The release-process reconnect mechanics were already verified: the in-job assert gates the publish from inside publish-chart (set -eu/exit 1 before package/push), the Create-Release step is idempotent (view -> upload --clobber, else create), the tgz name matches helm package output, and contents:write is the right minimum permission. Looks good.
First release on the reconnected pipeline (#76): bumping Chart.yaml version and appVersion from the stale 0.5.1 to 0.6.2 (latest published was 0.6.1). On tag v0.6.2, CI publishes image + chart 0.6.2 to GHCR and creates the GitHub Release; the publish-chart parity gate requires this bump before the tag. Note: appVersion feeds the app.kubernetes.io/version pod-template label, so merging this rolls the controller once per env on the next ArgoCD sync (image is SHA-pinned, so it's a no-op restart) — expected at release time.
Problem
The chart-publishing migration (Pages → Docker Hub → GHCR, #53 / #71 / #75) moved the artifact but left the release surface disconnected:
chart-releaser(helm-release.yml), removed in feat(deploy): implement auto-bump flow and move chart to deployment/ #53. The replacementdocker-publish.ymlonly doeshelm push→ GHCR + image push → Docker Hub; it never creates a Release. Sov0.6.0/v0.6.1are bare tags and the Releases page is frozen at the May 5 chart-releaser fossilopenfilter-pipelines-controller-0.5.1.version == appVersion(both0.5.1→ green) and its error message pointed at.github/workflows/update-helm-version.yml, a workflow feat(deploy): implement auto-bump flow and move chart to deployment/ #53 deleted.The published artifact itself is fine: chart
0.6.1is publicly pullable fromoci://ghcr.io/plainsightai/charts/openfilter-pipelines-controller, and external installs are already deterministic (the publish job bakes--app-versionfrom the tag, andvalues.yamlimage.tagis""→ defaults toappVersion).Changes (zero rendered-manifest impact — lab/staging/prod untouched)
docker-publish.yml— recreate a GitHub Release per tag with the packaged chart.tgzattached and auto-generated notes (job permission →contents: write).lint.yml— the parity check now also assertsChart.yamlmatches the release tag on avX.Y.Zpush; removed the deadupdate-helm-version.ymlreference; Go lint skipped on tags.README.mdand the chartREADME.mdlead with the GHCR install at the correct version, plus a Releasing section documenting the tag-driven flow the parity gate enforces.Deliberately NOT bumping Chart.yaml here
version/appVersionfeed theapp.kubernetes.io/versionpod-template label, so an out-of-band bump would roll the controller in every env on the next ArgoCD sync (image is SHA-pinned, so it'd be a no-op restart — but still out-of-band). External GHCR installs don't need it (publish bakes--app-versionfrom the tag). The parity gate now forces the in-repo bump at release time, coupled to a real release where a rollout is expected.New release process (enforced by CI)
versionandappVersioninChart.yamltoX.Y.Zvia PR.vX.Y.Zand push — CI publishes images + chart to GHCR and creates the GitHub Release. Tagging a commit whoseChart.yamldoesn't match now fails the parity gate.Compatibility with the in-flight deploy refactor (@stwilt, DT-164/166)
This PR only touches
lint.yml,docker-publish.yml, and READMEs — nooverrides/*, no image key paths, nodeploy/deploy-labjobs. It does not depend on gitops#130/#62 landing and does not conflict with them (ArgoCD renders the in-repo chart; this changes none of it).Validation
helm lintclean (pre-existing icon INFO only); both workflows parse as valid YAML.v0.6.1→ PASS,v0.6.2→ FAIL (requires a bump first).Follow-ups
plainsight-deployment-agentfor the same release surface plus an image-tag determinism fix (its chart defaultsimage.tagtolatest, which is the root cause of the customermissing required media_idincident).