Radish alpha
r
rad:z4D5UCArafTzTQpDZNQRuqswh3ury
Radicle desktop app
Radicle
Git
radicle-desktop RELEASE.md

Release process

  • In your working shell set the following variables

    VERSION="X.Y.Z"
    RADICLE_DESKTOP_DIR="$(pwd)"                      # absolute path to this repo
    
    # User-specific — adjust these to your environment
    FULL_NAME="Rūdolfs Ošiņš"
    EMAIL="rudolfs@osins.org"
    USERNAME="rudolfs"
    SSH_KEY="$HOME/.ssh/id_ed25519"
    SIGNING_KEY="$HOME/.ssh/rudolfs-apt-signing-key"
    FILES_HOST="files.radicle.dev"
    
  • Create a new release branch

    rad sync && git fetch
    git checkout -b release/v${VERSION}
    
  • Update the version in crates/radicle-tauri/tauri.conf.json.

  • Update CHANGELOG.md — only include changes relevant to users. Add a shoutout to any external contributors.

  • Commit the changes git commit -a -m "Release v${VERSION}". This commit is the Release Commit.

  • In your working shell, set the release commit SHA

    RELEASE_SHA="$(git rev-parse HEAD)"
    
  • Update Arch Linux package info

    • Update pkgver in arch/radicle-desktop/PKGBUILD to match the release version

    • Update _commit in arch/radicle-desktop/PKGBUILD to the release commit created above.

    • Regenerate .SRCINFO with

      cd arch && ./generate-srcinfo.sh
      
    • Commit the changes (from the repo root):

      git add arch/radicle-desktop/.SRCINFO
      git add arch/radicle-desktop/PKGBUILD
      git commit -m "Update arch package to v${VERSION}"
      
  • Create a Release Patch with git push rad HEAD:refs/patches

  • Wait for CI of the Release Patch to pass

  • Wait for approval of the Release Patch and merge it into main

  • Build all release artifacts

    scripts/release
    

    This builds the macOS DMG, Linux amd64 deb and AppImage. Artifacts are written to releases/v${VERSION}/.

    To build a single artifact, pass the corresponding flag:

    scripts/release --only-dmg        # macOS aarch64 DMG
    scripts/release --only-deb        # Linux amd64 deb
    scripts/release --only-appimage   # Linux amd64 AppImage
    

    The macOS DMG is built natively. The Linux builds run in an ARM64 Podman container (Dockerfile.release) that cross-compiles Rust to x86_64. The AppImage additionally requires x86_64 emulation via binfmt_misc + QEMU to run linuxdeploy inside the ARM64 container — see scripts/appimage-build for details.

    The Linux builds cache Rust artifacts in named Podman volumes across runs. To start fully from scratch:

    scripts/release --clean && scripts/release
    

    --clean wipes target-release/, node_modules/, all Linux build volumes, and the container image. To only rebuild the container image while keeping the cached volumes (e.g. after updating Dockerfile.release):

    scripts/release --rebuild-image
    

    After the build, install the macOS DMG and start the app to verify that it works.

  • Sign the Debian package from radicle-apt-repo

    cd radicle-apt-repo
    rad sync && git fetch
    
    cp "$RADICLE_DESKTOP_DIR/releases/v${VERSION}/radicle-desktop_${VERSION}_amd64.deb" .
    
    docker build -t radicle-apt scripts
    docker run --rm -it \
      -v "$(pwd):/src/apt" \
      -v "$SIGNING_KEY:/src/keys/signing-key" \
      -e SIGNING_KEY=/src/keys/signing-key \
      -e DEBEMAIL="$EMAIL" \
      -e DEBFULLNAME="$FULL_NAME" \
      -e SSH_USER="$USERNAME" \
      -v "$SSH_KEY:/root/.ssh/id_ed25519:ro" \
      radicle-apt
    

    Inside the container, run:

    RADICLE_APT_SIGNING_KEY=/src/keys/signing-key ./import-deb radicle-desktop_${VERSION}_amd64.deb
    

    Then from the host:

    git checkout -b release-v${VERSION}
    git add db/ dists/ pool/
    git commit -m "Update radicle-desktop to ${VERSION}"
    git push rad HEAD:refs/patches
    
    # Once you get peer approval, merge the patch
    git checkout main
    git merge --ff-only release-v${VERSION}
    git push
    
  • Publish the Debian package to the APT repository from radicle-apt-repo

    make publish
    
  • Publish release files from radicle-desktop

    cd radicle-desktop
    
    scp -i "$(rad path)/keys/radicle" releases/v${VERSION}/* "${USERNAME}@${FILES_HOST}:/var/www/${FILES_HOST}/releases/radicle-desktop/latest"
    
  • Publish the Arch package by pushing changes to the Arch User Repository (You need to be a maintainer of the AUR package to push)

    cd arch && ./publish.sh "Release v${VERSION}"
    
  • Verify the Arch package version on the AUR

  • Resolve the previous release topic on Zulip

  • Announce the release on Zulip, following the previous announcement format

# Release process

- In your working shell set the following variables

  ```bash
  VERSION="X.Y.Z"
  RADICLE_DESKTOP_DIR="$(pwd)"                      # absolute path to this repo

  # User-specific — adjust these to your environment
  FULL_NAME="Rūdolfs Ošiņš"
  EMAIL="rudolfs@osins.org"
  USERNAME="rudolfs"
  SSH_KEY="$HOME/.ssh/id_ed25519"
  SIGNING_KEY="$HOME/.ssh/rudolfs-apt-signing-key"
  FILES_HOST="files.radicle.dev"
  ```

- Create a new release branch

  ```bash
  rad sync && git fetch
  git checkout -b release/v${VERSION}
  ```

- Update the version in `crates/radicle-tauri/tauri.conf.json`.
- Update `CHANGELOG.md` — only include changes relevant to users. Add a shoutout
  to any external contributors.
- Commit the changes `git commit -a -m "Release v${VERSION}"`. This commit is the
  _Release Commit_.
- In your working shell, set the release commit SHA

  ```bash
  RELEASE_SHA="$(git rev-parse HEAD)"
  ```

- Update Arch Linux package info
  - Update `pkgver` in `arch/radicle-desktop/PKGBUILD` to match the release version
  - Update `_commit` in `arch/radicle-desktop/PKGBUILD` to the release commit
    created above.
  - Regenerate `.SRCINFO` with

    ```bash
    cd arch && ./generate-srcinfo.sh
    ```

  - Commit the changes (from the repo root):

    ```bash
    git add arch/radicle-desktop/.SRCINFO
    git add arch/radicle-desktop/PKGBUILD
    git commit -m "Update arch package to v${VERSION}"
    ```

- Create a _Release Patch_ with `git push rad HEAD:refs/patches`
- Wait for CI of the Release Patch to pass
- Wait for approval of the Release Patch and merge it into `main`

- Build all release artifacts

  ```bash
  scripts/release
  ```

  This builds the macOS DMG, Linux amd64 deb and AppImage.
  Artifacts are written to `releases/v${VERSION}/`.

  To build a single artifact, pass the corresponding flag:

  ```bash
  scripts/release --only-dmg        # macOS aarch64 DMG
  scripts/release --only-deb        # Linux amd64 deb
  scripts/release --only-appimage   # Linux amd64 AppImage
  ```

  The macOS DMG is built natively. The Linux builds run in an ARM64
  Podman container (`Dockerfile.release`) that cross-compiles Rust to
  x86_64. The AppImage additionally requires x86_64 emulation via
  binfmt_misc + QEMU to run linuxdeploy inside the ARM64 container — see
  `scripts/appimage-build` for details.

  The Linux builds cache Rust artifacts in named Podman volumes across
  runs. To start fully from scratch:

  ```bash
  scripts/release --clean && scripts/release
  ```

  `--clean` wipes `target-release/`, `node_modules/`, all Linux build
  volumes, and the container image. To only rebuild the container image
  while keeping the cached volumes (e.g. after updating
  `Dockerfile.release`):

  ```bash
  scripts/release --rebuild-image
  ```

  After the build, install the macOS DMG and start the app to verify that it works.

- Sign the Debian package from `radicle-apt-repo`

  ```bash
  cd radicle-apt-repo
  rad sync && git fetch

  cp "$RADICLE_DESKTOP_DIR/releases/v${VERSION}/radicle-desktop_${VERSION}_amd64.deb" .

  docker build -t radicle-apt scripts
  docker run --rm -it \
    -v "$(pwd):/src/apt" \
    -v "$SIGNING_KEY:/src/keys/signing-key" \
    -e SIGNING_KEY=/src/keys/signing-key \
    -e DEBEMAIL="$EMAIL" \
    -e DEBFULLNAME="$FULL_NAME" \
    -e SSH_USER="$USERNAME" \
    -v "$SSH_KEY:/root/.ssh/id_ed25519:ro" \
    radicle-apt
  ```

  Inside the container, run:

  ```bash
  RADICLE_APT_SIGNING_KEY=/src/keys/signing-key ./import-deb radicle-desktop_${VERSION}_amd64.deb
  ```

  Then from the host:

  ```bash
  git checkout -b release-v${VERSION}
  git add db/ dists/ pool/
  git commit -m "Update radicle-desktop to ${VERSION}"
  git push rad HEAD:refs/patches

  # Once you get peer approval, merge the patch
  git checkout main
  git merge --ff-only release-v${VERSION}
  git push
  ```

- Publish the Debian package to the APT repository from `radicle-apt-repo`

  ```bash
  make publish
  ```

- Publish release files from `radicle-desktop`

  ```bash
  cd radicle-desktop

  scp -i "$(rad path)/keys/radicle" releases/v${VERSION}/* "${USERNAME}@${FILES_HOST}:/var/www/${FILES_HOST}/releases/radicle-desktop/latest"
  ```

- Publish the Arch package by pushing changes to the [Arch User Repository][1]
  (You need to be a maintainer of the AUR package to push)

  ```bash
  cd arch && ./publish.sh "Release v${VERSION}"
  ```

- Verify the Arch package version on the [AUR](https://aur.archlinux.org/packages/radicle-desktop)
- Resolve the previous release topic on Zulip
- Announce the release on Zulip, following the [previous announcement format][2]



[1]: https://aur.archlinux.org/packages/radicle-desktop
[2]: https://radicle.zulipchat.com/#narrow/channel/409174-announcements/topic/radicle-desktop.20v0.2E2.2E0.20.28early.20preview.29/with/514356912