This document describes the release process for rustfava.
A release involves:
- Creating a git tag
- Automated builds (desktop apps, PyPI, Docker)
- Publishing the release
- Updating Nix flake sources
git checkout main
git pull
git tag v0.1.x
git push origin v0.1.xThe tag triggers several workflows:
| Workflow | Purpose | Duration |
|---|---|---|
desktop-release.yml |
Builds desktop apps for all platforms | ~10 min |
build-publish.yml |
Builds and publishes to PyPI, Docker, COPR | ~60 min |
Monitor at: https://github.com/rustledger/rustfava/actions
The PyPI environment requires manual approval:
- Go to the running
build-publish.ymlworkflow - Click "Review deployments"
- Approve the
pypienvironment
Once desktop-release.yml completes, it creates a draft release with:
.AppImage(Linux).deb,.rpm(Linux packages).dmg(macOS).msi,.exe(Windows).tar.gz(Linux tarball for Nix)
Publish it:
gh release edit v0.1.x --draft=falseOr via GitHub UI: https://github.com/rustledger/rustfava/releases
Publishing the release triggers update-flake-sources.yml, which:
- Downloads release tarballs
- Computes SRI hashes
- Creates a PR updating
desktop-sources.json
Merge the PR when it passes CI.
Test the release:
# Desktop app via Nix
nix run github:rustledger/rustfava#desktop --refresh
# CLI via Nix
nix run github:rustledger/rustfava --refresh
# CLI via PyPI
uv tool install rustfava --upgrade
# Docker
docker pull ghcr.io/rustledger/rustfava:v0.1.x| Artifact | Source | Distribution |
|---|---|---|
| Desktop apps | desktop-release.yml |
GitHub Releases |
| Python package | build-publish.yml |
PyPI |
| Docker image | build-publish.yml |
GHCR |
| Nix flake | flake.nix + desktop-sources.json |
GitHub |
Check that desktop-release.yml completed successfully. The release job only runs on tags.
The update-flake-sources.yml workflow only triggers on release: published events. Make sure the release is not still in draft.
Check the workflow logs. Common issues:
- Version already exists on PyPI (can't overwrite)
- Missing approval for the
pypienvironment