build,docs: add on-device release verification gate
All checks were successful
CI / ci (push) Successful in 4m22s
All checks were successful
CI / ci (push) Successful in 4m22s
Adds a mandatory pre-tag step to the release process: build the R8-shrunk release candidate and smoke-test it on a real device, including a first-run / permission-not-granted state. The v2.7.0 launch crash (calendar observer registered before the permission gate) reached users because it only manifests in the minified release build on a device without the permission already granted — the debug build and an already-permissioned phone both hid it. - New `releaseTest` build type: same R8 shrinking + obfuscation as `release`, but debug-signed with a `.releasetest` applicationId suffix so it installs alongside the production and debug apps. Never published; CI only ever builds the real `release` variant from the tag. - scripts/verify-release.sh: builds + installs `releaseTest` and resets it to a first-run state, with an on-device checklist. - docs/RELEASING.md: formalize the release/vX.Y.Z branch flow and the on-device verification gate before tagging. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
42
scripts/verify-release.sh
Executable file
42
scripts/verify-release.sh
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Build the release-candidate APK and install it on a connected device for the
|
||||
# mandatory pre-tag on-device check (see docs/RELEASING.md).
|
||||
#
|
||||
# It builds the `releaseTest` variant: the same R8 shrinking + obfuscation and
|
||||
# resource shrinking as the published `release` build, but debug-signed and
|
||||
# with a `.releasetest` applicationId suffix so it installs alongside the
|
||||
# production and debug apps. This is what surfaces release-only breakage (R8
|
||||
# stripping) and first-run states (permission not yet granted) that the
|
||||
# unminified debug build — or a device that already holds the permission —
|
||||
# silently hides.
|
||||
#
|
||||
# Usage: scripts/verify-release.sh
|
||||
set -euo pipefail
|
||||
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
PKG="de.jeanlucmakiola.calendula.releasetest"
|
||||
APK="app/build/outputs/apk/releaseTest/app-releaseTest.apk"
|
||||
|
||||
echo "==> Building release-candidate APK (releaseTest, R8 minified)…"
|
||||
./gradlew :app:assembleReleaseTest
|
||||
|
||||
echo "==> Installing $PKG …"
|
||||
adb install -r "$APK"
|
||||
|
||||
echo "==> Resetting to a first-run state (revoking calendar permission)…"
|
||||
# The release build crashed at launch precisely because this state was never
|
||||
# tested. Force it so the permission gate / onboarding is exercised every time.
|
||||
adb shell pm revoke "$PKG" android.permission.READ_CALENDAR 2>/dev/null || true
|
||||
adb shell pm revoke "$PKG" android.permission.WRITE_CALENDAR 2>/dev/null || true
|
||||
|
||||
echo
|
||||
echo "Installed and reset. Now verify ON THE DEVICE before tagging:"
|
||||
echo " 1. Launch from a clean state — the permission screen must appear (no crash)."
|
||||
echo " 2. Grant calendar access — the calendar must load with events."
|
||||
echo " 3. Add both home-screen widgets and confirm they render (not a spinner)."
|
||||
echo " 4. Exercise the release's headline changes end to end."
|
||||
echo
|
||||
echo "Watch for crashes with: adb logcat -b crash"
|
||||
echo "Only tag the release once all of the above pass on a real device."
|
||||
Reference in New Issue
Block a user