build: local Android release pipeline (sub-project 6d) #8

Merged
eliott merged 1 commit from feat/release into main 2026-10-16 14:10:38 +02:00
Owner

Sub-project 6d: release builds with Gradle on the dev machine, no EAS.

  • plugins/with-release-signing.js (Expo config plugin, runs at prebuild since android/ is generated and ignored): derives versionCode from version (major * 10000 + minor * 100 + patch), signs the release build type with the keystore named in android/keystore.properties (debug keystore otherwise, so expo run:android still builds), and allows cleartext HTTP only outside ROLLNOTE_RELEASE=1. This replaces the expo-build-properties setting, which is removed.
  • scripts/release-android.sh (pnpm release:android): checks the versions and the clean tree, prebuilds with the release settings, runs gradlew bundleRelease assembleRelease, leaves dist/rollnote-<version>.aab and .apk.
  • docs/release.md: one-time upload keystore and Play Console steps, the per-release checklist, what a release build differs in. Crash reporting: none, Play vitals.
  • Version 0.9.0.

Verified locally with a throwaway keystore: prebuild yields versionCode 900 / versionName 0.9.0, cleartext false in release and true in dev; assembleRelease produced a signed APK (certificate checked with apksigner) that installs and launches on the emulator.

Sub-project 6d: release builds with Gradle on the dev machine, no EAS. - `plugins/with-release-signing.js` (Expo config plugin, runs at prebuild since `android/` is generated and ignored): derives `versionCode` from `version` (major * 10000 + minor * 100 + patch), signs the release build type with the keystore named in `android/keystore.properties` (debug keystore otherwise, so `expo run:android` still builds), and allows cleartext HTTP only outside `ROLLNOTE_RELEASE=1`. This replaces the expo-build-properties setting, which is removed. - `scripts/release-android.sh` (`pnpm release:android`): checks the versions and the clean tree, prebuilds with the release settings, runs `gradlew bundleRelease assembleRelease`, leaves `dist/rollnote-<version>.aab` and `.apk`. - `docs/release.md`: one-time upload keystore and Play Console steps, the per-release checklist, what a release build differs in. Crash reporting: none, Play vitals. - Version 0.9.0. Verified locally with a throwaway keystore: prebuild yields versionCode 900 / versionName 0.9.0, cleartext false in release and true in dev; `assembleRelease` produced a signed APK (certificate checked with apksigner) that installs and launches on the emulator.
build(android): local release pipeline, derived versionCode, release signing (sub-project 6d)
All checks were successful
tests / test (pull_request) Successful in 1m29s
341cd8f0ad
Release builds are made with Gradle on this machine, no EAS: the android/
folder stays generated and ignored, and plugins/with-release-signing.js runs
at prebuild. It derives versionCode from version (major * 10000 + minor * 100
+ patch), signs the release build type with the keystore named in
android/keystore.properties (debug keystore otherwise, so expo run:android
still builds) and allows cleartext HTTP only outside ROLLNOTE_RELEASE=1,
which replaces the expo-build-properties setting.

scripts/release-android.sh (pnpm release:android) checks the versions and
the clean tree, prebuilds with the release settings, builds the bundle and
the APK and leaves them in dist/. docs/release.md has the one-time keystore
and Play Console steps and the per-release checklist.
eliott merged commit a73726f325 into main 2026-10-16 14:10:38 +02:00
eliott deleted branch feat/release 2026-10-16 14:10:38 +02:00
Sign in to join this conversation.
No reviewers
No labels
run-ci
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
RollNote/rollnote-app!8
No description provided.