Skip to content
Bitcoin Roots

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.