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 buildOptimization 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*.*.*.