Merge branch 'ship/release-notes-gate' into 'main'

An APK no longer ships without a word about what changed in it

See merge request paulhitt/flamenet-messenger-android!70
This commit was merged in pull request #97.
This commit is contained in:
Paul Hitt
2026-09-05 15:56:54 +00:00
+65
View File
@@ -26,6 +26,71 @@ code="$(sed -n "s/.*versionCode='\([0-9]*\)'.*/\1/p" <<<"$badging" | head -1)"
name="$(sed -n "s/.*versionName='\([^']*\)'.*/\1/p" <<<"$badging" | head -1)"
[ -n "$code" ] && [ -n "$name" ] || { echo "could not read version from $apk" >&2; exit 1; }
# ---------------------------------------------------------------------------
# 🔴 **A build does not ship without its release notes.**
#
# The gate lives here, on the manifest, because the manifest is the step that
# cannot be skipped — it is what the in-app updater reads, so an APK published
# without it offers nobody an update. A reminder in a checklist would be
# skipped on exactly the busy evening the notes matter most.
#
# ⚠️ It matches on `versionName` read out of the APK above, never on a number
# typed here, for the same reason the manifest does: the two cannot disagree.
#
# The changelog lives in the relay repository because that is what serves the
# page, and the check lives THERE too — see Scripts/covers-android.py. Parsing
# the JSON here would leave a second copy of the schema to drift.
if [ "${FN_SKIP_RELEASE_NOTES:-}" = "1" ]; then
# Loud, and on stderr: a skipped gate that printed nothing would be a gate
# nobody remembered turning off.
echo "⚠️ FN_SKIP_RELEASE_NOTES=1 — writing a manifest for $name with no" >&2
echo " release notes. Nothing on /releases will mention this build." >&2
else
relay_dir="${FN_RELAY_DIR:-$(cd "$(dirname "$0")/../.." && pwd)/flamenet-relay}"
checker="$relay_dir/Scripts/covers-android.py"
if [ ! -f "$checker" ]; then
cat >&2 <<MSG
No release-notes checker at:
$checker
That file lives in the flamenet-relay repository, which serves the /releases
page. Point FN_RELAY_DIR at your checkout of it, or set
FN_SKIP_RELEASE_NOTES=1 to publish $name with no notes.
MSG
exit 1
fi
if ! python3 "$checker" "$name"; then
cat >&2 <<MSG
Nothing on the /releases page mentions Android $name, so this build would ship
without a word to anyone about what changed in it.
Add a release to:
$relay_dir/Resources/releases.json
The newest release goes FIRST in the list, and it looks like this — write the
notes for somebody holding a phone, and put anything only an operator cares
about in "selfHosting" at the end:
{
"date": "$(date +%Y-%m-%d)",
"platforms": [{ "name": "android", "version": "$name" }],
"headline": "One sentence, or leave it out.",
"changes": [
{ "kind": "fixed", "text": "What a person will notice, in their words." }
]
}
"kind" is "new", "changed" or "fixed". Add an { "name": "ios", "version": … }
or { "name": "relay" } entry alongside it when the same release touched those
too — one release, every platform it landed on.
Then deploy the relay so the page and the APK go out together.
MSG
exit 1
fi
fi
sha="$(shasum -a 256 "$apk" | cut -d' ' -f1)"
# ⚠️ No `url` field, deliberately. The client builds the download URL from the