R
Rishtaara
React Native Advanced: CI/CD Pipeline Mastery
Lesson 17 of 19Article20 min

GitHub Actions — Full Pipeline

Split jobs by concern: validate (fast, blocks merge), platform builds (parallel), release (main only). Use needs: for dependencies, actions/cache for npm and Gradle, and matrix strategy only when testing multiple Node/Java versions.

Production-style workflow architecture

Split jobs by concern: validate (fast, blocks merge), platform builds (parallel), release (main only). Use needs: for dependencies, actions/cache for npm and Gradle, and matrix strategy only when testing multiple Node/Java versions.

GitHub Actions job graph

Complete workflow example

.github/workflows/mobile-ci.yml
name: Mobile CI

on:
  pull_request:
    branches: [main, develop]
  push:
    branches: [main, develop]

concurrency:
  group: mobile-${{ github.ref }}
  cancel-in-progress: true

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20, cache: npm }
      - run: npm ci
      - run: npm run lint
      - run: npm test -- --ci --coverage

  android-build:
    needs: validate
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20, cache: npm }
      - uses: actions/setup-java@v4
        with: { distribution: temurin, java-version: 17, cache: gradle }
      - run: npm ci
      - run: cd android && ./gradlew assembleRelease --no-daemon
      - uses: actions/upload-artifact@v4
        with:
          name: android-release-apk
          path: android/app/build/outputs/apk/release/
          retention-days: 14

  ios-build:
    needs: validate
    runs-on: macos-14
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20, cache: npm }
      - run: npm ci
      - run: cd ios && pod install
      - run: |
          xcodebuild -workspace MyApp.xcworkspace -scheme MyApp \
            -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15' \
            -configuration Release build

Optimization tips

  • Use concurrency to cancel outdated PR runs when new commits push.
  • Cache Gradle (~/.gradle) and CocoaPods (Pods/) directories.
  • Run iOS builds only when ios/ or package.json changes (paths filter).
  • Store signing secrets as base64 in GitHub Secrets; decode in workflow.
  • Separate release workflow triggered only on tags matching v*.*.*.