Deployment - PlugImt/transat-app GitHub Wiki

Deployment

🚀 Deployment Overview

Transat 2.0 uses Expo Application Services (EAS) for building and deploying the mobile application to both iOS App Store and Google Play Store.

🏗️ Build Configuration

EAS Build Setup

The project uses EAS Build for creating production-ready binaries. Configuration is defined in eas.json:

{
  "cli": {
    "version": ">= 6.1.0"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal",
      "ios": {
        "resourceClass": "m-medium"
      }
    },
    "preview": {
      "distribution": "internal",
      "android": {
        "buildType": "apk"
      },
      "ios": {
        "simulator": true
      }
    },
    "production": {
      "autoIncrement": true,
      "env": {
        "NODE_ENV": "production"
      }
    }
  },
  "submit": {
    "production": {}
  }
}

Build Profiles

Development Build

  • Purpose: Testing with development client
  • Distribution: Internal team only
  • Features: Debug symbols, development tools enabled
eas build --profile development --platform all

Preview Build

  • Purpose: Testing and QA
  • Distribution: Internal stakeholders
  • Format: APK for Android, Simulator build for iOS
eas build --profile preview --platform all

Production Build

  • Purpose: App store submission
  • Distribution: Public release
  • Features: Optimized, minified, production-ready
eas build --profile production --platform all

📱 Platform-Specific Configuration

iOS Configuration

App Store Connect Setup

  1. Bundle Identifier: fr.resel.transat
  2. Team ID: Configured in Expo account
  3. Certificates: Managed automatically by EAS
  4. Provisioning Profiles: Auto-generated

iOS Build Settings

{
  "ios": {
    "icon": {
      "dark": "./assets/images/ios-icon.png",
      "light": "./assets/images/ios-icon.png", 
      "tinted": "./assets/images/ios-icon-tint.png"
    },
    "supportsTablet": true,
    "bundleIdentifier": "fr.resel.transat",
    "infoPlist": {
      "ITSAppUsesNonExemptEncryption": false,
      "NSCameraUsageDescription": "This app needs access to camera to update your profile picture.",
      "NSPhotoLibraryUsageDescription": "This app needs access to photo library to update your profile picture."
    }
  }
}

iOS Capabilities

  • Push Notifications
  • Background App Refresh
  • Camera and Photo Library Access
  • Network Extensions

Android Configuration

Google Play Console Setup

  1. Package Name: com.yohann69.transat2_0
  2. Signing Key: Managed by EAS
  3. Google Services: Firebase integration
  4. Play Console Access: Team credentials

Android Build Settings

{
  "android": {
    "adaptiveIcon": {
      "foregroundImage": "./assets/images/icon.png",
      "backgroundColor": "#ffffff"
    },
    "package": "com.yohann69.transat2_0",
    "googleServicesFile": "./google-services.json",
    "permissions": [
      "android.permission.RECORD_AUDIO",
      "android.permission.CAMERA",
      "android.permission.READ_EXTERNAL_STORAGE"
    ]
  }
}

🔐 Environment Management

Environment Variables

Production Environment

# API Configuration
EXPO_PUBLIC_API_URL=https://api.transat.resel.fr

# Authentication
EXPO_PUBLIC_JWT_SECRET=production_secret_key

# Services
EXPO_PUBLIC_SENTRY_DSN=https://sentry.io/organizations/plugimt/projects/transat-app/
EXPO_PUBLIC_ANALYTICS_ID=analytics_tracking_id

# Push Notifications
EXPO_PUBLIC_FCM_SERVER_KEY=firebase_server_key

Secrets Management

Local Development

# .env.local (not committed)
EXPO_PUBLIC_API_URL=http://localhost:8080
EXPO_PUBLIC_DEBUG_MODE=true

📦 Release Process

Version Management

Semantic Versioning

The app follows semantic versioning (semver):

  • Major (X.0.0): Breaking changes
  • Minor (X.Y.0): New features, backward compatible
  • Patch (X.Y.Z): Bug fixes, backward compatible

Version Bumping

# Automatic version increment in app.json
{
  "expo": {
    "version": "2.1.3",
    "ios": {
      "buildNumber": "23"
    },
    "android": {
      "versionCode": 23
    }
  }
}

Release Checklist

Pre-Release

  • All tests passing
  • Code review completed
  • Changelog updated
  • Version bumped
  • Environment variables verified
  • Dependencies updated
  • Security scan completed

Release Steps

  1. Create Release Branch

    git checkout -b release/v2.1.0
    git push origin release/v2.1.0
    
  2. Build and Test

    eas build --profile production --platform all
    
  3. Internal Testing

    • Deploy to internal testing group
    • Verify core functionality
    • Test on multiple devices
  4. Create GitHub Release

    • Tag the release
    • Generate release notes
    • Attach build artifacts
  5. Submit to Stores

    eas submit --platform all
    

Post-Release

  • Monitor crash reports
  • Check user feedback
  • Update documentation
  • Plan next iteration

🏪 App Store Submission

iOS App Store

App Store Connect Configuration

  1. App Information

    • Name: Transat 2.0
    • Bundle ID: fr.resel.transat
    • Primary Language: French
    • Category: Education
  2. App Store Optimization

    • Keywords: campus, IMT Atlantique, student life
    • Screenshots: iPhone and iPad versions
    • App Preview: Feature demonstration videos

Review Guidelines Compliance

  • Privacy Policy: Link to privacy policy
  • Terms of Service: Clear terms and conditions
  • Age Rating: 4+ (Educational content)
  • Content Description: Campus utility app

Google Play Store

Play Console Configuration

  1. Store Listing

    • App Title: Transat 2.0
    • Short Description: Campus life companion
    • Full Description: Detailed feature list
  2. Content Rating

    • Target Audience: Everyone
    • Content Guidelines: Educational app
    • Sensitive Permissions: Justified usage

Release Management

# Submit to internal testing
eas submit --platform android --track internal

# Promote to production
eas submit --platform android --track production

📊 Monitoring & Analytics

Sentry Integration

Error Monitoring

import * as Sentry from '@sentry/react-native';

Sentry.init({
  dsn: process.env.EXPO_PUBLIC_SENTRY_DSN,
  environment: __DEV__ ? 'development' : 'production',
  enableAutoSessionTracking: true,
  integrations: [
    new Sentry.ReactNativeTracing({
      enableUserInteractionTracing: true,
    }),
  ],
});