mirror of
https://github.com/stablyai/orca.git
synced 2026-11-01 01:27:35 +00:00
* [comment audit] Align legacy failure-read counts with cached display * [comment audit] Condense shared provider lifecycle and browser recovery comments [skip ci] * [comment audit] Condense shared generation, path and preview comments [skip ci] * [comment audit] Condense host, file and Git contract rationale [skip ci] * [comment audit] Tighten Git lifecycle and provider contract comments [skip ci] * [comment audit] Clarify shared host authority and launch isolation [skip ci] * [comment audit] simplify local access mobile and native chat contracts [skip ci] * [comment audit] simplify native chat presentation and state contracts [skip ci] * [comment audit] simplify native runtime and provider contracts [skip ci] * [comment audit] simplify migration and orchestration contracts [skip ci] * [comment audit] simplify plugin trust and process capture rationale [skip ci] * [comment audit] simplify terminal delivery and remote compatibility rationale [skip ci] * [comment audit] clarify remote recovery and launch wire rationale [skip ci] * [comment audit] shorten shared RPC compatibility and runtime evidence comments [skip ci] * [comment audit] simplify secure storage shell startup and sidebar rationale [skip ci] * [comment audit] clarify sidebar, skill and SSH invariants [skip ci] * [comment audit] condense structured chat delivery and timing rationale [skip ci] * [comment audit] condense terminal replay and telemetry invariants [skip ci] * [comment audit] clarify launch permission and terminal delivery rationale [skip ci] * [comment audit] clarify workspace ownership and layout contracts [skip ci] * [comment audit] wait for fitted and painted SSH terminal links * [comment audit] clarify layout persistence and session ownership [skip ci] * [comment audit] clarify host routing and workspace lifecycle contracts [skip ci] * [comment audit] clarify startup persistence and app lifetime comments [skip ci] * [comment audit] clarify recovery and activity boundaries [skip ci] * [comment audit] condense activity and artifact invariants [skip ci] * [comment audit] condense automation authority contracts [skip ci] * [comment audit] simplify automation scheduling and history contracts [skip ci] * [comment audit] clarify browser chrome and annotation lifecycles [skip ci] * [comment audit] clarify browser routing and retained guest ownership [skip ci] * [comment audit] clarify browser recovery and document ownership comments [skip ci] * [comment audit] restore hosted runners required by native IME fixtures * [comment audit] shorten preview, palette and dashboard invariants [skip ci] * [comment audit] clarify terminal preview, dashboard and retention comments [skip ci] * [comment audit] clarify diff-note recovery and editor lifecycle comments [skip ci] * [comment audit] shorten rich-text and combined-diff ownership comments [skip ci] * [comment audit] shorten autosave, draft recovery and model ownership comments [skip ci] * [comment audit] shorten save-queue, notebook and Markdown constraints [skip ci] * [comment audit] shorten Monaco, PDF and rich Markdown safeguards [skip ci] * [comment audit] clarify rich Markdown source and selection safeguards [skip ci] * [comment audit] clarify editor loading and emulator stream lifetimes [skip ci] * [comment audit] trim emulator and feature tour narration [skip ci] * [comment audit] clarify floating workspace and GitHub cache ownership [skip ci] * [comment audit] trim provider controls and Linear filter explanations [skip ci] * [comment audit] clarify pairing and chat resume lifetimes [skip ci] * [comment audit] clarify chat delivery and transcript lifetimes [skip ci] * [comment audit] clarify session options and host-owned status [skip ci] * [comment audit] clarify draft durability and live-status precedence [skip ci] * [comment audit] Trim chat send and model ownership explanations [skip ci] * [comment audit] Shorten transcript ownership and send recovery comments [skip ci] * [comment audit] Simplify native chat composer and transcript hook comments [skip ci] * [comment audit] Shorten native chat scroll and structured session explanations [skip ci] * [comment audit] Trim workspace picker and onboarding commentary [skip ci] * [comment audit] Simplify pet rendering, review cache and quick open comments [skip ci] * [comment audit] Trim sidebar and session history explanations [skip ci] * [comment audit] Condense session resume and review checks comments [skip ci] * [comment audit] Shorten checks state and file explorer refresh comments [skip ci] * [comment audit] Trim plugin bridge and source-control action rationale [skip ci] * [comment audit] Trim source-control listing and review rationale [skip ci] * [comment audit] Shorten sidebar lifecycle and explorer safeguards [skip ci] * [comment audit] Condense Settings account and appearance rationale [skip ci] * [comment audit] Trim pairing and repository Settings explanations [skip ci] * [comment audit] Condense Settings search SSH and terminal safeguards [skip ci] * [comment audit] Shorten Settings voice and provider ownership comments [skip ci] * [comment audit] Condense Settings draft persistence and host-state rationale [skip ci] * [comment audit] Trim Settings hooks and sidebar setup rationale [skip ci] * [comment audit] Condense sidebar deletion and board-filter safeguards [skip ci] * [comment audit] Condense worktree cards, host ownership and Markdown contracts [skip ci] * [comment audit] Condense sidebar drag, folder and filtering contracts [skip ci] * [comment audit] Condense sidebar parity, sleep and host ownership contracts [skip ci] * [comment audit] Prune focus-read baseline after comment cleanup * [comment audit] Clarify sidebar visibility, board drops and agent evidence [skip ci] * [comment audit] Tighten sidebar listing, drag and reveal contracts [skip ci] * [comment audit] Clarify viewport geometry and skill update safeguards [skip ci] * [comment audit] Tighten skill inventory, usage and host status comments [skip ci] * [comment audit] Clarify usage ownership and resource kill safeguards [skip ci] * [comment audit] Tighten tab selection, rename and search contracts [skip ci] * [comment audit] Tighten tab-strip geometry and drag ownership comments [skip ci] * [comment audit] Tighten Tasks recovery, pagination and mutation comments [skip ci] * [comment audit] Tighten provider loading and terminal recovery comments [skip ci] * [comment audit] Tighten completion, cadence and PTY ownership comments [skip ci] * [comment audit] Clarify terminal restore and parked-pane boundaries [skip ci] * [comment audit] Tighten PTY startup and replay explanations [skip ci] * [comment audit] Clarify PTY identity and delivery ownership [skip ci] * [comment audit] Shorten remote reconnect and input replay rationale [skip ci] * [comment audit] Condense terminal parking clipboard and file link comments [skip ci] * [comment audit] Clarify IME ownership and trim trace history [skip ci] * [comment audit] Shorten pane recovery and parked watcher explanations [skip ci] * [comment audit] Condense snapshot replay and visibility recovery rationale [skip ci] * [comment audit] Shorten terminal parking and keyboard ownership rationale [skip ci] * [comment audit] Trim renderer lifecycle and menu rationale [skip ci] * [comment audit] Condense workspace cleanup ownership and settlement notes [skip ci] * [comment audit] Clarify renderer hook evidence and source ownership [skip ci] * [comment audit] Tighten IPC ownership and reconnect explanations [skip ci] * [comment audit] Trim renderer focus, paste and attention comments [skip ci] * [comment audit] Shorten scroll, locale and agent lifecycle comments [skip ci] * [comment audit] Trim agent launch, resume and ownership commentary [skip ci] * [comment audit] Shorten account, browser and editor comments [skip ci] * [comment audit] Clarify host-mirror waits, previews and input ownership [skip ci] * [comment audit] Condense launch recovery and editor tokenization comments [skip ci] * [comment audit] Condense workspace selection and terminal pane rationale [skip ci] * [comment audit] Condense terminal fitting and rendering recovery comments [skip ci] * [comment audit] Condense terminal input and host routing explanations [skip ci] * [comment audit] Condense ownership and sleeping-session recovery rationale [skip ci] * [comment audit] Condense structured launch and terminal link explanations [skip ci] * [comment audit] Condense terminal ownership and workspace file routing rationale [skip ci] * [comment audit] Condense session persistence and workspace activation rationale [skip ci] * [comment audit] Condense workspace routing and browser ownership rationale [skip ci] * [comment audit] Condense mirror recovery and layout authority rationale [skip ci] * [comment audit] Condense runtime transport and file safety rationale [skip ci] * [comment audit] Condense runtime graph and structured session rationale [skip ci] * [comment audit] Condense browser creation and remote tab recovery rationale [skip ci] * [comment audit] Condense snapshot authority and publisher recovery rationale [skip ci] * [comment audit] Condense frame, startup and provider cache rationale [skip ci] * [comment audit] Condense host twin and agent lifecycle rationale [skip ci] * [comment audit] Condense browser authority and editor cleanup rationale [skip ci] * [comment audit] Condense editor buffer identity and review cache rationale [skip ci] * [comment audit] Condense provider lifetime and repository ownership rationale [skip ci] * [comment audit] Condense reconnect, hydration and terminal retirement rationale [skip ci] * [comment audit] Condense recovery, reconciliation and persistence rationale [skip ci] * [comment audit] Condense cleanup ownership and listing admission rationale [skip ci] * [comment audit] Condense teardown ordering and terminal ownership rationale [skip ci] * [comment audit] Condense recovery ledger and web host-boundary rationale [skip ci] * [comment audit] Condense web reconnect and credential lifecycle rationale [skip ci] * [comment audit] Condense cloud rollout and assignment safety rationale [skip ci] * [comment audit] Condense relay session and database recovery rationale [skip ci] * [comment audit] Condense relay placement and protocol compatibility rationale [skip ci] * [comment audit] Condense build and packaging constraints [skip ci] * [comment audit] Condense CI gates and validation isolation rationale [skip ci] * [comment audit] Condense catalog identity and browser validation rationale [skip ci] * [comment audit] Condense mobile browser and frame-budget rationale [skip ci] * [comment audit] Shorten mobile route and browser test explanations [skip ci] * [comment audit] Condense editor and session seam test rationale [skip ci] * [comment audit] Trim session and terminal closure history [skip ci] * [comment audit] Shorten terminal browser and census explanations [skip ci] * [comment audit] Preserve root-only E2E diagnostic baseline * [comment audit] Condense mobile seam and HTML preview test rationale [skip ci] * [comment audit] Condense preview instrumentation and render harness rationale [skip ci] * [comment audit] Condense bundle contracts and native-build constraints [skip ci] * [comment audit] Shorten native packaging and CI routing rationale [skip ci] * [comment audit] Condense release tooling and benchmark constraints [skip ci] * [comment audit] Condense packaging and platform gate rationale [skip ci] * [comment audit] Shorten mobile route and history rationale [skip ci] * [comment audit] Condense mobile browser and component rationale [skip ci] * [comment audit] Shorten drawer and workspace-form rationale [skip ci] * [comment audit] Trim mobile review and editor-document explanations [skip ci] * [comment audit] Condense editor lifecycle and Markdown explanations [skip ci] * [comment audit] Trim mobile file, diagnostics and dictation commentary [skip ci] * [comment audit] Simplify mobile host-list and workspace-view explanations [skip ci] * [comment audit] Clarify mobile shell lifetime and bridge delivery constraints [skip ci] * [comment audit] Condense bridge stream, native request and audio rationale [skip ci] * [comment audit] Reduce bridge schema and page-client commentary [skip ci] * [comment audit] Tighten mobile page bridge contracts [skip ci] * [comment audit] Clarify mobile cache and session constraints [skip ci] * [comment audit] Condense mobile route and lifecycle rationale [skip ci] * [comment audit] Tighten mobile shell hook timing rationale [skip ci] * [comment audit] Clarify route handoff and notification compatibility [skip ci] * [comment audit] Clarify push registration and dictation cleanup constraints [skip ci] * [comment audit] Condense keyboard geometry and native media ownership rationale [skip ci] * [comment audit] Tighten mobile chat scroll and composer concurrency rationale [skip ci] * [comment audit] Condense mobile reply compatibility and upload ownership rationale [skip ci] * [comment audit] Condense optimistic echo and scroll ownership rationale [skip ci] * [comment audit] Tighten stream replay and queued session ownership rationale [skip ci] * [comment audit] Condense mobile composer and reply-schema constraints [skip ci] * [comment audit] Clarify mobile transcript recovery and session ownership [skip ci] * [comment audit] Clarify mobile queue and source-control compatibility [skip ci] * [comment audit] Condense storage and task launch constraints [skip ci] * [comment audit] Clarify task schemas and terminal document ownership [skip ci] * [comment audit] Tighten terminal input and viewport rationale [skip ci] * [comment audit] Shorten terminal and RPC recorder contracts [skip ci] * [comment audit] Condense recorder engine and connection contracts [skip ci] * [comment audit] Shorten host credential and relay recovery comments [skip ci] * [comment audit] Tighten pairing recovery and bundle transport rationale [skip ci] * [comment audit] Clarify RPC delivery and workspace catalog boundaries [skip ci] * [comment audit] Condense catalog and relay entry contracts [skip ci] * [comment audit] Shorten shutdown and SSH relay delivery contracts [skip ci] * [comment audit] Condense WSL relay and E2E regression rationale [skip ci] * [comment audit] Shorten cross-version harness and renderer fixture explanations [skip ci] * [comment audit] Condense paired-host and E2E lifecycle rationale [skip ci] * [comment audit] Shorten layout oracle and regression explanations [skip ci] * [comment audit] Condense paired recovery and ownership regression contracts [skip ci] * [comment audit] Shorten restart, sidebar and SSH lifecycle contracts [skip ci] * [comment audit] Condense terminal rendering and IME regression rationale [skip ci] * [comment audit] Shorten terminal recovery and benchmark contracts [skip ci] * [comment audit] Condense tooling and Windows lifecycle proof rationale [skip ci] * [comment audit] Condense workflow routing and release rationale [skip ci] * [comment audit] Condense mobile security and installer contracts [skip ci] * [comment audit] Shorten native rationale and stylesheet workarounds [skip ci] * [comment audit] Shorten Windows visibility probe rationale [skip ci] * [comment audit] Condense embedded release and signing rationale [skip ci] * [comment audit] Retain current main test behavior in final reconciliation [skip ci] * [comment audit] Complete final comment review across current source inventory * [comment audit] Handle consolidated audit reports before final CI * [comment audit] Preserve credential storage census detail [skip ci] * [comment audit] Scale broad changed E2E selections with verified timing shards * [comment audit] Align E2E assertions with browser close and settled session metadata * [comment audit] Match existing E2Es to current resource and windowing contracts * [comment audit] Observe the shared server outage notice in reconnect coverage * [comment audit] Make existing renderer probes measure settled tab and PTY work * [comment audit] Align palette E2E selector with task search * [comment audit] Refresh remaining palette search selectors * [comment audit] Keep selector correction within selected audit specs * [comment audit] Await emoji fixture settings inside renderer evaluation * [comment audit] Cancel fixture fit retries between terminal tests --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
241 lines
8.6 KiB
Ruby
241 lines
8.6 KiB
Ruby
# Manual cert/profile signing avoids automatic cloud-signing export errors and its Admin-key requirement.
|
||
# Credentials come from CI environment variables (.github/workflows/mobile-ios-release.yml).
|
||
|
||
require "base64"
|
||
require "json"
|
||
require_relative "ios_release_version"
|
||
|
||
default_platform(:ios)
|
||
|
||
MOBILE_ROOT = File.expand_path("..", __dir__)
|
||
# Fastlane runs from mobile/fastlane regardless of the caller’s working directory.
|
||
APP_CONFIG_PATH = File.join(MOBILE_ROOT, "app.json")
|
||
WORKSPACE = File.join(MOBILE_ROOT, "ios", "Orca.xcworkspace")
|
||
BUILD_OUTPUT_DIRECTORY = File.join(MOBILE_ROOT, "build")
|
||
SCHEME = "Orca"
|
||
BUNDLE_ID = "com.stably.orca.mobile"
|
||
TESTFLIGHT_GROUPS = ["peeps"].freeze
|
||
DEFAULT_TESTFLIGHT_CHANGELOG = "Latest Orca Mobile updates and fixes.".freeze
|
||
TESTFLIGHT_PROCESSING_TIMEOUT_SECONDS = 20 * 60
|
||
|
||
# Only terminal App Store states close TestFlight trains; in-review/processing states still accept builds.
|
||
# API 3.3 replaces appStoreState with appVersionState, renames ready-for-sale and drops removed states;
|
||
# read both vocabularies so mixed spaceship/API versions cannot silently bypass the guard.
|
||
CLOSED_APP_STORE_STATES = %w[
|
||
READY_FOR_SALE
|
||
READY_FOR_DISTRIBUTION
|
||
PENDING_DEVELOPER_RELEASE
|
||
PENDING_APPLE_RELEASE
|
||
REPLACED_WITH_NEW_VERSION
|
||
REMOVED_FROM_SALE
|
||
DEVELOPER_REMOVED_FROM_SALE
|
||
].freeze
|
||
|
||
def app_store_connect_api_key_from_env
|
||
app_store_connect_api_key(
|
||
key_id: ENV.fetch("ASC_KEY_ID"),
|
||
issuer_id: ENV.fetch("ASC_ISSUER_ID"),
|
||
key_content: ENV.fetch("ASC_API_KEY_P8"),
|
||
is_key_content_base64: true,
|
||
in_house: false,
|
||
)
|
||
end
|
||
|
||
def load_mobile_app_config
|
||
JSON.parse(File.read(APP_CONFIG_PATH))
|
||
end
|
||
|
||
def write_mobile_app_config(config)
|
||
File.write(APP_CONFIG_PATH, "#{JSON.pretty_generate(config)}\n")
|
||
end
|
||
|
||
def current_mobile_version(config)
|
||
config.fetch("expo").fetch("version")
|
||
end
|
||
|
||
def testflight_changelog
|
||
changelog = ENV.fetch("TESTFLIGHT_CHANGELOG", "").strip
|
||
changelog.empty? ? DEFAULT_TESTFLIGHT_CHANGELOG : changelog
|
||
end
|
||
|
||
# Older spaceship versions lack app_version_state; either field can prove the train closed.
|
||
def closed_state?(app_store_version)
|
||
states = [app_store_version.app_store_state]
|
||
states << app_store_version.app_version_state if app_store_version.respond_to?(:app_version_state)
|
||
|
||
states.compact.any? { |state| CLOSED_APP_STORE_STATES.include?(state) }
|
||
end
|
||
|
||
# Fetch once across all versions: TestFlight-only versions have no App Store record, yet a higher
|
||
# approved version closes them too (90062). Nil app/API errors preserve the prior upload behavior.
|
||
def highest_closed_app_store_version(app)
|
||
return nil unless app
|
||
|
||
closed = app
|
||
.get_app_store_versions
|
||
.select { |app_store_version| closed_state?(app_store_version) }
|
||
.map(&:version_string)
|
||
|
||
IosReleaseVersion.max_version(closed)
|
||
rescue StandardError => error
|
||
# Surface lookup errors because assuming open disables the 90186 guard.
|
||
UI.error("Could not determine closed App Store versions (#{error.message}); assuming open and proceeding.")
|
||
nil
|
||
end
|
||
|
||
platform :ios do
|
||
desc "Resolve the iOS release version and next TestFlight build number"
|
||
lane :prepare_release_version do |options|
|
||
api_key = app_store_connect_api_key_from_env
|
||
config = load_mobile_app_config
|
||
|
||
app =
|
||
begin
|
||
Spaceship::ConnectAPI::App.find(BUNDLE_ID)
|
||
rescue StandardError => error
|
||
UI.error("Could not look up App Store app #{BUNDLE_ID} (#{error.message}); skipping closed-train check.")
|
||
nil
|
||
end
|
||
highest_closed = highest_closed_app_store_version(app)
|
||
UI.message("Highest closed App Store version: #{highest_closed || 'none'}")
|
||
|
||
version =
|
||
begin
|
||
IosReleaseVersion.resolve(
|
||
requested: options[:version],
|
||
bump_patch: options[:bump_patch],
|
||
current_version: current_mobile_version(config),
|
||
train_closed: ->(candidate) { IosReleaseVersion.closed_train?(candidate, highest_closed) },
|
||
)
|
||
rescue ArgumentError => error
|
||
UI.user_error!(error.message)
|
||
end
|
||
|
||
# Patch bumps skip closed trains because workflow-only releases can outpace Git; explicit/current versions fail fast.
|
||
if IosReleaseVersion.closed_train?(version, highest_closed)
|
||
retry_guidance =
|
||
if IosReleaseVersion.truthy?(options[:bump_patch])
|
||
"Use a higher release_version or land a \"Prepare mobile <version>\" commit."
|
||
else
|
||
"Re-dispatch with bump_patch_version: true (or a higher release_version), " \
|
||
"or land a \"Prepare mobile <version>\" commit."
|
||
end
|
||
UI.user_error!(
|
||
"iOS version #{version} is not higher than #{highest_closed}, which is already " \
|
||
"submitted/released on the App Store, so Apple will reject the upload. #{retry_guidance}",
|
||
)
|
||
end
|
||
|
||
latest_build_number = latest_testflight_build_number(
|
||
api_key: api_key,
|
||
app_identifier: BUNDLE_ID,
|
||
version: version,
|
||
initial_build_number: 0,
|
||
)
|
||
build_number = latest_build_number.to_i + 1
|
||
|
||
# Expo copies app.json into the native project and About-screen runtime manifest.
|
||
config.fetch("expo")["version"] = version
|
||
config.fetch("expo").fetch("ios")["buildNumber"] = build_number.to_s
|
||
write_mobile_app_config(config)
|
||
|
||
UI.message("Prepared Orca Mobile iOS #{version} (#{build_number})")
|
||
end
|
||
|
||
desc "Build, sign, and upload Orca Mobile to App Store Connect / TestFlight"
|
||
lane :build_and_upload do
|
||
api_key = app_store_connect_api_key_from_env
|
||
|
||
team_id = ENV.fetch("APPLE_TEAM_ID")
|
||
|
||
# Fetch/install an explicit API-key profile for manual archive/export.
|
||
get_provisioning_profile(
|
||
api_key: api_key,
|
||
app_identifier: BUNDLE_ID,
|
||
force: true,
|
||
)
|
||
# This fastlane exposes the chosen profile through SIGH_NAME, not SIGH_PROFILE_MAPPING.
|
||
profile_name = lane_context[SharedValues::SIGH_NAME]
|
||
|
||
# Archive needs explicit manual signing/team/profile; omitting DEVELOPMENT_TEAM fails signing.
|
||
build_app(
|
||
workspace: WORKSPACE,
|
||
scheme: SCHEME,
|
||
configuration: "Release",
|
||
export_method: "app-store",
|
||
xcargs: "DEVELOPMENT_TEAM=#{team_id} " \
|
||
"CODE_SIGN_STYLE=Manual " \
|
||
"CODE_SIGN_IDENTITY='Apple Distribution' " \
|
||
"PROVISIONING_PROFILE_SPECIFIER='#{profile_name}'",
|
||
export_options: {
|
||
teamID: team_id,
|
||
signingStyle: "manual",
|
||
provisioningProfiles: {
|
||
BUNDLE_ID => profile_name,
|
||
},
|
||
},
|
||
output_directory: BUILD_OUTPUT_DIRECTORY,
|
||
output_name: "Orca.ipa",
|
||
clean: true,
|
||
)
|
||
|
||
upload_to_testflight(
|
||
api_key: api_key,
|
||
# Separate distribution retries processing timeouts against the same binary.
|
||
skip_waiting_for_build_processing: true,
|
||
distribute_external: false,
|
||
)
|
||
end
|
||
|
||
desc "Wait for and distribute an uploaded build to external TestFlight testers"
|
||
lane :distribute_testflight do |options|
|
||
version = options[:version].to_s.strip
|
||
build_number = options[:build_number].to_s.strip
|
||
UI.user_error!("version is required") if version.empty?
|
||
UI.user_error!("build_number is required") if build_number.empty?
|
||
|
||
api_key = app_store_connect_api_key_from_env
|
||
app = Spaceship::ConnectAPI::App.find(BUNDLE_ID)
|
||
UI.user_error!("Could not find App Store Connect app #{BUNDLE_ID}") unless app
|
||
|
||
available_groups = app.get_beta_groups.map(&:name)
|
||
missing_groups = TESTFLIGHT_GROUPS - available_groups
|
||
unless missing_groups.empty?
|
||
UI.user_error!(
|
||
"Missing TestFlight group(s): #{missing_groups.join(', ')}. " \
|
||
"Create them in App Store Connect or update TESTFLIGHT_GROUPS.",
|
||
)
|
||
end
|
||
|
||
upload_to_testflight(
|
||
api_key: api_key,
|
||
app_identifier: BUNDLE_ID,
|
||
# Without an IPA to inspect, fastlane would prompt interactively for platform and fail CI.
|
||
app_platform: "ios",
|
||
app_version: version,
|
||
build_number: build_number,
|
||
distribute_only: true,
|
||
skip_waiting_for_build_processing: false,
|
||
wait_processing_timeout_duration: TESTFLIGHT_PROCESSING_TIMEOUT_SECONDS,
|
||
# Expire the superseded build in this train only; default beta review otherwise blocks submission
|
||
# ("Another build is in review", 2026-08-05/08-06).
|
||
reject_build_waiting_for_review: true,
|
||
distribute_external: true,
|
||
groups: TESTFLIGHT_GROUPS,
|
||
notify_external_testers: true,
|
||
changelog: testflight_changelog,
|
||
)
|
||
end
|
||
|
||
desc "Build, upload, and distribute Orca Mobile to external TestFlight testers"
|
||
lane :release do
|
||
build_and_upload
|
||
|
||
config = load_mobile_app_config
|
||
distribute_testflight(
|
||
version: current_mobile_version(config),
|
||
build_number: config.fetch("expo").fetch("ios").fetch("buildNumber"),
|
||
)
|
||
end
|
||
end
|