Release — F-Droid repo + Gitea/Codeberg release + Play / detect (push) Successful in 8s
Release — F-Droid repo + Gitea/Codeberg release + Play / release (push) Skipped
Release — F-Droid repo + Gitea/Codeberg release + Play / play (push) Skipped
Renovate / renovate (push) Successful in 52s
### What this changes Adds beta releases. Pushing a `release/*` branch whose committed `versionName` is `X.Y.Z-beta.N` makes the new `.gitea/workflows/beta.yaml` run the unit tests, build and sign the APK with the app key, and publish it as a **Codeberg pre-release** (APK + `.sha256`), plus a Gitea pre-release with the R8 mapping. F-Droid (self-hosted and official) and Play never get a beta; Obtainium only offers it with *Include prereleases* on. - **`scripts/version_info.sh`** is the single source for `versionName` → `versionCode`, used by `release.yaml`, `beta.yaml`, the changelog sync and the store-listing check. From 1.1.0: `X*1000000 + Y*10000 + Z*100 + N` for betas (N = 1–98), `+ 99` for stable, so `1.1.0-beta.1` → `1010001`, `1.1.0` → `1010099`. All 1.0.x versions keep the legacy formula, so `release/v1.0.1` (code `10001`) stays valid. - **Shared publish scripts:** `scripts/publish_codeberg_release.sh`, `scripts/publish_gitea_release.sh` and `scripts/release_notes.sh`, moved out of `release.yaml`. The stable path behaves as before. - **Guards:** - CI fails a PR whose committed `versionCode` doesn't match its `versionName`. - CI fails a PR into `main` that carries a beta version. - `release.yaml`'s `detect` refuses a beta on `main` as a backstop. - `beta.yaml` refuses a beta of a version that has already shipped as stable. - Betas get no store What's New file. - **Docs:** "Cutting a beta" and the versionCode table in `docs/RELEASING.md`; a note on beta tags in `docs/fdroid-official/README.md`; how to opt in to betas in the README. ### Why To ship a test build of an upcoming version (e.g. 1.1.0) to opted-in testers before the stable release, without it reaching F-Droid or Play users. ### How it was tested - `scripts/version_info.sh` against stable, beta, legacy and invalid version names. - Both publish scripts against a mock forge API: create, re-run (PATCH plus asset replacement), Codeberg's 500-then-retry path, and the skip when no token is set. - A scratch copy with `1.1.0-beta.1` committed: the version check passes, the changelog sync and `check_store_listing.py --complete` pass without a What's New, the PR-into-main guard trips, and a wrong `versionCode` is rejected. - `sync_changelog_to_fastlane.sh` and `check_store_listing.py` (with and without `--complete`) still pass on the current `1.0.0`. - All three workflow files parse as YAML. Not run on the real runners yet. The first beta push is the live test of `beta.yaml`, which assumes a mirrored branch push starts a workflow on Gitea, the same way pushes to `main` already do. ### Checklist - [x] No `versionName` / `versionCode` bump - [x] No `values-*/strings.xml` touched - [x] `CHANGELOG.md` not updated: this is release infrastructure, not a user-visible change Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de> Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/38
59 lines
2.2 KiB
Bash
Executable File
59 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Ensure the current version's "What's New" exists at
|
|
# fastlane/metadata/android/en-US/changelogs/<code>.txt, which both F-Droid and
|
|
# Google Play publish.
|
|
#
|
|
# A COMMITTED file wins and is never rewritten: it is a hand-written summary
|
|
# under 500 characters (Play's cap), not a copy of the CHANGELOG.md section.
|
|
# Only when the file is missing is it generated from that section, so the
|
|
# self-hosted release pipeline always has something to publish. The other
|
|
# locales' changelogs are written by hand and never touched here.
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")/.." # repo root
|
|
|
|
VERSION=$(bash scripts/version_info.sh version)
|
|
VERSION_CODE=$(bash scripts/version_info.sh version_code)
|
|
|
|
# Betas only ship to Codeberg, whose notes come from CHANGELOG.md. A What's New
|
|
# file for one would sit in the tree F-Droid and Play read, so none is wanted.
|
|
if [ "$(bash scripts/version_info.sh channel)" = beta ]; then
|
|
echo "Beta $VERSION: no store What's New (betas only ship to Codeberg)."
|
|
exit 0
|
|
fi
|
|
|
|
# Play rejects a longer "What's New" and F-Droid truncates it in-client.
|
|
MAX_CHARS=${MAX_CHARS:-500}
|
|
|
|
CL_DIR="fastlane/metadata/android/en-US/changelogs"
|
|
mkdir -p "$CL_DIR"
|
|
OUT="$CL_DIR/${VERSION_CODE}.txt"
|
|
|
|
if [ -s "$OUT" ]; then
|
|
ACTION="Kept"
|
|
else
|
|
ACTION="Generated"
|
|
awk -v ver="$VERSION" '
|
|
$0 ~ "^## \\[" ver "\\]" { flag = 1; next }
|
|
/^## \[/ { flag = 0 }
|
|
flag' CHANGELOG.md > "$OUT"
|
|
# Trim leading blank lines (same as the pipeline did).
|
|
sed -i -e '/./,$!d' "$OUT"
|
|
[ -s "$OUT" ] || echo "See CHANGELOG.md for $VERSION." > "$OUT"
|
|
fi
|
|
|
|
# Counted like check_store_listing.py: surrounding whitespace doesn't count.
|
|
CHARS=$(python3 -c 'import sys; print(len(open(sys.argv[1], encoding="utf-8").read().strip()))' "$OUT")
|
|
echo "$ACTION $OUT (version $VERSION, code $VERSION_CODE, ${CHARS} chars)"
|
|
|
|
# Hard limit, enforced in CI (.forgejo/workflows/ci.yaml) and before a release.
|
|
if [ "$CHARS" -gt "$MAX_CHARS" ]; then
|
|
cat >&2 <<MSG
|
|
ERROR: $OUT is $CHARS characters, over the $MAX_CHARS-character limit.
|
|
|
|
F-Droid truncates the in-client changelog, so this one would be cut off
|
|
mid-sentence and Play would reject the upload. Replace it with a hand-written
|
|
summary under $MAX_CHARS characters and commit it.
|
|
MSG
|
|
exit 1
|
|
fi
|