Skip to Content
Housr AppBuild & Deploy

Build & Deploy

EAS Build Profiles

Defined in eas.json. All iOS builds use m-medium resource class.

ProfileExtendsDistributionChannelRegionMode
developmentinternalDev client, APK on Android
development-simulatorinternaliOS simulator build
previewPreview builds
productionProduction base profile
uk-stagingpreviewstoreuk-stagingUKEXPO_PUBLIC_USA_MODE=false
us-stagingpreviewstoreus-stagingUSEXPO_PUBLIC_USA_MODE=true
uk-productionproductionuk-productionUKEXPO_PUBLIC_USA_MODE=false
us-productionproductionus-productionUSEXPO_PUBLIC_USA_MODE=true
demoproductiondemoUSEXPO_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:

ProfileiOS App Store Connect IDAndroid Package
uk-staging6758083438com.housr.houser.staging
us-staging6758090136com.housr.myhousr.staging
uk-production1611728449com.housr.houser
us-production6478925209com.housr.myhousr
demo6758048498

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:

  1. Extract version from tag
  2. Setup Node, Expo, EAS
  3. npm ci
  4. Inject env vars into eas.json (API URLs, Mixpanel, Firebase, etc.)
  5. 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)
  • regionsboth, uk-only, or us-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 --local

Version Management

  • cli.appVersionSource: "remote" in eas.json — EAS manages version numbers remotely
  • autoIncrement: true on all profiles — build numbers auto-increment
  • Version is extracted from git tags in CI (removes v prefix)
  • Runtime version for OTA updates is derived from the latest v*.*.* tag

Release Process

Staging Release

  1. Create and push a version tag: git tag v1.2.3 && git push origin v1.2.3
  2. GitHub Actions builds all 4 variants (UK/US x iOS/Android)
  3. Builds auto-submit to TestFlight / Google Play internal track

Production Release

  1. Go to GitHub Actions > “Deploy Production to TestFlight”
  2. Click “Run workflow”
  3. Enter version number and select regions
  4. Builds submit to App Store Connect / Google Play

OTA Updates

  • Staging: Automatic on push to main
  • Production: Manual dispatch via GitHub Actions
Last updated on