Представьте: сейчас 16:00, уровень кофеина снижается, а App Store Connect только что отклонил вашу сборку, потому что Дэйв из отдела маркетинга снова забыл обновить номер сборки… Давайте создадим настолько устойчивый CI/CD-пайплайн, что даже «креативная» версия от Дэйва не сможет его сломать. ☕️

Почему Fastlane — ваш новый лучший друг (извините, Фидо)

Fastlane — это как швейцарский армейский нож, который ещё и готовит эспрессо. Он умеет:

  • Синхронизацию номеров сборок (больше никаких «1.0.0.0.1-beta2-final_FINAL»)
  • Управление подписью кода (седьмой круг ада для разработчиков iOS)
  • Развёртывание в App Store (без необходимости проходить через 15 диалогов аутентификации Apple)
# Fastfile — дирижёр нашего оркестра хаоса
lane :release_android do
  increment_version_code(
    gradle_file_path: "app/build.gradle"
  )
  gradle(task: "clean assembleRelease")
  upload_to_play_store(
    track: 'production',
    apk: 'app/build/outputs/apk/release/app-release.apk'
  )
  slack(message: "🚀 Новая сборка Android подана свежей!")
end

Танцующий CI/CD: от коммита кода до App Store

graph TD A[Git Push] --> B{CI Server} B --> C[Установка зависимостей] C --> D[Сборка и тестирование] D --> E[Развёртывание в TestFlight] E --> F[Уведомление команды] F --> G[Спокойный сон]

Pro Tip: Добавьте danger в свой пайплайн — это как вышибала для плохих PR:

# Dangerfile
warn("Даже не думайте об этом") if !git.commits.any? { |c| c.message =~ /chore|feat|fix/ }

GitHub Actions: личный бариста вашего кода

Вот как сварить идеальный CI-пайплайн:

# .github/workflows/android-release.yml
name: Android Release Espresso Shot
on:
  push:
    tags:
      - 'v*'
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4
      - name: Setup Java
        uses: actions/setup-java@v3
        with:
          distribution: 'zulu'
          java-version: '17'
      - name: Run Fastlane
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.2'
      - run: bundle install
      - run: bundle exec fastlane release_android

Проверенные на практике советы из окопов CI/CD

  1. Управление секретами: используйте fastlane match — это как хранилище в Вегасе для ваших идентификаторов подписи кода

    match(
      type: "appstore",
      storage_mode: "s3",
      s3_bucket: "our-awesome-secrets-bucket"
    )
    
  2. Параллельное тестирование: разделяйте тесты на эмуляторах, как суши-повар:

    fastlane scan --devices "iPhone 15,iPhone 14" --scheme "MyAppTests"
    
  3. Удалённый кеш: для сборок Android используйте удалённый кеш Gradle, если вам не нравится смотреть загрузки зависимостей больше, чем видео с котиками

Когда всё идёт не по плану (спойлер: так и будет)

Ошибка «Я не могу в это поверить, но это не подписано кодом»:

# Иногда нужно всё снести орбитальным ударом
fastlane sigh repair --force
fastlane match nuke development

Спецвыпуск «Но у меня работало»:

# Добавьте в конфигурацию CI
- name: Record Build Environment
  run: |
    echo "Java version: $(java -version)"
    echo "Ruby version: $(ruby -v)"
    fastlane env    

Ваши новые суперсилы CI/CD

Теперь в вашем арсенале:

  • Автоматическое увеличение версии (больше никаких сборок «final_FINAL_3»)
  • Самовосстанавливающаяся подпись кода (Match творит чудеса)
  • Уведомления о развёртывании (Slack-бот исполняет победный танец) Вперёд и автоматизируйте! Ваше будущее «я» (и Дэйв из маркетинга) будут благодарить вас, когда вы будете выпускать обновления с пляжа, потягивая маргариту 🏖️
lane :celebrate do
  slack(message: "🔥 Релиз прошёл успешно! Время для тако!")
  sh("open https://www.youtube.com/watch?v=dQw4w9WgXcQ")
end