Since desktop was merged in, its `releases/<version>` tags are in our history too, and `git describe --match='releases/*'` picked up `releases/0.16.0` as the httpd version. The changelog also leaves out `desktop/`, otherwise the next one would list its whole history.
4.6 KiB
Release Process
radicle-httpd and radicle-search are released together from this
workspace: a single tag, a single changelog, and one build run that produces
artifacts for both binaries. They share the same version number, bumped in
lockstep. On files.radicle.dev each binary gets its own release
folder — releases/radicle-httpd/<version>/ and, as a sibling,
releases/radicle-search/<version>/ — so existing radicle-httpd download
URLs are unaffected and radicle-search is downloaded independently.
The release tooling lives in crates/radicle-httpd/build/.
Scope
Releases cover only the radicle-httpd and radicle-search binaries. The
web front-end (radicle-explorer) is not released this way: it is deployed
continuously (rolling release) and must always remain compatible with the
latest radicle-httpd/radicle-search release.
Prerequisites
- Git signing configured via SSH:
git config set gpg.format ssh git config set user.signingKey "key::$(rad self --ssh-key)" - Working
podmansetup (see Podman Setup below) - Required tools:
podman,rad,sha256sum
Prepare Release
-
Create release branch:
git checkout -b release/httpd/<version> -
Bump the version in both crates to the same value, so the two binaries stay coupled:
crates/radicle-httpd/Cargo.tomlcrates/radicle-search/Cargo.toml
-
Update lockfiles:
cargo build -
Generate changelog (the version is read from
crates/radicle-httpd/Cargo.toml):crates/radicle-httpd/build/changelog >> CHANGELOG.md -
Edit changelog and remove irrelevant entries. Note in each entry whether a change belongs to
radicle-httpdorradicle-search. -
Commit release:
git commit -m "Release <version>" -
Push for review:
git push rad HEAD:refs/patches
Review & Merge
- Wait for delegate approvals
- Merge patch into
master
Tag Release
Create and sign the release tag (one tag covers both binaries):
crates/radicle-httpd/build/tag <version>
Publish the tag to Radicle. Push only this tag: every tag under releases/
that a delegate pushes becomes canonical, so --tags would also publish any
stray local ones.
git push rad refs/tags/releases/httpd/<version>
rad sync
Build Artifacts
Run the reproducible build (Linux x86_64 or macOS). A single run compiles the workspace and packages both binaries — one archive per binary per target:
crates/radicle-httpd/build/build
This writes to crates/radicle-httpd/build/artifacts/:
radicle-httpd-<version>-<target>.tar.xz(binary + man page)radicle-search-<version>-<target>.tar.xz(binary)
each with a .sig and .sha256 alongside.
Note: A tagged commit is required; versioning uses
git describe.
Upload Artifacts
The upload publishes each binary into its own sibling folder on
files.radicle.dev and creates the version-less and latest symlinks
for both:
SSH_LOGIN=<username> crates/radicle-httpd/build/upload
Warning: Uploading immediately publishes the release.
Announce Release
-
Mark the previous release as resolved in Zulip
#Announcements -
Create a new announcement with the following template:
Topic:
radicle-httpd + radicle-search <version>Message:
# 👾 radicle-httpd + radicle-search <version> `radicle-httpd` and `radicle-search` <version> (<build-id>) are released. ## Installation Download binaries from: - https://files.radicle.dev/releases/radicle-httpd/<version> - https://files.radicle.dev/releases/radicle-search/<version> - https://radicle.dev/download ## Changelog <copy output from crates/radicle-httpd/build/changelog> ## Checksums ``` <copy output from crates/radicle-httpd/build/checksums> ``` :info: This release was built on <platform>. Build reproducibility across platforms is unsupported; checksums may differ if rebuilt elsewhere.
Notes
Important:
- macOS binaries are unsigned and not notarized; download via CLI only
- Build reproducibility across platforms is not guaranteed
Podman Setup
We use podman for reproducible builds across machines. It's preferred over Docker because it runs without a daemon and doesn't require root access.
On first run, you may need to configure UID/GID ranges:
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER
podman system migrate