Files
calendula/docs
Jean-Luc Makiola 3fdaa9270f ci(release): publish the release bundle to Google Play
Adds Play as a third channel alongside the F-Droid repo and the Codeberg
download. It gets its own artifact: bundleRelease produces an AAB from
the same source and signing config as the published APK, which is left
untouched so the F-Droid reproducibility guarantee is unaffected.

The upload runs as a separate trailing job rather than more steps in
'release'. Play is the only channel that can reject a good build for
reasons the pipeline cannot see — listing rules, policy review, a track
needing manual promotion — and that must surface as one red job beside a
release that already shipped, not as a failure of the workflow that
shipped it. It also skips cleanly until PLAY_SERVICE_ACCOUNT_JSON
exists, so the pipeline keeps working during Play Console setup.

fastlane is scoped deliberately to 'supply'. Build and signing stay on
Gradle: interposing fastlane there would add a layer able to inject
flags into the one build a third party verifies byte-for-byte. What
fastlane buys is that fastlane/metadata/android — already the source
F-Droid harvests — is exactly what supply consumes, so 'What's New'
comes from CHANGELOG.md via the existing sync script for both stores.

Listing text is not pushed per release (an accidental overwrite of a
live listing is a policy-review event, not a revert), and images are
skipped because the committed assets satisfy F-Droid but not Play: the
screenshots are 1280x2856 with alpha where Play caps the long edge at 2x
the short edge and wants 24-bit, and no 1024x500 featureGraphic exists.

The job runs without a container image despite fastlane publishing one:
act_runner provides no node inside custom job containers, so checkout
and download-artifact cannot run there.

Uploads default to the internal track — promotion to production stays a
human action, matching the rule that UI releases wait for on-device
review.

Note that Play App Signing means Play installs and F-Droid installs
carry different signatures and cannot update each other; the release key
is registered only as the upload key. Documented in docs/RELEASING.md.
2026-07-30 12:10:44 +02:00
..

Documentation map

Where to look for what:

Document What it is
../CONTRIBUTING.md How to contribute: issue-first workflow, which branch to target, translations, the rules a change is reviewed against
BUILDING.md Building from source: submodule, JDK/SDK requirements, Gradle tasks, what CI runs
ARCHITECTURE.md Orientation tour: principles, layers, navigation, recurring-write / conflict / reminder pipelines, testing
RELEASING.md Release process: versioning, the merge-driven pipeline, the two-forge split, secrets, key custody
../CHANGELOG.md Release history (Keep a Changelog, SemVer)
Issues + milestones The roadmap. What's planned, in progress, and shipped — a milestone maps to its release/vX.Y.Z branch
../.planning/PROJECT.md What the project is: core value, stack + version pins, constraints, naming, forge/release infrastructure
design/ Per-feature design notes kept for features whose provider behaviour is worth recording
../fastlane/metadata/android/ Store metadata (single source of truth): descriptions, title, icon, screenshots (DE + EN). Harvested directly by the official F-Droid repo; transformed into the self-hosted repo layout at release time by ../scripts/fastlane_to_fdroid_localized.sh
../fdroid-metadata/ App-level F-Droid control file (*.yml: Categories, License, links) for the self-hosted repo's fdroid update
fdroid-official/ Recipe + notes for publishing to the official F-Droid repo (reproducible build + developer-signed binary)

Conventions: planning lives in the issue tracker, not in this repository. The .planning/ files that predated it (a roadmap, a development-state snapshot, and a per-milestone requirement checklist) are gone — issues and milestones say the same thing without going stale. PROJECT.md is what remains, and it describes the project rather than its plan. ARCHITECTURE.md is the authoritative orientation tour: it is updated with the code, and is the right place for a lesson learned about the calendar provider.