v30.3-roots.1 · Commit 63: [PATCH 63/68] fix(release): restore signed five-platform CI releases
contrib/roots/README.md
Before: contrib/roots/README.md · After: contrib/roots/README.md
File metadata
index a4a46df1ab907b2cf2ed9a11eee43888ef30c1bf..ed09fa141e22280b0a53b9f19cc69fcb9e7fd959 100644
Download original patch · Release notes
Diff rows 1–83 of 83. Line numbers refer to the original before/after files.
+ Added− RemovedUnmarked lines are context.
Scroll the code area horizontally to read long lines. Before is on the left; after is on the right. Unified view fits narrow screens more easily.
contrib/roots/README.md
CHANGED
|
@@ -243,29 +243,24 @@ git check-ref-format "refs/tags/$release_tag"
|
|
| 243 |
git fetch origin roots/30.3
|
| 244 |
git fetch https://github.com/bitcoin/bitcoin.git \
|
| 245 |
refs/tags/v30.3:refs/tags/v30.3
|
| 246 |
-
git tag --annotate "$release_tag" -m "Bitcoin Roots $release_tag"
|
|
|
|
| 247 |
git rev-parse "$release_tag^{commit}"
|
| 248 |
test "$(git rev-parse "$release_tag^{commit}")" = \
|
| 249 |
"$(git rev-parse origin/roots/30.3^{commit})"
|
| 250 |
ci/release/validate-release-source.sh "$release_tag"
|
| 251 |
```
|
| 252 |
|
| 253 |
-
Run the retained release metadata tests before pushing:
|
|
|
|
| 254 |
|
| 255 |
```sh
|
| 256 |
-
python3 ci/test/test_prepare_release.py
|
| 257 |
-
python3 ci/test/test_release_notices.py
|
| 258 |
-
python3 ci/test/test_create_release_draft.py
|
| 259 |
-
python3 ci/test/test_prepare_release_source.py
|
| 260 |
-
python3 ci/test/test_create_patch_series.py
|
| 261 |
-
python3 ci/test/test_sign_manifest.py
|
| 262 |
-
python3 ci/test/test_validate_release_tag.py
|
| 263 |
-
python3 ci/test/test_validate_release_source.py
|
| 264 |
-
python3 ci/test/test_release_version.py
|
| 265 |
```
|
| 266 |
|
| 267 |
A release tag does not need to be reachable from `main`. Permanent tag pushes
|
| 268 |
-
do not dispatch builds or upload assets. Release validation requires the tag
|
|
|
|
| 269 |
target to match its canonical `roots/<core-version>` branch. The release patch
|
| 270 |
is generated from the Core tag and canonical commits at release time and is not
|
| 271 |
checked into the repository. It deliberately excludes `.github/**`: Roots'
|
|
@@ -288,22 +283,28 @@ The series contains inherited CRLF files. Apply the released mbox with
|
|
| 288 |
those bytes. Replay verification uses the same command and checks tree equality
|
| 289 |
outside `.github/**`.
|
| 290 |
|
| 291 |
-
The read-only manual workflow builds Linux x86_64/aarch64, macOS x86_64/arm64
|
| 292 |
-
and Windows x86_64 intermediates plus the portable patch. Assemble the reviewed
|
| 293 |
-
notices and final assets through `ci/release/README.md` before tagging. Pin the
|
| 294 |
-
exact candidate commit, six asset checksums, manifest digest and curated notes
|
| 295 |
-
digest in the release review. A packaging-only correction must reconcile the
|
| 296 |
-
source/patch and disclose the original build source; it must not relabel older
|
| 297 |
-
executables as newly built.
|
| 298 |
-
|
| 299 |
-
After an explicitly authorized immutable annotated tag is pushed, use the
|
| 300 |
-
verified-assets draft helper documented in `ci/release/README.md`. It rechecks
|
| 301 |
-
the remote canonical/tag identities, notices, checksums and exact replayed
|
| 302 |
-
patch, and refuses any existing release. It does not build or publish. The
|
| 303 |
-
current helper accepts an unsigned seven-file packet; describe manifest, tag
|
| 304 |
-
and platform signing separately and accurately. The existing
|
| 305 |
-
`sign-manifest.sh` interface remains available for separately authorized signing,
|
| 306 |
-
but signed packets require a separate reviewed handoff. Independently download
|
| 307 |
-
and verify the draft's archives, patch, checksums, notes, tag target and source
|
| 308 |
-
before changing only its visibility under publication authority. Never replace
|
| 309 |
-
published tags/assets or use `--clobber`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 243 |
git fetch origin roots/30.3
|
| 244 |
git fetch https://github.com/bitcoin/bitcoin.git \
|
| 245 |
refs/tags/v30.3:refs/tags/v30.3
|
| 246 |
+
release_commit=$(git rev-parse origin/roots/30.3^{commit})
|
| 247 |
+
git tag --annotate "$release_tag" "$release_commit" -m "Bitcoin Roots $release_tag"
|
| 248 |
git rev-parse "$release_tag^{commit}"
|
| 249 |
test "$(git rev-parse "$release_tag^{commit}")" = \
|
| 250 |
"$(git rev-parse origin/roots/30.3^{commit})"
|
| 251 |
ci/release/validate-release-source.sh "$release_tag"
|
| 252 |
```
|
| 253 |
|
| 254 |
+
Run the retained CI/release metadata tests before pushing (this includes signing,
|
| 255 |
+
portable-patch replay, runner notices and signed-draft gates):
|
| 256 |
|
| 257 |
```sh
|
| 258 |
+
python3 -m unittest discover -s ci/test
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 259 |
```
|
| 260 |
|
| 261 |
A release tag does not need to be reachable from `main`. Permanent tag pushes
|
| 262 |
+
start fresh five-platform builds and a tag-only signed-draft job; manual
|
| 263 |
+
dispatch remains a read-only rehearsal. Release validation requires the tag
|
| 264 |
target to match its canonical `roots/<core-version>` branch. The release patch
|
| 265 |
is generated from the Core tag and canonical commits at release time and is not
|
| 266 |
checked into the repository. It deliberately excludes `.github/**`: Roots'
|
|
|
|
| 283 |
those bytes. Replay verification uses the same command and checks tree equality
|
| 284 |
outside `.github/**`.
|
| 285 |
|
| 286 |
+
Both workflow paths build Linux x86_64/aarch64, macOS x86_64/arm64 and Windows
|
| 287 |
+
x86_64 packages, collecting exact installed dependency notices in each runner
|
| 288 |
+
before archive upload. Linux uses pinned verified depends sources, macOS uses
|
| 289 |
+
matching installed Homebrew receipts/source hashes and actual bundle linkage,
|
| 290 |
+
and Windows uses installed static-triplet port copyrights/versions. Missing or
|
| 291 |
+
mismatched evidence fails. See `ci/release/README.md` for the collection interface.
|
| 292 |
+
|
| 293 |
+
The tag-only `release` environment job waits for all five builds and the patch,
|
| 294 |
+
downloads only its own run's outputs and runs `prepare-release.sh`. It requires
|
| 295 |
+
the existing organization secret `BITCOIN_ROOTS_GPG_SK`, confined to the signing
|
| 296 |
+
step, and verifies checked-in public-key fingerprint
|
| 297 |
+
`5EADD53F2CD1F0B7AEEE920D25FC5C29CD528E32`. Missing signing capability fails.
|
| 298 |
+
`create-ci-draft.py` independently verifies the detached manifest signature,
|
| 299 |
+
packet/source/patch and fresh remote identities, and creates only a new draft
|
| 300 |
+
with exactly eight assets: five archives, patch, SHA512SUMS and SHA512SUMS.asc.
|
| 301 |
+
Every existing draft/public release blocks creation. There is no update,
|
| 302 |
+
clobber, deletion or replacement branch; interrupted creation requires operator
|
| 303 |
+
inspection, never an automatic retry that replaces partial assets.
|
| 304 |
+
|
| 305 |
+
Curated notes retain contributor credit, including #24/#25, and the CI draft
|
| 306 |
+
adds the actual fresh run/source identity and signing disclosures. Manifest
|
| 307 |
+
signing is separate from Git-tag and platform-code signing. Independently
|
| 308 |
+
download and verify all eight draft assets and notes before separately authorized
|
| 309 |
+
visibility-only publication. Verify the public release again unauthenticated.
|
| 310 |
+
Never replace published tags/assets; maintenance uses a reviewed new release.
|