Logo Craft Homelab Docs Контакты Telegram
Mobile CI/CD: Fastlane и EAS — автоматизация билдов
Sat Dec 27 2025

CI/CD для мобильных приложений

CI/CD для мобильных приложений требует специальных инструментов и подходов. В отличие от веба, мобильные приложения требуют сборки под конкретную платформу, подписи и прохождения ревью в сторах. Автоматизация этих процессов критически важна для частых релизов.

GitHub Actions для iOS

GitHub Actions позволяет автоматизировать сборку iOS приложений на macOS runner’ах.

name: iOS CI/CD

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: macos-latest

    steps:
      - uses: actions/checkout@v4

      - name: Select Xcode
        run: sudo xcode-select -s /Applications/Xcode_15.0.app

      - name: Cache Pods
        uses: actions/cache@v3
        with:
          path: Pods
          key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}

      - name: Install dependencies
        run: pod install

      - name: Build
        run: xcodebuild -workspace App.xcworkspace -scheme App -configuration Debug build

      - name: Upload Build
        uses: actions/upload-artifact@v3
        with:
          name: app.ipa
          path: build/App.ipa

Кэширование Pods ускоряет сборку на 2-3 минуты. Указывайте конкретную версию Xcode для воспроизводимости.

Fastlane

Fastlane — инструмент для автоматизации рутинных задач: сборка, скриншоты, публикация.

# Fastfile
default_platform(:ios)

platform :ios do
  desc "Build and upload to TestFlight"
  lane :beta do
    match(type: "appstore")
    gym(scheme: "App")
    pilot(distribute_external: false)
  end

  desc "Build and upload to Firebase App Distribution"
  lane :firebase do
    match(type: "development")
    gym(scheme: "App")
    firebase_app_distribution(
      app: "1:123456789:ios:abc123",
      testers: "tester@example.com",
      groups: "qa-team"
    )
  end
end

match синхронизирует сертификаты через Git. gym собирает IPA, pilot загружает в TestFlight.

Fastlane автоматизирует рутинные задачи: подпись, сборку, загрузку в сторы.

Android CI/CD

name: Android CI/CD

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Java
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '17'
      
      - name: Setup Gradle
        uses: gradle/wrapper-validation-action@v1
      
      - name: Cache Gradle
        uses: actions/cache@v3
        with:
          path: ~/.gradle/caches
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
      
      - name: Build
        run: ./gradlew assembleDebug
      
      - name: Upload APK
        uses: actions/upload-artifact@v3
        with:
          name: app-debug.apk
          path: app/build/outputs/apk/debug/app-debug.apk

Firebase App Distribution

- name: Upload to Firebase
  uses: wzieba/Firebase-Distribution-Github-Action@v1
  with:
    appId: ${{ secrets.FIREBASE_APP_ID }}
    serviceCredentialsFileContent: ${{ secrets.FIREBASE_SERVICE_JSON }}
    groups: testers
    file: app/build/outputs/apk/debug/app-debug.apk

GitHub Actions для Flutter

name: Flutter CI/CD

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: '3.16.0'
      
      - name: Install dependencies
        run: flutter pub get
      
      - name: Analyze
        run: flutter analyze
      
      - name: Build APK
        run: flutter build apk --debug
      
      - name: Upload APK
        uses: actions/upload-artifact@v3
        with:
          name: app.apk
          path: build/app/outputs/flutter-apk/app.apk

Code Signing

iOS

- name: Import Certificate
  env:
    CERTIFICATE: ${{ secrets.CERTIFICATE }}
    KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
    CERTIFICATE_PWD: ${{ secrets.CERTIFICATE_PWD }}
  run: |
    # create keychain
    security create-keychain -p mykeychainpass
    security set-keychain-settings -lut 21600
    security unlock-keychain -p mykeychainpass
    
    # import certificate
    echo -n "$CERTIFICATE" | base64 --decode -o certificate.p12
    security import certificate.p12 -P $CERTIFICATE_PWD -A -t cert

Android

- name: Decode keystore
  run: echo ${{ secrets.ANDROID_KEYSTORE }} | base64 --decode > keystore.jks

Заключение

Автоматизация CI/CD значительно ускоряет разработку и доставку мобильных приложений.