Skip to content

Commit 64f52e9

Browse files
committed
ci: add release workflow rehearsal
1 parent 725d489 commit 64f52e9

8 files changed

Lines changed: 332 additions & 0 deletions

File tree

.github/RELEASE_TEMPLATE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ just paper-api-smoke
2929
- [ ] `just registry-readiness`
3030
- [ ] `just release-rehearsal`
3131
- [ ] `just draft-release-rehearsal`
32+
- [ ] `scripts/release_workflow_rehearsal.sh --execute` has passed for a temporary rehearsal tag, or this release explains why the high-fidelity tag workflow drill was intentionally skipped.
3233
- [ ] Draft GitHub Release contains the Python package, CLI binaries, paper image tarball, and `SHA256SUMS`.
3334
- [ ] `scripts/release_verify.py <downloaded-release-dir>` passes.
3435
- [ ] `SBOM.spdx.json` and `PROVENANCE.json` are attached and included in `SHA256SUMS`.

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ jobs:
152152
test -x scripts/network_proof_pack.py
153153
test -x scripts/release_rehearsal.sh
154154
test -x scripts/draft_release_rehearsal.sh
155+
test -x scripts/release_workflow_rehearsal.sh
155156
test -x scripts/railway_start.sh
156157
test -x scripts/railway_doctor.py
157158
test -x scripts/deployment_identity_evidence.py

docs/distribution.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,22 @@ fresh directory, verifies the bundle, renders the Homebrew formula, then deletes
123123
the draft release and temporary tag. This proves the rollback motion without
124124
publishing a package registry, Homebrew tap, or production release.
125125

126+
## Tag Workflow Rehearsal
127+
128+
After changing `.github/workflows/release.yml`, run the full tag-triggered
129+
release workflow drill:
130+
131+
```bash
132+
scripts/release_workflow_rehearsal.sh --execute
133+
```
134+
135+
The drill creates a temporary prerelease tag on `origin/main`, waits for the
136+
real release workflow, verifies the `public-proof` job and all artifact jobs,
137+
downloads the generated draft GitHub Release, checks `SHA256SUMS`, runs
138+
`scripts/release_verify.py`, verifies executable attestations, renders the
139+
Homebrew formula, then deletes the draft release and tag. It does not publish
140+
package registries, Homebrew taps, or production releases.
141+
126142
## Registry Rollback
127143

128144
If a package is unsafe:

docs/llms-full.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6574,6 +6574,23 @@ Homebrew formula from the fresh download, then deletes the draft release and its
65746574
temporary tag. Use `--keep` only when a maintainer needs to inspect the draft
65756575
release manually.
65766576

6577+
## Tag Workflow Rehearsal
6578+
6579+
Before the first public release candidate, and after any material release
6580+
workflow change, run the high-fidelity GitHub tag workflow drill:
6581+
6582+
```bash
6583+
scripts/release_workflow_rehearsal.sh --execute
6584+
```
6585+
6586+
The script creates a temporary prerelease tag on `origin/main`, waits for the
6587+
real `.github/workflows/release.yml` run, verifies that `public-proof`,
6588+
registry-readiness, package builds, CLI builds, container smoke, and draft
6589+
release assembly all succeeded, downloads the generated draft release from
6590+
GitHub, verifies checksums, release provenance, Homebrew formula rendering, and
6591+
executable attestations, then deletes the draft release and temporary tag. Use
6592+
`--keep` only when a maintainer needs to inspect the temporary draft manually.
6593+
65776594
## Current Automation
65786595

65796596
`.github/workflows/release.yml` runs on tags shaped like `v*.*.*` and builds:
@@ -6593,6 +6610,8 @@ release manually.
65936610
checksum manifest
65946611
- Dry-run draft release rollback rehearsal in CI; execute mode remains
65956612
maintainer-triggered only
6613+
- Maintainer-triggered tag workflow rehearsal through
6614+
`scripts/release_workflow_rehearsal.sh --execute`
65966615

65976616
The workflow uploads artifacts to the GitHub Actions run and attaches the
65986617
assembled release bundle to a draft GitHub Release. It does not publish to PyPI,

docs/release.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,23 @@ Homebrew formula from the fresh download, then deletes the draft release and its
215215
temporary tag. Use `--keep` only when a maintainer needs to inspect the draft
216216
release manually.
217217

218+
## Tag Workflow Rehearsal
219+
220+
Before the first public release candidate, and after any material release
221+
workflow change, run the high-fidelity GitHub tag workflow drill:
222+
223+
```bash
224+
scripts/release_workflow_rehearsal.sh --execute
225+
```
226+
227+
The script creates a temporary prerelease tag on `origin/main`, waits for the
228+
real `.github/workflows/release.yml` run, verifies that `public-proof`,
229+
registry-readiness, package builds, CLI builds, container smoke, and draft
230+
release assembly all succeeded, downloads the generated draft release from
231+
GitHub, verifies checksums, release provenance, Homebrew formula rendering, and
232+
executable attestations, then deletes the draft release and temporary tag. Use
233+
`--keep` only when a maintainer needs to inspect the temporary draft manually.
234+
218235
## Current Automation
219236

220237
`.github/workflows/release.yml` runs on tags shaped like `v*.*.*` and builds:
@@ -234,6 +251,8 @@ release manually.
234251
checksum manifest
235252
- Dry-run draft release rollback rehearsal in CI; execute mode remains
236253
maintainer-triggered only
254+
- Maintainer-triggered tag workflow rehearsal through
255+
`scripts/release_workflow_rehearsal.sh --execute`
237256

238257
The workflow uploads artifacts to the GitHub Actions run and attaches the
239258
assembled release bundle to a draft GitHub Release. It does not publish to PyPI,

justfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,9 @@ public-proof:
173173
draft-release-rehearsal:
174174
scripts/draft_release_rehearsal.sh
175175

176+
release-workflow-rehearsal:
177+
scripts/release_workflow_rehearsal.sh
178+
176179
homebrew-formula release_dir tag:
177180
scripts/homebrew_formula.py "{{release_dir}}" --tag "{{tag}}"
178181

@@ -385,6 +388,7 @@ docs-check:
385388
test -x scripts/network_proof_pack.py
386389
test -x scripts/release_rehearsal.sh
387390
test -x scripts/draft_release_rehearsal.sh
391+
test -x scripts/release_workflow_rehearsal.sh
388392
test -x scripts/hardening_gate.sh
389393
test -x scripts/public_readiness_gate.sh
390394
test -x scripts/railway_start.sh

scripts/hardening_gate.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,12 @@ contains "just public-proof" docs/release.md
161161
contains "just public-proof" .github/RELEASE_TEMPLATE.md
162162
contains "public-proof" .github/workflows/release.yml
163163
contains "release-preflight" justfile
164+
contains "release-workflow-rehearsal" justfile
164165
contains "just release-preflight" docs/release.md
165166
contains "just release-preflight" .github/RELEASE_TEMPLATE.md
167+
contains "release_workflow_rehearsal.sh --execute" docs/release.md
168+
contains "release_workflow_rehearsal.sh --execute" docs/distribution.md
169+
contains "release_workflow_rehearsal.sh --execute" .github/RELEASE_TEMPLATE.md
166170
contains "Stewardship Pledge" GOVERNANCE.md
167171
contains "CODEOWNERS" GOVERNANCE.md
168172
contains "Review Ownership" docs/review-ownership.md
@@ -214,6 +218,7 @@ bash -n scripts/install.sh
214218
bash -n scripts/package_dry_run.sh
215219
bash -n scripts/release_rehearsal.sh
216220
bash -n scripts/draft_release_rehearsal.sh
221+
bash -n scripts/release_workflow_rehearsal.sh
217222
bash -n scripts/paper_api_smoke.sh
218223
bash -n scripts/fresh_clone_rehearsal.sh
219224
bash -n scripts/railway_smoke.sh

0 commit comments

Comments
 (0)