Как организовать процесс CI/CD для React Native-приложения?

Организация процесса CI/CD (Continuous Integration / Continuous Deployment) для React Native-приложения — это комплекс мер и инструментов, направленных на автоматизацию сборки, тестирования и доставки приложения в стора (App Store и Google Play) или внутренние каналы распространения (например, для QA или клиентов).

Хорошо организованный CI/CD-процесс экономит время, уменьшает число ошибок при ручной сборке, повышает надёжность и обеспечивает быструю доставку изменений.

1. Выбор CI/CD платформы

Существуют облачные и локальные решения, поддерживающие React Native:

  • **GitHub Actions
    **
  • **Bitrise
    **
  • **CircleCI
    **
  • **GitLab CI/CD
    **
  • **Azure Pipelines
    **
  • **Fastlane (как инструмент доставки)
    **
  • EAS Build от Expo (если проект на Expo)

  • **Codemagic
    **

  • Jenkins (самостоятельная настройка)

Для React Native чаще всего выбирают GitHub Actions + Fastlane или Bitrise + Fastlane, либо EAS для Expo.

2. Подготовка проекта к CI

Обязательные шаги:

  • Настроить package.json скрипты (build:android, build:ios, test, lint)

  • Разделить .env на env.staging, env.production, т.д.

  • Настроить babel.config.js и metro.config.js на поддержку CI

  • Убедиться, что проект собирается локально без GUI

Разделить сборку по платформам:

  • android/app/build.gradle должен поддерживать переменные из gradle.properties

  • ios/ должен содержать рабочий .xcworkspace и schema

3. Секреты и конфигурации

  • API-ключи, signing configs, .env-файлы не должны быть в репозитории

  • Использовать GitHub Secrets, Bitrise Secrets, dotenv в CI

  • Хранить ключи шифрованными (.keystore, google-services.json, GoogleService-Info.plist, apple certificates)

4. Автоматизация с помощью Fastlane

Fastlane — CLI-инструмент для автоматизации сборок, подписи и загрузки приложений.

Установка:

bundle init
bundle add fastlane
fastlane init

Основные lanes:

\# Fastfile
platform :ios do
desc "Build and upload to TestFlight"
lane :beta do
increment_build_number
build_app(scheme: "YourApp")
upload_to_testflight
end
end
platform :android do
desc "Build and upload to Google Play internal track"
lane :beta do
gradle(
task: "assemble",
build_type: "Release"
)
upload_to_play_store(track: "internal")
end
end

5. Пример CI-конвейера на GitHub Actions

.github/workflows/ci.yml

name: React Native CI
on:
push:
branches: \[main, develop\]
jobs:
build-android:
runs-on: ubuntu-latest
steps:
\- uses: actions/checkout@v3
\- uses: actions/setup-node@v3
with:
node-version: 18
\- run: yarn install
\- run: yarn lint
\- run: yarn test
\- run: cd android && ./gradlew assembleRelease
build-ios:
runs-on: macos-latest
steps:
\- uses: actions/checkout@v3
\- run: yarn install
\- run: yarn lint
\- run: yarn test
\- run: cd ios && xcodebuild -workspace App.xcworkspace -scheme App -sdk iphoneos -configuration Release archive

6. Подпись приложений

Android:

  • Использовать keystore, настроенный в gradle.properties

  • Передавать файл через секреты CI/CD

  • Подписывать .apk или .aab автоматически

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=\*\*\*\*\*
MYAPP_RELEASE_KEY_PASSWORD=\*\*\*\*\*

iOS:

  • Использовать match от Fastlane или manual signing

  • Хранить .p12 сертификаты и provisioning profile в Encrypted Cloud (или Git repo)

  • Apple Developer account нужен для автоматизации

7. Разделение по окружениям

  • Конфиги: .env.staging, .env.production

  • Бандлинг: yarn build:staging, yarn build:prod

  • Android flavors: dev, prod в build.gradle

  • iOS схемы: App Dev, App Prod

8. Доставка на устройства

Test Distribution:

  • Android Internal Testing (Google Play)

  • TestFlight (Apple)

  • **Firebase App Distribution
    **

  • **Diawi / App Center / Installr / Expo Go (если Expo)
    **
\# Fastlane
upload_to_testflight
upload_to_play_store(track: "internal")

9. CodePush (для JS-обновлений без стора)

Microsoft App Center поддерживает CodePush:

  • Подключается через react-native-code-push

  • Позволяет обновлять JavaScript-часть (без сборки .apk/.ipa)

  • Можно встроить в Fastlane

appcenter codepush release-react -a user/app -d Production

10. Мониторинг и логирование

  • Sentry — отслеживание ошибок

  • Firebase Crashlytics — для нативных крашей

  • Datadog, Bugsnag — альтернатива

  • CI может отправлять уведомления в Slack / Telegram о сборке

11. Советы по управлению CI/CD в командах

  • Создавать .ci директорию со всеми скриптами

  • Хранить .env файлы вне репозитория, использовать vault или secrets manager

  • Установить правила ветвления: develop → staging, main → production

  • Проводить ревью Fastfile и CI конфигураций

  • Использовать lint-staged, husky, commitlint на client-side

12. Альтернативные решения

EAS Build (Expo)

eas build --platform ios --profile production
eas submit -p ios

Bitrise (визуальный CI)

  • Простая настройка через UI

  • Поддержка React Native, Fastlane, Expo

  • Широкие интеграции: Slack, Firebase, App Store

Codemagic

  • Специализированный CI/CD для Flutter и React Native

  • Отлично подходит для auto-release в App Store / Play Store

Организованный CI/CD-процесс для React Native экономит ресурсы команды, устраняет человеческий фактор и ускоряет релизы. Комбинация Fastlane + GitHub Actions/Bitrise является наиболее гибкой и широко применяемой в индустрии.