Both siblings' pipelines are near-identical; the real difference between them is which forge is canonical. This is Agendula's spine — it pushes the tag to Codeberg itself and flags pre-1.0 releases as pre-releases — with Calendula's `play` job grafted on unchanged. Taking Agendula's spine means there is no Gitea-canonical phase to migrate out of later, which is the one thing Agendula had to unwind. The Codeberg publish step stays NOT continue-on-error, inherited that way deliberately: in Agendula it reported green through five consecutive releases while never once publishing, which is how a crash-fix release reached F-Droid but not the users who needed it. Comments that recount that history now name Agendula, so an inherited scar isn't misread as ours. The `play` job runs last and isolated, and skips cleanly until PLAY_SERVICE_ACCOUNT_JSON exists — so it stays dormant through the whole pre-1.0 run, which is the correct behaviour anyway. Templates, the contributing guide and verify-release.sh are rewritten for this app's domain rather than renamed: the architectural rule here is that Room types stay in the data layer, and the on-device release check is an alarm that survives a lock screen and a reboot, not a task list that loads. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L94fydiJC37LtxVusNQBDy
47 lines
2.2 KiB
Bash
Executable File
47 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Build the release-candidate APK and install it on a connected device for the
|
|
# mandatory pre-release 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.clockula.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 runtime permissions)…"
|
|
# Force the permission-not-granted state so the onboarding path is exercised
|
|
# every time — R8-only breakage and first-run crashes never show up in the
|
|
# unminified debug build, nor on a device that already holds the permission.
|
|
adb shell pm revoke "$PKG" android.permission.POST_NOTIFICATIONS 2>/dev/null || true
|
|
|
|
echo
|
|
echo "Installed and reset. Now verify ON THE DEVICE before releasing:"
|
|
echo " 1. Launch from a clean state — no crash, notification permission is asked for."
|
|
echo " 2. Set an alarm a minute out. Lock the device. It must ring, over the lock"
|
|
echo " screen, with sound and vibration, and snooze and dismiss must both work."
|
|
echo " 3. Reboot with that alarm still armed — it must survive and still fire."
|
|
echo " 4. Start a timer and a stopwatch, background the app, confirm both keep"
|
|
echo " time and stay controllable from the notification shade."
|
|
echo " 5. Exercise the release's headline changes end to end."
|
|
echo
|
|
echo "Watch for crashes with: adb logcat -b crash"
|
|
echo "Only merge the release branch to main once all of the above pass on a device"
|
|
echo "(the merge is what publishes the release — see docs/RELEASING.md)."
|