Beta packaging workflow + release signing #66

Closed
opened 2026-08-04 19:41:07 +00:00 by TheAnachronism · 3 comments

Parent

Implements release channel + signing/update trust from docs/1.0-beta-readiness.md (1.0 beta release readiness).

What to build

Retarget packaging so beta/<semver> tags publish a prerelease Forgejo release with asset tt-rss-viewer-beta-<semver>.apk, versionName from tag semver and versionCode from UTC epoch seconds, signed with a project-owned CI release keystore (APK Signature Scheme v3), not the runner debug key. Include short operator notes for key custody / loss / update rules. Installer-facing update path stays manual Forgejo Releases.

Acceptance criteria

  • Packaging workflow triggers on beta/* only (no new alpha/* cuts from this workflow)
  • Tag strip yields --build-name from semver; --build-number is UTC epoch seconds
  • Uploaded asset is named tt-rss-viewer-beta-<semver>.apk and release is prerelease: true
  • Release builds use a dedicated CI-injected release keystore (private key never committed); not debug signing
  • Produced APKs are v3-capable under that release key
  • Operator notes exist for key custody, loss ⇒ uninstall/reinstall risk, and update rules (same package id + rising versionCode + same cert)
  • Not required: in-app updater; live backup-key rotation lineage day one

Blocked by

  • #65 — Beta package identity
## Parent Implements release channel + signing/update trust from [`docs/1.0-beta-readiness.md`](../src/branch/master/docs/1.0-beta-readiness.md) ([1.0 beta release readiness](https://git.anachronis.dev/TheAnachronism/tt-rss-viewer/issues/41)). ## What to build Retarget packaging so **`beta/<semver>`** tags publish a **prerelease** Forgejo release with asset **`tt-rss-viewer-beta-<semver>.apk`**, versionName from tag semver and versionCode from UTC epoch seconds, signed with a **project-owned CI release keystore** (APK Signature Scheme **v3**), not the runner debug key. Include short **operator** notes for key custody / loss / update rules. Installer-facing update path stays manual Forgejo Releases. ## Acceptance criteria - [ ] Packaging workflow triggers on `beta/*` only (no new `alpha/*` cuts from this workflow) - [ ] Tag strip yields `--build-name` from semver; `--build-number` is UTC epoch seconds - [ ] Uploaded asset is named `tt-rss-viewer-beta-<semver>.apk` and release is `prerelease: true` - [ ] Release builds use a dedicated CI-injected release keystore (private key never committed); not debug signing - [ ] Produced APKs are v3-capable under that release key - [ ] Operator notes exist for key custody, loss ⇒ uninstall/reinstall risk, and update rules (same package id + rising versionCode + same cert) - [ ] Not required: in-app updater; live backup-key rotation lineage day one ## Blocked by - #65 — Beta package identity
Author
Owner

Code landed on master (this commit) — leaving open until Forgejo Actions secrets are confirmed.

  • Replaced .forgejo/workflows/alpha-release.yml with .forgejo/workflows/beta-release.yml (beta/* only)
  • Asset tt-rss-viewer-beta-<semver>.apk, prerelease: true, tag semver → --build-name, UTC epoch → --build-number
  • Gradle release signing from android/key.properties with enableV2Signing + enableV3Signing (local verify: apksigner v2+v3, CN=tt-rss Viewer)
  • Operator notes: docs/release-signing.md

Still needed (operator): create repo secrets from ~/.local/share/tt-rss-viewer/forgejo-secrets.env:
ANDROID_RELEASE_KEYSTORE_BASE64, ANDROID_RELEASE_STORE_PASSWORD, ANDROID_RELEASE_KEY_PASSWORD, ANDROID_RELEASE_KEY_ALIAS (plus existing FORGEJO_TOKEN).

Code landed on `master` (this commit) — **leaving open** until Forgejo Actions secrets are confirmed. - Replaced `.forgejo/workflows/alpha-release.yml` with `.forgejo/workflows/beta-release.yml` (`beta/*` only) - Asset `tt-rss-viewer-beta-<semver>.apk`, `prerelease: true`, tag semver → `--build-name`, UTC epoch → `--build-number` - Gradle release signing from `android/key.properties` with `enableV2Signing` + `enableV3Signing` (local verify: apksigner v2+v3, CN=tt-rss Viewer) - Operator notes: `docs/release-signing.md` **Still needed (operator):** create repo secrets from `~/.local/share/tt-rss-viewer/forgejo-secrets.env`: `ANDROID_RELEASE_KEYSTORE_BASE64`, `ANDROID_RELEASE_STORE_PASSWORD`, `ANDROID_RELEASE_KEY_PASSWORD`, `ANDROID_RELEASE_KEY_ALIAS` (plus existing `FORGEJO_TOKEN`).
Author
Owner

Code landed on master (82e97b3) — leaving open until Forgejo Actions secrets are confirmed.

  • Replaced alpha workflow with .forgejo/workflows/beta-release.yml (beta/* only)
  • Asset tt-rss-viewer-beta-<semver>.apk, prerelease: true, tag semver → --build-name, UTC epoch → --build-number
  • Gradle release signing from android/key.properties with v2+v3 (local verify: apksigner v2+v3, CN=tt-rss Viewer)
  • Operator notes: docs/release-signing.md

Still needed: create repo secrets from ~/.local/share/tt-rss-viewer/forgejo-secrets.env (ANDROID_RELEASE_*) plus existing FORGEJO_TOKEN.

Code landed on `master` (`82e97b3`) — **leaving open** until Forgejo Actions secrets are confirmed. - Replaced alpha workflow with `.forgejo/workflows/beta-release.yml` (`beta/*` only) - Asset `tt-rss-viewer-beta-<semver>.apk`, `prerelease: true`, tag semver → `--build-name`, UTC epoch → `--build-number` - Gradle release signing from `android/key.properties` with v2+v3 (local verify: apksigner v2+v3, CN=tt-rss Viewer) - Operator notes: `docs/release-signing.md` **Still needed:** create repo secrets from `~/.local/share/tt-rss-viewer/forgejo-secrets.env` (`ANDROID_RELEASE_*`) plus existing `FORGEJO_TOKEN`.
Author
Owner

Verified: CI beta APK is signed with the project release keystore (v2+v3), not debug. Closing after successful signing smoke.

Verified: CI beta APK is signed with the project release keystore (v2+v3), not debug. Closing after successful signing smoke.
TheAnachronism removed their assignment 2026-08-06 14:35:36 +00:00
Sign in to join this conversation.
No description provided.