feat: releases work out their version from the commits
All checks were successful
CI / check (push) Successful in 9m17s
CI / deploy (push) Successful in 14s

tool/release.sh no longer takes a version: it works it out from the
commits since the last release, following semantic versioning (feat
raises the minor number, fix or perf the patch number, a breaking change
the major number from 1.0 on and the minor one before; other types
release nothing), or takes major, minor or patch as chosen. It shows the
version and its commits and asks first, checks that CI is green on the
newest commit with code, writes the version and a raised build number
into the pubspec in a signed release commit with a signed tag, and
pushes only once the APK and the snap passed their checks. The release
notes list the features and fixes. A run that stopped after its release
commit and tag carries on with them.

Channels for now: the release on code.halkyon.app (APK, snap, checksums)
and the F-Droid repository; the Snap Store upload is off until
snap_store_channel names a channel.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-05 21:22:50 +02:00
commit 4d3d4d9592
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -110,31 +110,38 @@ the CI runner described in `deploy/runner/`, deploys only commits signed by a ke
## Releases
Releases are published on [code.halkyon.app](https://code.halkyon.app/project-halkyon/halkyon_learn/releases),
for Android also in the project's F-Droid repository
with the APK and the snap, and the APK also in the project's F-Droid repository
(`https://halkyon.app/fdroid/repo?fingerprint=E8082788756F6B7E682AA22FCEAD24B53E2A8B0912AD66D65E8C2D4F07BB94B0`,
added in the F-Droid app as a repository), and for Linux in the Snap Store
(`halkyon-learn`). Their builds connect to learn.halkyon.eu, the project's instance.
added in the F-Droid app as a repository). The Snap Store (`halkyon-learn`) follows.
Their builds connect to learn.halkyon.eu, the project's instance.
- **Checking a download:** `SHA256SUMS` lists the checksum of every file, signed with the
maintainer's GPG key (`SHA256SUMS.asc`). The APK is signed with the app's key, whose
certificate has the SHA-256
`27:E2:43:FC:BD:C8:26:FF:98:AB:7D:BB:10:43:6C:98:C3:BE:A2:4B:2A:01:5E:94:E4:CF:C7:D1:FC:2A:00:6C`
(`apksigner verify --print-certs` shows it).
- **Versions** are `version` in `halkyon_learn_flutter/pubspec.yaml`,
`<major>.<minor>.<patch>+<build>`. Every release raises the build number: Android only
installs a higher one over an older, and the server tells apps below the build it
supports to update.
- **Versions** follow [semantic versioning](https://semver.org): `version` in
`halkyon_learn_flutter/pubspec.yaml`, `<major>.<minor>.<patch>+<build>`. Since the last
release, a commit typed `feat` raises the minor number, `fix` or `perf` the patch
number, and a breaking one (`feat!:` or a `BREAKING CHANGE:` line) the major number from
1.0 on, the minor one before; other commits release nothing by themselves. Every
release raises the build number: Android only installs a higher one over an older, and
the server tells apps below the build it supports to update.
- **Making one** is for maintainers, on their own machine and never in CI:
`tool/release.sh`, or `tool/release.sh minor` (or `major`, `patch`) to choose. It needs
`main` clean, pushed and green in CI, the app's key, the F-Droid repository's key and
a Forgejo token; its header says more. It shows the version and its commits and asks
first, then writes the version into the pubspec in a signed release commit with a
signed tag, builds the APK and the snap (`snap/snapcraft.yaml`, built in LXD; its icon
comes from `tool/snap_icon.py`), checks both, signs the checksums, pushes, and
publishes on code.halkyon.app and in the F-Droid repository; the Snap Store once it is
switched on in the script. Besides Flutter and the Android SDK, it uses snapcraft with
LXD, a JDK (keytool), GnuPG, curl, jq, unzip, squashfs-tools, rsync and fdroidserver.
Release builds made without the app's key are signed with the debug key and can't
update a released app.
- **The F-Droid repository** is kept by `tool/fdroid_repo.sh` (fdroidserver v2.4.5,
e.g. `pipx install fdroidserver==2.4.5`); its settings and the app's listing are in
`tool/release/fdroid/`.
- **Making one** is for maintainers, on their own machine and never in CI:
`tool/release.sh vX.Y.Z`. Its header says what it needs (the signed tag, the app's
key, a Forgejo token, `snapcraft login`). It builds the APK and the snap
(`snap/snapcraft.yaml`, built in LXD; its icon comes from `tool/snap_icon.py`), checks
both, signs the checksums and publishes everything. Besides Flutter and the Android
SDK, it uses snapcraft with LXD, a JDK (keytool), GnuPG, curl, jq, unzip and
squashfs-tools. Release builds made without the app's key are signed with the debug
key and can't update a released app.
## More