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 1m26s
### What this changes - New `scripts/release_gate.sh`, used by the `detect` jobs of both `release.yaml` and `beta.yaml`, decides whether the committed version still needs publishing. Tags are read by exact name via `git ls-remote` instead of Codeberg's `git/refs/tags/<name>` API. - A beta counts as done only once its Codeberg pre-release carries the APK, so a publish that failed part-way is redone by the next push of the branch. - A beta is refused unless it is newer than the latest stable tag (previously only an exact `vX.Y.Z` tag was checked). - `publish_codeberg_release.sh` fails a pre-release when `CODEBERG_RELEASE_TOKEN` is missing (stable still skips), fails on any asset upload that doesn't return 201, and no longer aborts when the asset listing returns an error. - `version_info.sh` rejects leading zeros (`1.1.0-beta.01` would have shared `beta.1`'s versionCode under a different tag). - `beta.yaml` header and `docs/RELEASING.md` updated to match. ### Why Codeberg's `git/refs/tags/<name>` matches by prefix: asking for `v1.1.0` returns 200 because `v1.1.0-beta.1` exists. Merging 1.1.0 into `main` would have logged "tag already exists" and shipped nothing while the run stayed green, and `1.1.0-beta.2` would have been refused as "already shipped stable". `release/v1.1.0` needs `main` merged in after this lands, since `beta.yaml` runs from the pushed branch's files. ### Also in here `gradle/gradle-daemon-jvm.properties` now points at JetBrains' own download URLs for JBR 21.0.11 instead of foojay. foojay dropped JetBrains 21 from its index, so the pinned package ids return 400 and CI couldn't provision the daemon JVM (unrelated to the release change, but it blocks every PR until fixed). ### Checklist - [x] No `values-*/strings.xml` touched - [x] No `versionName` / `versionCode` bump - [x] `CHANGELOG.md` not updated: release infrastructure, not a user-visible change Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de> Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/40
88 lines
3.5 KiB
Bash
Executable File
88 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# The one place that turns the committed versionName into a versionCode and a
|
|
# release channel. The release and beta pipelines, the changelog sync and the
|
|
# store-listing check all read it from here, so the scheme can't drift between
|
|
# them.
|
|
#
|
|
# versionName channel versionCode
|
|
# X.Y.Z (< 1.1.0) stable X*10000 + Y*100 + Z (legacy)
|
|
# X.Y.Z-beta.N beta X*1000000 + Y*10000 + Z*100 + N (N = 1..98)
|
|
# X.Y.Z (>= 1.1.0) stable X*1000000 + Y*10000 + Z*100 + 99
|
|
#
|
|
# A beta's code sits below its own stable release and above everything before
|
|
# it, so a beta install updates in place to the next beta and then to the
|
|
# stable version. Every 1.0.x keeps the legacy code it already shipped with;
|
|
# the first new-scheme code (1.1.0-beta.1 -> 1010001) is above all of them.
|
|
#
|
|
# scripts/version_info.sh print version, version_code, base_version,
|
|
# channel and prerelease as key=value lines
|
|
# (ready for $GITHUB_OUTPUT)
|
|
# scripts/version_info.sh <key> print just that value
|
|
# scripts/version_info.sh --check also fail unless the committed versionCode
|
|
# matches; the official F-Droid repo builds
|
|
# the tag as committed, so it must
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")/.." # repo root
|
|
|
|
GRADLE="app/build.gradle.kts"
|
|
NAME=$(grep -oP 'versionName\s*=\s*"\K[^"]+' "$GRADLE" || true)
|
|
COMMITTED=$(grep -oP 'versionCode\s*=\s*\K[0-9]+' "$GRADLE" || true)
|
|
[ -n "$NAME" ] || { echo "No versionName in $GRADLE" >&2; exit 1; }
|
|
|
|
if [[ ! "$NAME" =~ ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-beta\.([1-9][0-9]*))?$ ]]; then
|
|
echo "versionName '$NAME' is neither X.Y.Z nor X.Y.Z-beta.N" >&2
|
|
exit 1
|
|
fi
|
|
MAJOR=${BASH_REMATCH[1]}; MINOR=${BASH_REMATCH[2]}; PATCH=${BASH_REMATCH[3]}
|
|
BETA=${BASH_REMATCH[5]}
|
|
BASE="$MAJOR.$MINOR.$PATCH"
|
|
|
|
if [ "$MINOR" -gt 99 ] || [ "$PATCH" -gt 99 ]; then
|
|
echo "versionName '$NAME': MINOR and PATCH each have room for 0-99" >&2
|
|
exit 1
|
|
fi
|
|
|
|
LEGACY=$(( MAJOR * 10000 + MINOR * 100 + PATCH ))
|
|
if [ -n "$BETA" ]; then
|
|
if [ "$LEGACY" -lt 10100 ]; then
|
|
echo "versionName '$NAME': betas start at 1.1.0; 1.0.x codes have no room for them" >&2
|
|
exit 1
|
|
fi
|
|
if [ "$BETA" -lt 1 ] || [ "$BETA" -gt 98 ]; then
|
|
echo "versionName '$NAME': beta number must be 1-98 (99 is the stable release)" >&2
|
|
exit 1
|
|
fi
|
|
CHANNEL=beta
|
|
CODE=$(( MAJOR * 1000000 + MINOR * 10000 + PATCH * 100 + BETA ))
|
|
elif [ "$LEGACY" -lt 10100 ]; then
|
|
CHANNEL=stable
|
|
CODE=$LEGACY
|
|
else
|
|
CHANNEL=stable
|
|
CODE=$(( MAJOR * 1000000 + MINOR * 10000 + PATCH * 100 + 99 ))
|
|
fi
|
|
|
|
# Betas are always pre-releases; so was everything before 1.0.0.
|
|
if [ "$CHANNEL" = beta ] || [ "$MAJOR" = 0 ]; then PRERELEASE=true; else PRERELEASE=false; fi
|
|
|
|
case "${1:-}" in
|
|
"")
|
|
printf 'version=%s\nversion_code=%s\nbase_version=%s\nchannel=%s\nprerelease=%s\n' \
|
|
"$NAME" "$CODE" "$BASE" "$CHANNEL" "$PRERELEASE"
|
|
;;
|
|
--check)
|
|
if [ "$COMMITTED" != "$CODE" ]; then
|
|
echo "ERROR: $GRADLE has versionCode = ${COMMITTED:-<none>}, but versionName '$NAME' needs $CODE." >&2
|
|
echo "Set versionCode = $CODE (see docs/RELEASING.md for the scheme)." >&2
|
|
exit 1
|
|
fi
|
|
echo "OK: versionName $NAME -> versionCode $CODE ($CHANNEL)."
|
|
;;
|
|
version) echo "$NAME" ;;
|
|
version_code) echo "$CODE" ;;
|
|
base_version) echo "$BASE" ;;
|
|
channel) echo "$CHANNEL" ;;
|
|
prerelease) echo "$PRERELEASE" ;;
|
|
*) echo "Unknown key '$1'" >&2; exit 2 ;;
|
|
esac
|