Section 13
Reference
Environment variables
| Variable | Holds | Needed for |
|---|---|---|
LEAS_IOS_DIST_CERT_BASE64 | base64 of dist.p12 | iOS build |
LEAS_IOS_DIST_CERT_PASSWORD | that file's password | iOS build |
LEAS_IOS_PROVISIONING_PROFILE_BASE64 | base64 of the profile | iOS build |
LEAS_ASC_API_KEY_BASE64 | base64 of the .p8 | iOS submit |
LEAS_ASC_KEY_ID | key ID, e.g. ABCD1234EF | iOS submit |
LEAS_ASC_ISSUER_ID | team issuer UUID | iOS submit |
LEAS_ANDROID_KEYSTORE_BASE64 | base64 of the keystore | Android build |
LEAS_ANDROID_KEYSTORE_PASSWORD | store password | Android build |
LEAS_ANDROID_KEY_ALIAS | usually upload | Android build |
LEAS_ANDROID_KEY_PASSWORD | key password | Android build |
LEAS_PLAY_SERVICE_ACCOUNT_BASE64 | base64 of the service account JSON | Android submit |
Every credential resolves from either a file path in leas.json
or its environment variable. That is what lets identical code run on your laptop and on a
CI worker.
What each file does
| Path | Responsibility |
|---|---|
src/cli.js | Command parsing and orchestration. |
src/config.js | Reads leas.json, resolves profile inheritance. |
src/credentials.js | Turns files or env vars into usable keychains and keys. |
src/build-ios.js | Archive and export via xcodebuild. |
src/build-android.js | Gradle build, then re-sign with the upload key. |
src/submit-ios.js | Validate, upload, and poll App Store Connect. |
src/submit-android.js | The Play Developer API edit lifecycle. |
src/cloud.js | Dispatch to the fleet, stream logs, fetch artifacts. |
.github/workflows/ | The fleet definition — the machines themselves. |
Two implementation details worth knowing
iOS signing never touches your login keychain. leas creates a throwaway keychain,
imports the certificate, marks it accessible to codesign, builds, and deletes the
keychain afterwards — even if the build fails.
Android is re-signed rather than reconfigured. The Expo template signs release
builds with the debug keystore. Rather than patching your build.gradle, leas
builds normally and then re-signs the artifact with your real upload key. Idempotent, and it leaves
your Gradle files exactly as Expo generated them.