Files
readest/fastlane/Fastfile
T

133 lines
4.9 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
require "json"
default_platform(:android)
platform :android do
aab_file = "./apps/readest-app/src-tauri/gen/android/app/build/outputs/bundle/universalRelease/app-universal-release.aab"
desc "Upload AAB to Google Play Production"
lane :upload_production do
upload_to_play_store(
aab: aab_file,
track: "production",
skip_upload_apk: true,
skip_upload_metadata: true,
skip_upload_images: true,
skip_upload_screenshots: true,
skip_upload_changelogs: false
)
end
desc "Upload AAB to Google Play Internal Testing"
lane :upload_internal do
upload_to_play_store(
aab: aab_file,
track: "internal",
skip_upload_apk: true,
skip_upload_metadata: true,
skip_upload_images: true,
skip_upload_screenshots: true,
skip_upload_changelogs: true
)
end
desc "Upload AAB to Google Play Beta"
lane :upload_beta do
upload_to_play_store(
aab: aab_file,
track: "beta",
skip_upload_apk: true,
skip_upload_metadata: true,
skip_upload_images: true,
skip_upload_screenshots: true,
skip_upload_changelogs: true
)
end
end
# fastlane executes lanes from the ./fastlane folder, so paths are anchored to the
# repo root (its parent) to stay independent of the caller's working directory.
def repo_path(relative)
File.expand_path(relative, File.expand_path("..", __dir__))
end
def asc_api_key
key_id = ENV["APPLE_API_KEY"]
# APPLE_API_KEY_PATH is deliberately kept OUT of the App Store build env: with the
# full key_id/issuer/path trio present, `tauri build` notarizes the App Store binary,
# which fails (App Store apps use an Apple Distribution cert, not Developer ID).
# Derive the .p8 path from the key id (same convention altool uses); honor an
# explicit APPLE_API_KEY_PATH when set (e.g. the iOS build env).
app_store_connect_api_key(
key_id: key_id,
issuer_id: ENV["APPLE_API_ISSUER"],
key_filepath: ENV["APPLE_API_KEY_PATH"] || repo_path("apps/readest-app/private_keys/AuthKey_#{key_id}.p8"),
)
end
# Release notes from the latest version in release-notes.json, excluding notes
# that mention Android, Windows, or Linux. Used for both the TestFlight changelog
# and the App Store "What's New" text.
def release_notes_text
releases = JSON.parse(File.read(repo_path("apps/readest-app/release-notes.json")))["releases"]
latest = releases.keys.max_by { |version| Gem::Version.new(version) }
releases[latest]["notes"]
.reject { |note| note =~ /\b(?:Android|Windows|Linux)\b/i }
.map { |note| " #{note}" }
.join("\n")
end
# App Store "Promotional Text". All other metadata fields keep their
# existing App Store Connect values.
PROMOTIONAL_TEXT = "Experience the Ultimate Ebook Reader Across All Your Devices for Avid Readers"
# iOS and macOS are one App Store Connect app (com.bilingify.readest), built from
# separate binaries and submitted independently. Each lane acts only on a build
# already uploaded by altool (skip_binary_upload / distribute_only) — it never
# builds or uploads a binary. For its platform it submits the build for App Store
# review AND distributes it to TestFlight. The App Store submit runs first because
# it waits for build processing, which the TestFlight distribute then relies on.
# pnpm run submit-appstore-ios # iOS
# pnpm run submit-appstore-macos # macOS
def submit_apple_build(deliver_opts, testflight_opts)
api_key = asc_api_key
upload_to_app_store({
api_key: api_key,
app_identifier: "com.bilingify.readest",
skip_binary_upload: true, # use the altool-uploaded build; read version from the binary
submit_for_review: true,
automatic_release: true,
force: true, # skip the HTML metadata preview prompt
skip_screenshots: true,
skip_metadata: false, # upload What's New + Promotional Text; other fields stay as-is
release_notes: { "en-US" => release_notes_text },
promotional_text: { "en-US" => PROMOTIONAL_TEXT },
precheck_include_in_app_purchases: false,
submission_information: { add_id_info_uses_idfa: false },
}.merge(deliver_opts))
upload_to_testflight({
api_key: api_key,
app_identifier: "com.bilingify.readest",
distribute_only: true, # use the already-uploaded build; do not upload
distribute_external: true,
groups: ["Beta Testers"],
changelog: release_notes_text,
}.merge(testflight_opts))
end
desc "Submit the uploaded iOS build for App Store review and to TestFlight"
lane :release_ios do
submit_apple_build(
{ platform: "ios", ipa: repo_path("apps/readest-app/src-tauri/gen/apple/build/arm64/Readest.ipa") },
{ app_platform: "ios" }
)
end
desc "Submit the uploaded macOS build for App Store review and to TestFlight"
lane :release_macos do
submit_apple_build(
{ platform: "osx", pkg: repo_path("target/universal-apple-darwin/release/bundle/macos/Readest.pkg") },
{ app_platform: "osx" }
)
end