Back to list
allen-hsu

react-native-mobile-devops

by allen-hsu

0🍴 0📅 Jan 18, 2026

SKILL.md


name: react-native-mobile-devops description: Mobile DevOps for React Native and Expo apps using EAS (Expo Application Services) and Fastlane. Use when (1) user needs to set up CI/CD for mobile apps, (2) user asks about EAS Build, Submit, Update, or Workflows, (3) user wants to automate app deployment to App Store or Play Store, (4) user mentions "EAS", "Fastlane", "mobile CI/CD", "app deployment", or "OTA updates".

Mobile DevOps (EAS + Fastlane)

Expert guidance for automating mobile app builds, submissions, and over-the-air updates using EAS (Expo Application Services) and Fastlane.

Overview

ServicePurpose
EAS BuildCloud builds for iOS and Android
EAS SubmitAutomated submission to App Store / Play Store
EAS UpdateOver-the-air (OTA) JavaScript updates
EAS WorkflowsCI/CD pipelines with YAML configuration
FastlaneAdditional automation (screenshots, metadata, certificates)

Quick Start

1. Initialize EAS

# Install EAS CLI
npm install -g eas-cli

# Login to Expo account
eas login

# Initialize EAS in your project
eas init

# Configure build profiles
eas build:configure

2. Configure eas.json

See references/eas-json.md for complete configuration.

{
  "cli": {
    "version": ">= 16.3.0",
    "appVersionSource": "remote"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "distribution": "internal",
      "channel": "preview"
    },
    "production": {
      "channel": "production",
      "autoIncrement": true
    }
  },
  "submit": {
    "production": {}
  }
}

3. Create Your First Workflow

Create .eas/workflows/build.yml:

name: Build Apps

on:
  push:
    branches: [main]

jobs:
  build_android:
    name: Build Android
    type: build
    params:
      platform: android
      profile: production

  build_ios:
    name: Build iOS
    type: build
    params:
      platform: ios
      profile: production

Run manually:

eas workflow:run .eas/workflows/build.yml

EAS Workflows

YAML Structure

See references/eas-workflows.md for complete syntax.

name: Workflow Name

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]
  workflow_dispatch:
    inputs:
      environment:
        type: choice
        options: [staging, production]

jobs:
  job_id:
    name: Display Name
    type: build | submit | update | fingerprint | get-build
    needs: [other_job]
    if: ${{ condition }}
    environment: production
    params:
      platform: android | ios
      profile: production

Pre-packaged Job Types

TypeDescriptionKey Params
buildBuild app binaryplatform, profile
submitSubmit to app storesbuild_id, profile
updatePublish OTA updatebranch, channel, platform
fingerprintGenerate native fingerprintenvironment
get-buildFind existing buildfingerprint_hash, profile
maestroRun E2E testsbuild_id, flow_path
slackSend Slack notificationwebhook_url, message

Production Deployment Workflow

name: Deploy to Production

on:
  push:
    branches: [main]

jobs:
  # Check if native code changed
  fingerprint:
    name: Fingerprint
    type: fingerprint
    environment: production

  # Look for existing compatible build
  get_android_build:
    name: Check Android Build
    needs: [fingerprint]
    type: get-build
    params:
      fingerprint_hash: ${{ needs.fingerprint.outputs.android_fingerprint_hash }}
      profile: production

  get_ios_build:
    name: Check iOS Build
    needs: [fingerprint]
    type: get-build
    params:
      fingerprint_hash: ${{ needs.fingerprint.outputs.ios_fingerprint_hash }}
      profile: production

  # Build only if no compatible build exists
  build_android:
    name: Build Android
    needs: [get_android_build]
    if: ${{ !needs.get_android_build.outputs.build_id }}
    type: build
    params:
      platform: android
      profile: production

  build_ios:
    name: Build iOS
    needs: [get_ios_build]
    if: ${{ !needs.get_ios_build.outputs.build_id }}
    type: build
    params:
      platform: ios
      profile: production

  # Submit new builds to stores
  submit_android:
    name: Submit to Play Store
    needs: [build_android]
    type: submit
    params:
      build_id: ${{ needs.build_android.outputs.build_id }}

  submit_ios:
    name: Submit to App Store
    needs: [build_ios]
    type: submit
    params:
      build_id: ${{ needs.build_ios.outputs.build_id }}

  # Publish OTA update if build exists
  update_android:
    name: OTA Update Android
    needs: [get_android_build]
    if: ${{ needs.get_android_build.outputs.build_id }}
    type: update
    params:
      branch: production
      platform: android

  update_ios:
    name: OTA Update iOS
    needs: [get_ios_build]
    if: ${{ needs.get_ios_build.outputs.build_id }}
    type: update
    params:
      branch: production
      platform: ios

EAS Commands Reference

Build Commands

# Build for specific platform
eas build --platform ios --profile production
eas build --platform android --profile preview
eas build --platform all --profile development

# Build with auto-submit
eas build --platform ios --auto-submit

# Local build (experimental)
eas build --platform android --local

# List builds
eas build:list

# View build details
eas build:view [BUILD_ID]

# Cancel build
eas build:cancel [BUILD_ID]

Submit Commands

# Submit latest build
eas submit --platform ios --latest
eas submit --platform android --latest

# Submit specific build
eas submit --platform ios --id [BUILD_ID]

# Submit local file
eas submit --platform android --path ./app.aab

Update Commands

# Publish update
eas update --branch production --message "Bug fixes"

# Publish to specific channel
eas update --channel preview --message "New feature"

# List updates
eas update:list --branch production

# Rollback (republish previous update)
eas update:republish --group [UPDATE_GROUP_ID]

Workflow Commands

# Run workflow
eas workflow:run .eas/workflows/deploy.yml

# Validate workflow
eas workflow:validate .eas/workflows/deploy.yml

# List workflow runs
eas workflow:runs

# View workflow logs
eas workflow:logs [WORKFLOW_ID]

# Cancel workflow
eas workflow:cancel [WORKFLOW_ID]

Channels & Branches Strategy

Channel          Branch          Environment
─────────────────────────────────────────────
development  →   development  →   Dev builds
preview      →   preview      →   Internal testing
staging      →   staging      →   QA / Beta
production   →   production   →   App Store / Play Store

Configuration in eas.json

{
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal",
      "channel": "development"
    },
    "preview": {
      "distribution": "internal",
      "channel": "preview"
    },
    "staging": {
      "distribution": "internal",
      "channel": "staging"
    },
    "production": {
      "channel": "production",
      "autoIncrement": true
    }
  }
}

Credentials Management

iOS Credentials

# Interactive credentials setup
eas credentials --platform ios

# Credentials include:
# - Distribution Certificate
# - Provisioning Profile
# - Push Notification Key
# - App Store Connect API Key (for submit)

Android Credentials

# Interactive credentials setup
eas credentials --platform android

# Credentials include:
# - Keystore (upload key or legacy app signing key)
# - Google Service Account (for submit)

Environment Variables

Build-time Secrets

# Set secret
eas secret:create --name API_KEY --value "your-secret-key" --scope project

# List secrets
eas secret:list

# Delete secret
eas secret:delete API_KEY

Using in eas.json

{
  "build": {
    "production": {
      "env": {
        "API_URL": "https://api.production.com",
        "SENTRY_DSN": "@SENTRY_DSN"
      }
    }
  }
}

Fastlane Integration

See references/fastlane.md for Fastlane patterns.

Using Fastlane in EAS Workflows

defaults:
  tools:
    fastlane: 2.224.0

jobs:
  screenshots:
    runs_on: macos-large
    steps:
      - uses: eas/checkout
      - name: Capture Screenshots
        run: fastlane screenshots
        working_directory: ./ios

Resources

Score

Total Score

45/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

0/5
タグ

1つ以上のタグが設定されている

0/5

Reviews

💬

Reviews coming soon