Scope the release signal, collapse the contract onto the release version, publish the Hub overview #83
Reference in New Issue
Block a user
Delete Branch "auto-release-only-when-affected"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Four related changes to the release pipeline, all downstream of scoping
Release-Bump.Release nothing when no Renovate commit reached the app
auto-releasefired on any Renovate commit since the last tag, and with no trailersmaxLevel([])falls back topatch— so Renovate updating its own image cut a version, publishing an image whose only difference is a workflow file nothing reads at runtime. The job now skips when nothing since the last tag carried a trailer.The trailer itself is an allowlist over the surfaces that reach a running Plainpages. The production sidecars are scoped by package, not by file:
compose.ymland the published quick start pin the same images, Renovate moves them in one branch, and a branch-levelcommitBodywould otherwise depend on which upgrade sorted first — silently suppressing a release.One version number
HOST_API_VERSIONis the Plainpages release version: a plugin author reads one version off the image they run and writes it down.release-tooling/contract-version.tsis the gate — both release paths refuse a tag whosemajor.minordisagrees with the constant, naming the value to set.The patch digit may lag deliberately:
checkApiVersionignores patch, and auto-release cuts patch releases with no commit in which to bump a constant. An update big enough to force a minor therefore stopsauto-releaserather than tagging, and a human bumps the constant first. Promote-by-retag is untouched — the released image stays byte-identical to the gated one.Pre-1.0 the major is pinned at
0, which leaves the minor as the only slot a breaking change can use, so a minor mismatch now refuses instead of warning. A plugin that is ahead of the host keeps its own remedy ("upgrade the host") rather than being told to rebuild against the older contract. For the same reason the moving bare-major tag is no longer published while the major is0::0would carry an adopter across a contract break.:0.1stays, since it only moves across patches.A test pins every author-facing
apiVersionsample to the constant, so the copies in the README, both example plugins, the dashboard view and the Hub template cannot drift from it.The Docker Hub overview is published by CI
release-tooling/dockerhub-overview.md.tmplcarries{{VERSION}}, rendered from the release and PATCHed to Docker Hub, so the Plainpages tag the page tells adopters to pull cannot go stale. Its sidecar pins are Renovate-managed and gated against this repo's own compose files, so the quick start stays a topology CI has actually run. A leftover placeholder fails the job rather than publishing literal braces to a public page.It is a separate
publish-overviewjob, not a step: the images are already pushed and irreversible by then, so a Hub outage leaves the promotion green and the images untouched.workflow_dispatchgives the page its own door — a stale page is exactly the state you cannot fix by cutting a release — and it checks out the named release's own tag, so a republish never pairs one Plainpages version with another release's sidecars, and a version that was never released fails at checkout.It uses
DOCKERHUB_OVERVIEW_TOKEN, separate from the image-push token because editing repository metadata is a different permission and widening the push credential to cover it would widen what a leak costs.The template is deliberately not a
.md:ci.shskips the whole gate on a docs-only change, so a.mdname would let a broken placeholder merge with its own guard test skipped.Also
release-tooling/holds everything the release runs — the bump math, the contract gate and the Hub publisher..gitea/workflows/release.ymljoins the node custom manager's file patterns; it pinsnodeand nothing watched it.apiVersionon boot.versionfield is gone frompackage.jsonande2e-tests/package.json— both private, unpublished, read by nothing, and never written back to by the release path.Needs before merge: create the
DOCKERHUB_OVERVIEW_TOKENsecret (README → One-time CI setup). Without it thepublish-overviewjob fails; the released images are unaffected.Release nothing when no Renovate commit reached the appto Collapse the plugin contract onto the release version, and stop releasing what never reached the appCollapse the plugin contract onto the release version, and stop releasing what never reached the appto Scope the release signal, collapse the contract onto the release version, publish the Hub overview