Build & Deploy
EAS Build Profiles
Defined in eas.json. All iOS builds use m-medium resource class.
| Profile | Extends | Distribution | Channel | Region | Mode |
|---|---|---|---|---|---|
development | — | internal | — | — | Dev client, APK on Android |
development-simulator | — | internal | — | — | iOS simulator build |
preview | — | — | — | — | Preview builds |
production | — | — | — | — | Production base profile |
uk-staging | preview | store | uk-staging | UK | EXPO_PUBLIC_USA_MODE=false |
us-staging | preview | store | us-staging | US | EXPO_PUBLIC_USA_MODE=true |
uk-production | production | — | uk-production | UK | EXPO_PUBLIC_USA_MODE=false |
us-production | production | — | us-production | US | EXPO_PUBLIC_USA_MODE=true |
demo | production | — | demo | US | EXPO_PUBLIC_USA_MODE=true, demo API URLs |
Each profile sets region-specific environment variables including API URLs and Firebase database URLs. See API Layer for the full URL table.
Submit Profiles
Also in eas.json, configured per region/platform:
| Profile | iOS App Store Connect ID | Android Package |
|---|---|---|
| uk-staging | 6758083438 | com.housr.houser.staging |
| us-staging | 6758090136 | com.housr.myhousr.staging |
| uk-production | 1611728449 | com.housr.houser |
| us-production | 6478925209 | com.housr.myhousr |
| demo | 6758048498 | — |
Android staging builds go to internal track with draft status. Production builds go to internal track with completed status.
GitHub Actions Workflows
All workflows live in .github/workflows/.
Staging Build: testflight-staging.yml
Trigger: Push a git tag matching v*.*.* (e.g., v1.2.3)
Matrix: Builds 4 variants in parallel:
- UK iOS + UK Android
- US iOS + US Android
Steps:
- Extract version from tag
- Setup Node, Expo, EAS
npm ci- Inject env vars into
eas.json(API URLs, Mixpanel, Firebase, etc.) eas build --platform <platform> --profile <profile> --auto-submit --no-wait
Production Build: testflight-production.yml
Trigger: Manual workflow dispatch with inputs:
version— Version number (e.g.,1.2.3)regions—both,uk-only, orus-only
Same matrix strategy as staging but with production profiles and API URLs.
OTA Update (Staging): ota-update-staging.yml
Trigger: Push to main branch
Publishes an EAS Update to both uk-staging and us-staging channels. Uses the latest v*.*.* tag as the runtime version.
OTA Update (Production): ota-update-production.yml
Trigger: Manual workflow dispatch
Publishes an EAS Update to production channels.
OTA Hotfix (Staging): ota-update-hotfix-staging.yml
For emergency staging OTA updates.
Pages: pages.yml
GitHub Pages deployment (likely for deep link config or app-site-association).
Local Builds
# Staging build (UK iOS)
APP_VERSION=1.2.3 BUILD_NUMBER=1 npx eas build --profile uk-staging --platform ios --local
# Development build (iOS simulator)
npx eas build --profile development-simulator --platform ios --local
# Development build (Android APK)
npx eas build --profile development --platform android --localVersion Management
cli.appVersionSource: "remote"ineas.json— EAS manages version numbers remotelyautoIncrement: trueon all profiles — build numbers auto-increment- Version is extracted from git tags in CI (removes
vprefix) - Runtime version for OTA updates is derived from the latest
v*.*.*tag
Release Process
Staging Release
- Create and push a version tag:
git tag v1.2.3 && git push origin v1.2.3 - GitHub Actions builds all 4 variants (UK/US x iOS/Android)
- Builds auto-submit to TestFlight / Google Play internal track
Production Release
- Go to GitHub Actions > “Deploy Production to TestFlight”
- Click “Run workflow”
- Enter version number and select regions
- Builds submit to App Store Connect / Google Play
OTA Updates
- Staging: Automatic on push to
main - Production: Manual dispatch via GitHub Actions