chore(release): v0.3.0 #42
No reviewers
Labels
No labels
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
status/deferred
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/purser!42
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "release-prep/rolling"
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?
Added
deploy: a failed post-deploy probe now restores the previous image AND the previous source tree (#32)
docker compose up --waitreplaces the container and waits second, so by the time the probe can refuse, the predecessor is already destroyed. The deploy now tags the running image before building and, on any failure after that point, restores both halves and verifies each. Restoring only the container would leave the tree at the new tag while the old image runs — the divergence the probe's first arm would then report as success.Changed
None.
Fixed
Removed
None.
Deprecated
None.
Upgrade
None.
Before merging this: what deploys, under each configuration
Merging this PR is the v0.3.0 cut. Recorded here rather than only on #39, because this is where the
decision gets made. Full analysis: #39.
The one thing to know before choosing
draftThe n=16 does not reach it. That evidence is PAT-created releases cascade — a creation
transition. Under
draft, the deploy fires from a human publishing an existing draft, which is adifferent transition with no observed instance anywhere on this instance.
And there is a specific plausible failure mode, not just missing evidence: GitHub distinguishes the
publishedandreleasedrelease-event actions, and they do not fire identically fordraft-then-publish versus create-published. If Forgejo mirrors that split,
deploy.yml'stypes: [published]misses the draft transition and the fix silently does nothing.Cheap way to settle it first — proposed, not run
Create a draft release on purser against a deliberately invalid tag (
test-draft), then publish it.Safety:
validate release tag shapeis the first step,TAGarrives viaenv:not interpolation,and the regex miss
exit 1s underset -euo pipefail— checkout is at:90and compose at:103,both downstream. Verified independently by three chambers. Residual: a junk tag and release on
purser, both deletable. It mutates repo state rather than only producing a run, so it wants a ruling.
Standing caveat
No purser cut has ever been observed deploying. Five cells across two repos support the model;
purser's own success is predicted, not measured.
Update — the deciding step is measured, and the rollback net is armed for this cut
Two things changed since the note above, both in the safe direction.
1. The unmeasured step is now measured
@quartermaster ran it in a disposable repo:
A human publishing an existing draft does cascade, against a workflow filtering on exactly
types: [published]— so the failure mode I flagged (Forgejo emittingreleasedinstead, and thefilter missing it) is excluded, not merely unobserved.
Residual he named himself: he published via
PATCH draft:falsewith a user token rather thanclicking Publish in the UI. Probably identical underneath; one step removed.
2.
#38merged, so this cut will carry the rollbackVerified on
mainata0362f7:v0.3.0 cuts from
main, which now includesa0362f7. So the tag will contain the rollbackscript and the net is armed — unlike v0.1.0 and v0.2.0, neither of which carried it.
What that means for merging this
With
purser#43in (publish_mode: draft), merging this cut is:That is the attended first deploy the crew has been arranging since 11:30 — and it doubles as the
last open cell, on purser itself rather than a synthetic repo, which retires the cross-repo residual
(@surveyor's point).
⚠️
#43must merge before this cut, or the cut publishes immediately under the Actions token andyou get the current silent no-deploy.
aea8fc1967to1d7da9e8e9