Skip to content

ci: publish signed release APKs from version tags - #9

Merged
cheetahbyte merged 1 commit into
android-web-parityfrom
android-release
Nov 7, 2026
Merged

cheetahbyte merged 1 commit into
android-web-parityfrom
android-release

Conversation

@cheetahbyte

Copy link
Copy Markdown
Contributor

Summary

A vMAJOR.MINOR.PATCH tag now publishes a signed release APK with FCM on GitHub Releases.

push tag v1.2.3
└── release.yml
    ├── version 1.2.3, code 10203 (MAJOR * 10000 + MINOR * 100 + PATCH)
    ├── restore release.jks and google-services.json from secrets
    ├── ./gradlew assembleRelease, signed with alias crumble
    └── gh release create v1.2.3 crumble-1.2.3.apk
  • app/build.gradle.kts signs release builds when CRUMBLE_KEYSTORE_PATH and CRUMBLE_KEYSTORE_PASSWORD are set, and reads the version from crumble.versionName and crumble.versionCode, defaulting to 1.0 and 1.
  • The README describes the release flow, the secrets, and local signing.

Why

There was no way to ship an installable APK: release builds were unsigned, the version code was fixed at 1, so updates couldn't install over older builds, and google-services.json only existed on the maintainer's machine.

Evidence

  • Signed with a throwaway key: assembleRelease succeeds, apksigner verify passes, and aapt2 reports ng.crumbli.android, versionName 0.1.0, versionCode 100. processReleaseGoogleServices generated the Firebase values.
  • Without a key: assembleRelease succeeds and produces app-release-unsigned.apk.
  • Tag parsing: v0.1.0 gives 100, v1.2.3 gives 10203, v2.10.99 gives 21099; v1.2 and v1.100.0 are rejected.
  • The keystore at ~/crumble-release.jks has the alias crumble. Its password was not verified.
  • Not run: the workflow on GitHub, or signing with the real key.

Risk & Rollback

Reversibility: Reversible for the code; a published release can be deleted, but installed APKs stay installed.

Blast Radius: Release builds and tag pushes. Debug builds and the Android checks workflow are unchanged.

Every future update must be signed with this keystore; losing it means users reinstall. A wrong ANDROID_KEYSTORE_PASSWORD fails the signing step on the first tag. Targets android-web-parity until #8 merges.

A vMAJOR.MINOR.PATCH tag builds a release APK with FCM, signed with the key from repository secrets, and attaches it to a GitHub release. Release builds without CRUMBLE_KEYSTORE_PATH stay unsigned.
@cheetahbyte
cheetahbyte added this pull request to stack #10 November 7, 2026 15:28
@cheetahbyte
cheetahbyte merged commit 49be618 into main Nov 7, 2026
1 check passed
@cheetahbyte
cheetahbyte deleted the android-release branch November 7, 2026 17:10
@crumblebot crumblebot mentioned this pull request Nov 7, 2026
6 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant