Files
agendula/fastlane/Fastfile
T
Jean-Luc Makiolaandmakiolaj ac01993d41 Release 1.0.0 (#20)
First stable release. Merging this bumps versionName to 1.0.0 and triggers the release pipeline (F-Droid, Codeberg, Play).

**App**
- CalDAV sync built in, with Agendula's own task store; OpenTasks / tasks.org stay available and can be copied over in Settings → Storage
- repeating tasks, several reminders per task, lists managed in the app, iCalendar import/export, widget and Quick Settings tile
- a list can be kept out of the smart lists (#18) and gets its own notification channel (#17)
- duplicate a task with its subtasks (#16)
- HTML descriptions shown as plain text (#15)
- relative day words in reminder notifications (#14)
- asks for exact-alarm access instead of claiming USE_EXACT_ALARM, and re-arms reminders when that access changes

**Release plumbing**
- floret-kit bumped to v0.4.0; the old pin was never pushed, so a clean clone couldn't check out the submodule. 0.4.0 drops CrashConfig.issueTitle (crash issues are always filed in English)
- prebuilt .so files ship unstripped, so the build no longer depends on whether an NDK is installed; now checked by check_reproducible_release.sh
- official F-Droid recipe in docs/fdroid-official/, to submit to fdroiddata once v1.0.0 is tagged
- Google Play: fastlane uploads the AAB and every locale's What's New after the F-Droid release; a separate listing lane pushes text and graphics from the fastlane tree, which CI now checks against Play's limits
- store listing: title "Agendula: Tasks" in every locale, icon, feature graphic, screenshots and 1.0.0 changelogs in en-US, en-GB, de-DE and pt-BR

crash_report_issue_title is now unused but stays until Weblate removes the translated copies.

Closes #14, closes #15, closes #16, closes #17, closes #18

Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de>
Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/20
2026-09-24 16:36:49 +02:00

76 lines
2.8 KiB
Ruby

# Google Play: release upload and listing sync.
#
# fastlane/metadata/android is the single source for both stores: the official
# F-Droid repo harvests it from the tagged tree, the self-hosted repo gets it
# through scripts/fastlane_to_fdroid_localized.sh, and this pushes it to Play.
# Building and signing stay with Gradle so the release build remains
# F-Droid-reproducible.
require "fileutils"
require "tmpdir"
default_platform(:android)
ROOT = File.expand_path("..", __dir__)
METADATA = File.join(ROOT, "fastlane/metadata/android")
# Graphics are committed once, under en-US (F-Droid's fallback). Play falls back
# to its *default language*, en-US for this app; if that ever differs
# (PLAY_DEFAULT_LOCALE), the listing lane copies the graphics across.
IMAGE_LOCALE = "en-US"
platform :android do
desc "Upload an already-built, already-signed AAB to Play"
lane :deploy do |options|
aab = File.expand_path(options[:aab] || "app/build/outputs/bundle/release/app-release.aab", ROOT)
UI.user_error!("AAB not found at #{aab}") unless File.exist?(aab)
supply(
aab: aab,
metadata_path: METADATA,
track: options[:track] || "production",
release_status: options[:release_status] || "completed",
# The APK belongs to F-Droid and the Codeberg download.
skip_upload_apk: true,
# The listing goes through the `listing` lane, deliberately; overwriting
# a live listing by accident triggers a Play review.
skip_upload_metadata: true,
skip_upload_images: true,
skip_upload_screenshots: true,
# "What's New" tracks every release, from every locale's
# changelogs/<versionCode>.txt — the same files F-Droid shows.
skip_upload_changelogs: false,
validate_only: options[:dry_run].to_s == "true",
)
end
desc "Push listing text and graphics from the repo to Play"
desc " dry_run:true validate against the API and discard the edit"
lane :listing do |options|
sh("python3", File.join(ROOT, "scripts/check_store_listing.py"), "--complete")
default_locale = ENV["PLAY_DEFAULT_LOCALE"] || IMAGE_LOCALE
Dir.mktmpdir("play-listing") do |staged|
FileUtils.cp_r("#{METADATA}/.", staged)
src = File.join(staged, IMAGE_LOCALE, "images")
dst = File.join(staged, default_locale, "images")
FileUtils.cp_r(src, dst) if default_locale != IMAGE_LOCALE && !File.exist?(dst)
supply(
metadata_path: staged,
skip_upload_aab: true,
skip_upload_apk: true,
skip_upload_metadata: false,
# "What's New" belongs to a release on a track, not to the listing.
skip_upload_changelogs: true,
skip_upload_images: false,
skip_upload_screenshots: false,
# Only re-upload graphics whose content changed.
sync_image_upload: true,
validate_only: options[:dry_run].to_s == "true",
)
end
end
end