packages/app/docs/mobile-and-desktop-release-pipeline-spec.md
Status: implemented for current CI preflight/artifact policy; remaining store
approval and signing inputs are external launch blockers.
Owner: Eliza App release engineering
Scope: packages/app release packaging and distribution only
.ipa download flow. Public iOS distribution must use
TestFlight or the App Store.packages/app/package.json exposes mobile build and sync commands:
build:ios, build:ios:local, build:ios:local:device,
build:android, build:android:cloud, cap:sync:ios, and
cap:sync:android.packages/app/ios/App and has Fastlane
lanes in packages/app/ios/fastlane/Fastfile for certificates, App Store
build, TestFlight upload, App Store release, and metadata upload.packages/app/android and has
Fastlane lanes in packages/app/android/fastlane/Fastfile for signed AAB
builds and Play Store track promotion.The supported iOS installer paths are, in priority order:
The release pipeline must produce App Store signed .ipa artifacts only for
App Store Connect upload. It must not attach public installable .ipa files to
GitHub Releases unless the release is explicitly marked as internal and access
controlled outside the public release page.
The supported Android installer paths are:
The release pipeline attaches signed .apk files to GitHub Releases for QA and
developer convenience when release signing credentials are available. The
public Play Store artifact remains the .aab.
Desktop artifacts are distributed through GitHub Releases:
.dmg.dmg.exe installer.AppImage.debmacOS desktop artifacts must be signed and notarized before public release. Windows artifacts must be Authenticode signed when certificate material is available. Linux artifacts must include checksums and package metadata.
The iOS release job must fail before build when any required release input is missing:
APPLE_IDAPPLE_TEAM_IDITC_TEAM_IDAPP_STORE_APP_IDAPP_IDENTIFIERMATCH_GIT_URLMATCH_PASSWORDAPP_IDENTIFIER_EXTRAThe job must report which input is missing and whether the failure blocks TestFlight, App Store release, or both.
Before building, CI must verify:
xcodebuild -showsdks includes an iPhoneOS SDK compatible with the release.packages/app/ios/App/App.xcworkspace exists.App scheme is shared and buildable.packages/app/ios/App/ExportOptions.plist exists when the pipeline expects
explicit export options.packages/app/ios/App/App/PrivacyInfo.xcprivacy exists.cap:sync:ios and the iOS overlay step have run before native build.Recommended diagnostic commands:
xcodebuild -version
xcodebuild -showsdks
xcodebuild -workspace packages/app/ios/App/App.xcworkspace -list
The preferred signing flow is Fastlane match with App Store profiles:
packages/app/ios/fastlane/Fastfile lane certs syncs App Store
certificates and profiles.APP_IDENTIFIER_EXTRA must include every extension bundle identifier.The build must fail when:
Default warning windows:
The preferred beta path is:
.ipa..ipa as a private workflow artifact for traceability.TestFlight upload must not silently downgrade to local artifact only. If
APP_STORE_APP_ID or upload credentials are absent, the job must either fail or
be explicitly run in a build-only mode.
The stable iOS release path is:
The App Store release job must publish a summary containing:
iOS sideloading exists for local development and controlled QA only. The helper may automate checks and open Xcode, but it must not present itself as a public installer.
Allowed capabilities:
xcrun xctrace list devices,
xcrun devicectl list devices, or equivalent Xcode tooling.build:ios:local:sim.build:ios:local:device.packages/app/ios/App/App.xcworkspace for manual run and signing fixes.Required warnings:
Required failure cases:
The helper may never:
.ipa links.Android release jobs must verify:
ANDROID_HOME or ANDROID_SDK_ROOT is set.packages/app/android/gradlew is executable.cap:sync:android and Android overlay steps have run before Gradle release
build.ELIZAOS_KEYSTORE_PATH, ELIZAOS_KEYSTORE_PASSWORD,
ELIZAOS_KEY_ALIAS, and ELIZAOS_KEY_PASSWORD.PLAY_STORE_SERVICE_ACCOUNT_JSON exists for Play upload.The release pipeline should produce:
GitHub Release attachment rules:
unsigned label.bun run preflight:android:store after the release keystore is decoded
and before Gradle builds release outputs.The preferred Play Store flow is:
Promotion jobs must require an existing uploaded AAB and must not rebuild from a different commit. The job summary must show package name, versionName, versionCode, source tag, target track, rollout percentage, and whether changelogs were uploaded.
Desktop release preparation must verify:
.AppImage, .deb, and optional Flatpak artifacts are generated with
expected metadata.GitHub Release desktop assets should use stable names:
Eliza-<version>-macos-arm64.dmgEliza-<version>-macos-x64.dmgEliza-<version>-windows-x64.exeEliza-<version>-linux-x64.AppImageEliza-<version>-linux-x64.debEliza-<version>-linux-x64.flatpakEliza-<version>-checksums.txtBefore publishing a release:
Release notes must include:
Installer or helper UX must distinguish:
For mobile devices, diagnostics should include: