Store release: App Store (iOS + Mac), signed APK, F-Droid #33

Merged
backmeupplz merged 1 commit from store-release-apple-apk-fdroid into main 2026-10-16 19:20:02 +00:00
backmeupplz commented 2026-10-16 19:17:15 +00:00 (Migrated from github.com)

Extends store-release.yml in its existing style (credential-free builds, per-store protected environments, journaled mutations, fail-closed gates):

  • App Store (iOS + Mac): a credential-free build-apple job archives both apps on macOS (ad-hoc signed, bound to the release in apple.json). submit-apple (environment store-appstore) uploads each with App Store Connect cloud signing using only Apple's tools, waits for processing, cancels an older review still waiting/in review/with unresolved issues (owner decision 2026-10-16), renames or creates the version, attaches the build and submits with automatic release. Never edits a READY_FOR_SALE version; newer or unknown open submissions fail closed. Build numbers = versionCode. Paused by default (STORE_APPSTORE_PAUSED).
  • APK: store apk signs the unsigned release APK with apksigner and the existing upload key (in store-play, no second copy) and attaches plainwallet-<v>-android.apk + plainwallet.apk. The site's APK button now downloads releases/latest/download/plainwallet.apk directly.
  • F-Droid: store fdroid (environment store-fdroid, paused by default) keeps the open fdroiddata merge request at the release with the shared fdroid.py. Release APKs carry no dependency block; -PprebuiltWeb lets F-Droid build the web half in its prebuild step. Two clean clones built byte-identical unsigned APKs; Node 22 and 26.8.2 give the same web output.
  • Docs: docs/STORE_RELEASE.md sections and setup for each; README and AGENTS.md release notes; fastlane listing for F-Droid.

Tests: python3 -m unittest discover -s scripts/release (57, incl. a fake App Store Connect covering replace-older, never-cancel-newer, live-version What's New, build-number reuse, reruns), read-only App Store Connect API probe with the pipeline's exact queries, local build.py apple + cloud-signed export (to disk, not uploaded) of both archives. No store was contacted with a write.

🤖 Generated with Claude Code

Extends store-release.yml in its existing style (credential-free builds, per-store protected environments, journaled mutations, fail-closed gates): - **App Store (iOS + Mac)**: a credential-free `build-apple` job archives both apps on macOS (ad-hoc signed, bound to the release in `apple.json`). `submit-apple` (environment `store-appstore`) uploads each with App Store Connect cloud signing using only Apple's tools, waits for processing, cancels an **older** review still waiting/in review/with unresolved issues (owner decision 2026-10-16), renames or creates the version, attaches the build and submits with automatic release. Never edits a READY_FOR_SALE version; newer or unknown open submissions fail closed. Build numbers = versionCode. Paused by default (`STORE_APPSTORE_PAUSED`). - **APK**: store `apk` signs the unsigned release APK with apksigner and the existing upload key (in `store-play`, no second copy) and attaches `plainwallet-<v>-android.apk` + `plainwallet.apk`. The site's APK button now downloads `releases/latest/download/plainwallet.apk` directly. - **F-Droid**: store `fdroid` (environment `store-fdroid`, paused by default) keeps the open fdroiddata merge request at the release with the shared `fdroid.py`. Release APKs carry no dependency block; `-PprebuiltWeb` lets F-Droid build the web half in its prebuild step. Two clean clones built byte-identical unsigned APKs; Node 22 and 26.8.2 give the same web output. - Docs: docs/STORE_RELEASE.md sections and setup for each; README and AGENTS.md release notes; fastlane listing for F-Droid. Tests: `python3 -m unittest discover -s scripts/release` (57, incl. a fake App Store Connect covering replace-older, never-cancel-newer, live-version What's New, build-number reuse, reruns), read-only App Store Connect API probe with the pipeline's exact queries, local `build.py apple` + cloud-signed export (to disk, not uploaded) of both archives. No store was contacted with a write. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No description provided.