Repository navigation
Conversation
This was referenced Nov 12, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Up to the tag, a publication already reruns cleanly:
build-imagenever overwrites, andpromote-image,publish-chartandpublish-chart-s3answerpresentwhen the work is done. After the tag it was a dead end.draft-releaserefused anything that wasn't a draft, so a run that broke on the declaration, the S3 chart or the wire-builds bump could only be finished by hand. This PR makes the whole publication replayable.draft-release resumes. With
if-published: resume(the new default),resolveandpublishaccept a release that an earlier run published, provided its tag sits on the commit the release targets (and onexpected-commitwhen given).resolvedownloads the assets as it does for a draft.publishwrites nothing: eachreplace-assetsfile has to match the published asset. For the manifest, thepublicationblock is ignored, since a rerun completes it again with a new date; every other file is compared byte for byte. Any difference fails the step. A draft sitting next to a published release with the same tag also fails, rather than guessing. New outputalready-published;make-latestisunchangedon a resume.if-published: failkeeps the old strict behaviour.publish-chart reads back. After a
chart-filepush, the chart is pulled again and must have the sha256 of the file (hence the sameversionandappVersion) and the digest the push printed. Package mode (dev builds) is untouched.wire-builds-bump, new action. Replaces the hand-written bumps of
build.jsonin each component. It setsversion,repoand themetafields ofhelmCharts.<chart>(other meta fields are kept), bumps the pre-release of the top-level version, and commits through the contents API with the blob sha as a compare-and-swap. An entry already at the target is a no-op, so a rerun, a repair or a commit whose answer got lost all end withunchanged. When another commit lands in between, the file is read and the change applied again (5 attempts). Before each write, the file minus.versionand the chart's entry must be identical to what was read (normalized withjq -S).templates/repair-publication.yml. A workflow for components to copy:
workflow_dispatchwithversion,reasonand a typedconfirm(v<version>), gated byrelease-publication. It resolves the published release (and refuses a draft), verifies the assets against the manifest, checks the image tag and the chart in the registry, then replays the declaration, the S3 chart and the wire-builds bump, each behind its own input. Nothing is rebuilt and everything comes from the release assets, which don't expire. The template calls the actions at@devhere, andmake release-prepnow repoints it along withdev-build.yml.One publication at a time.
templates/README.mdrecommends one concurrency group per repository,publish-${{ github.repository }}withcancel-in-progress: false, shared by publish-release and the repair. A group per version, which some components use today, lets two versions publish at the same time, and both then decidemake_latestand both bump wire-builds.release-manifest
completekeeps the first publication. A manifest that already carries apublicationblock with the same digests is left as it is, first date and first run included; other digests fail. Without this, a rerun would send the release managers a manifest with a new date, and a version pinned in a published bundle answers that with a 409 (any manifest change on a locked version is refused). With it, the resend is identical. I checked the release manager side (upsert_versions): the same version, digest, declaration and manifest sent twice is an update with no change, no duplicate and no error, locked or not, and a release request that is already published isn't touched again.Checks run locally: 652 tests, shellcheck, actionlint (workflows and templates), zizmor offline, gitleaks, commit messages.
Related Issue
Types of changes