Внедрение непрерывной интеграции и доставки (ci/cd) для приложений React Native
Что такое CI/CD?
Непрерывная интеграция (CI) - это практика автоматической интеграции изменений кода от нескольких участников в общий репозиторий несколько раз в день. Каждая интеграция проверяется автоматизированным набором сборок и тестов, улавливая ошибки на ранней стадии. Непрерывная доставка (CD) основывается на CI, автоматизируя весь процесс выпуска, чтобы каждое изменение, которое проходит все тесты, можно было развернуть в производство нажатием кнопки. Для мобильных приложений это включает в себя создание подписанных сборок, загрузку в магазины приложений и управление каналами распространения, такими как TestFlight или внутренний трек тестирования Google Play.
CI/CD стал краеугольным камнем современной разработки программного обеспечения. В контексте React Native, где приложения должны работать как на iOS, так и на Android, автоматизация каждого шага конвейера снижает ручные накладные расходы и минимизирует несоответствия, характерные для платформы. Без CI/CD команды часто полагаются на одного разработчика для ручной сборки, подписи и загрузки релизов — процесс, подверженный человеческим ошибкам и задержкам.
Почему CI/CD имеет значение для реакции нативных
React Native представляет уникальные проблемы, которые делают CI/CD особенно ценными. Кодовая база написана на JavaScript, но конечный продукт является родным приложением. Это означает, что вам нужно управлять двумя различными системами сборки (Xcode для iOS, Gradle для Android), обрабатывать нативные зависимости, которые могут потребовать конфигураций для конкретной платформы, и перемещаться по процессам обзора магазина приложений. Надежный конвейер гарантирует, что эти сложности обрабатываются последовательно каждый раз.
- Быстрые циклы обратной связи — разработчики получают немедленные результаты тестов, подкладки и статического анализа, часто в течение нескольких минут после нажатия кода.
- Сокращение адской интеграции — Частые слияния с автоматизированной проверкой предотвращают большие, конфликтные слияния.
- Продюсеризируемые сборки — среды CI чистые и настроены с нуля, устраняя проблемы «работы на моей машине».
- Streamlined Releases — Автоматизация представлений в магазине приложений (снимки экрана, метаданные, подписи) сокращает циклы выпуска от дней до часов.
- Более высокое качество кода — Автоматизированные проверки обеспечивают соблюдение стандартов кодирования, порогов охвата тестов и бюджетов производительности.
Несмотря на эти преимущества, многие команды React Native начинают без CI/CD, потому что его настройка требует понимания нативного инструментария, фастлейна и подписи на платформе. Инвестиции окупаются быстро, особенно по мере роста команды.
Основные компоненты трубопровода CI/CD для реакционного натива
Каждый трубопровод должен включать следующие этапы, заказанные от самого быстрого до самого медленного. Неудачи на ранних этапах трубопровода должны прекратить выполнение для экономии ресурсов.
Контроль версий и стратегия ветвления
Ясная модель ветвления является основой. GitFlow (функция, разработка, выпуск, ветви исправления) хорошо работает для более крупных команд с запланированными выпусками. Разработка на основе Trunk (краткосрочные ветви, сливающиеся в основные несколько раз в день) подходит командам, стремящимся к постоянному развертыванию. Что бы вы ни выбрали, убедитесь, что ваши CI-триггеры на тянет запросы для проверки изменений перед слиянием.
Большинство систем CI позволяют определять правила для каждой ветви — например, запускать только единичные тесты на ветвях функций, но полные интеграционные тесты и бета-развертывания на основной ветви.
Автоматическое тестирование
Тестирование является сердцем CI. Для React Native рекомендуется многоуровневый подход:
- Единичные тесты — Используйте Jest (уже в комплекте с React Native) для проверки бизнес-логики, редукторов и функций полезности.
- Интеграционные тесты — Тестовые взаимодействия между компонентами и сервисами. Библиотека реагирования на нативное тестирование помогает визуализировать компоненты и утверждать поведение.
- Сквозные (E2E) тесты — Используйте Detox (для мобильных устройств) или Maestro для моделирования реальных сценариев пользователей на симуляторах/эмуляторах. Тестирование E2E происходит медленнее, но улавливает регрессии, которые пропускают единичные тесты.
- Тестирование снимков — Обнаруживайте непреднамеренные изменения пользовательского интерфейса, сравнивая отданный результат с сохраненными снимками. Используйте с осторожностью, поскольку снимки могут стать тяжелыми для обслуживания.
Настройте свой CI, чтобы не выполнить сборку, если какой-либо тест не пройдет. Рассмотрите возможность установки порогов покрытия для обеспечения качественных ворот.
Построить автоматизацию
Создание приложения React Native для производства требует подписания и подготовки конкретных результатов для платформы (IPA для iOS, APK / AAB для Android). fastlane является фактическим стандартом для автоматизации этих шагов. Он обрабатывает подписание кода, скриншоты и даже загрузку в магазины приложений. Типичный конвейер будет работать:
- (использует тренажерный зал) для создания .ipa
- (использует градле) для создания .aab
Для iOS вы должны управлять сертификатами и профилями предоставления. Используйте матч Fastlane для безопасного хранения и синхронизации подписывающих активов между членами команды и компьютерами CI.
Качество кода и линтинга
Запустите их в CI как можно раньше - они быстро выходят из строя и потребляют мало ресурсов. Для более глубокого анализа интегрируйте SonarQube или CodeClimate для отслеживания запахов кода, дублирования и уязвимостей безопасности. Многие команды также запускают проверку типов TypeScript (]), чтобы поймать ошибки типов.
Управление артефактами и подписание кода
Построить артефакты (подписанные IPA и APK) следует безопасно хранить для распространения. Используйте облачное хранилище (S3, GCS) или выделенный сервис, как App Center (хотя он был амортирован для новых функций). Для iOS для подписания требуются сертификаты и профили предоставления, срок действия которых истекает и должен быть повернут. Автоматическое обновление с использованием фастлейнового соответствия и хранения приватных ключей в секретных переменных CI.
Популярные платформы CI/CD для React Native
Несколько платформ обеспечивают первоклассную поддержку React Native.Ваш выбор зависит от размера команды, бюджета и существующей экосистемы.
- GitHub Actions — Тщательно интегрирован с GitHub. Бесплатный уровень включает 2000 минут/месяц для публичных репозиториев. Обширный рынок действий для React Native, фастлейна и кодового подписания. Лучше всего для команд, уже работающих на GitHub.
- GitLab CI/CD — Встроен непосредственно в GitLab. Предлагает неограниченные минуты для публичных проектов и мощную параллелизацию. Хорошо для команд, предпочитающих единую платформу DevOps.
- CircleCI — Высоко настраиваемая с кэшированием и параллелизмом. сборки iOS требуют бегунов macOS (дополнительно дорогая).Популярность среди мобильных команд благодаря надежной поддержке Docker и macOS.
- Bitrise — Разработан специально для мобильных CI/CD. Предоставляет предварительно сконфигурированные шаги для развертывания React Native, фаст-лейна и магазина приложений. Бесплатный уровень доступен. Отлично подходит для команд, новых для CI/CD.
- Codemagic — Сосредоточен на Flutter и React Native. Предлагает машины для macOS и интегрируется с собственным управлением подписями Codemagic. Хорошая альтернатива для бюджетных команд.
App Center (Microsoft) когда-то был популярным выбором, но теперь находится в режиме обслуживания; рассмотрите возможность перехода на альтернативные платформы.
Шаг за шагом: настройка CI/CD с помощью GitHub Actions
Предположим, что стандартный проект React Native (созданный с помощью ]) хранится на GitHub. Следующий пример устанавливает конвейер для тестирования, создания и развертывания в TestFlight и Google Play.
Workflow файл
Создайте . Определите триггеры: нажмите на основные или отпустите ветви и вытяните запросы.
name: CI/CD Pipeline
on:
push:
branches: [main, release/*]
pull_request:
branches: [main]
Проведение тестов
Используйте среду Node.js. Зависимости кэша для ускорения последующих запусков.
jobs:
test:
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 test -- --coverage
- run: npx eslint .
- run: npx tsc --noEmit
Если какой-либо шаг не срабатывает, работа прекращается, и трубопровод предупреждает разработчика.
Создание для iOS и Android
Для сборки iOS требуются бегуны macOS (GitHub предлагает или ). Android сборки могут работать на Ubuntu, но требуют Android SDK. Используйте отдельные задания для каждой платформы для параллелизации выполнения.
Android Build Job
build-android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: |
cd android && ./gradlew assembleRelease
env:
SIGNING_KEYSTORE: ${{ secrets.ANDROID_KEYSTORE }}
SIGNING_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
SIGNING_STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }}
SIGNING_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
- uses: actions/upload-artifact@v4
with:
name: app-release.aab
path: android/app/build/outputs/bundle/release/app-release.aab
iOS Build Job
build-ios:
runs-on: macos-13
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: bundle install
- run: bundle exec fastlane ios build
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.APP_SPECIFIC_PASSWORD }}
- uses: actions/upload-artifact@v4
with:
name: app.ipa
path: build/ios/App.ipa
Примечание: iOS требует Xcode Command Line Tools, которые предварительно установлены на GitHub macOS бегунов. фастлайн должен быть настроен с , который обрабатывает подписание через матч и строит с тренажерным залом.
Развертывание в App Stores
После создания запустите задания развертывания, которые зависят от рабочих мест сборки. Используйте пилотный фастлан для TestFlight и поставки фастлана для Google Play.
deploy-testflight:
needs: [build-ios, test]
runs-on: macos-13
steps:
- uses: actions/checkout@v4
- run: bundle install
- run: bundle exec fastlane ios upload_to_testflight
env:
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.APP_SPECIFIC }}
deploy-playstore:
needs: [build-android, test]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: bundle install
- run: bundle exec fastlane android deploy_to_playstore
env:
PLAY_STORE_JSON_KEY: ${{ secrets.PLAY_STORE_JSON_KEY }}
Для выпуска продукции добавьте шаг ручного утверждения или только триггер на тегах.
Лучшие практики для React Native CI/CD
- Кэш агрессивно — Узел кэша модулей, CocoaPods, кэши Gradle и пакеты Homebrew. Храните их на основе хэша замков. Это может сократить время сборки на 50% и более.
- Использовать переменные среды и секреты — Никогда не расшифровывайте ключи API, подписывайте учетные данные или токены.
- Параметризовать сборки — использовать переменные среды для дифференциации между постановочными и производственными сборками (например, конечные точки API, идентификаторы пакетов).
- Проведение испытаний параллельно — Сплит-тесты для нескольких заданий или использование тестового шардинга (поддерживаемого Jest с и ).
- Тщательно обрабатывайте нативные зависимости — Если вы используете библиотеки с нативным кодом (например, реактивно-родной камерой), убедитесь, что ваш CI имеет необходимые системные зависимости (например, OpenCV) предварительно установлен.
- Соображения Монорепо — При использовании монорепо (Nx, Turborepo), настройте CI для обнаружения измененных пакетов и только для создания/тестирования затронутых.
- Запись и оповещение — отслеживайте продолжительность сборки, частоту отказов и тенденции охвата тестов. Настройте уведомления (Slack, email) для неисправных трубопроводов.
Обычные подводные камни и как их избежать
- Долгое время сборки — Оптимизируйте путем кэширования и параллелизации заданий. Используйте бегуны macOS только для сборок iOS; используйте Linux для Android и тестирования.
- Некачественные тесты — Особенно тесты E2E на CI. Используйте механизмы повторного использования или пометьте их как неблокирующие. Предпочтите встроенный повторный тест Detox. Убедитесь, что симуляторы / эмуляторы чистые.
- Сертификат и срок действия профиля предоставления — Используйте фастлейн-матч с репо Git или облачным хранилищем. Установите напоминания календаря для ротации сертификатов до истечения срока действия. Автоматическое обновление с использованием флага матча в ежемесячной работе cron.
- iOS проблемы с подписью в CI — Общие подводные камни: неправильный профиль обеспечения, несоответствие между идентификатором пакета и профилем, истекший закрытый ключ.
- Потеря хранилища ключей Android — Сохраняйте резервные копии своего хранилища ключей выпуска. Если они потеряны, вы не можете обновить приложение. Используйте секреты CI для его хранения, но также сохраняйте локальную резервную копию в безопасном месте.
- Несоответствия версий зависимости — Pin-версии в и . Используйте замочные файлы и совершайте их. CI всегда должен устанавливаться из замочных файлов вместо .
Измерение успеха
Отслеживайте следующие показатели для оценки вашего трубопровода:
- Время строительства — общее время от совершения сделки до артефакта. Цель — менее 30 минут для полного конвейера.
- Частота развертывания — Как часто вы выпускаете? Хороший конвейер CI/CD должен включать по крайней мере еженедельные выпуски для мобильных приложений.
- Скорость отказа — Процент сборок, которые терпят неудачу.Исследуйте повторяющиеся неудачи для улучшения стабильности.
- Время для обратной связи — Сколько времени требуется разработчику, чтобы увидеть результаты CI? Менее 10 минут для единичных тестов отлично.
- Тестовое покрытие — отслеживайте тенденции, а не абсолютные цифры. Внезапное падение указывает на новый непроверенный код.
Используйте эти показатели для выявления узких мест и итерации на вашем конвейере. Например, если сборка iOS занимает 45 минут, рассмотрите кэширование CocoaPods и использование бегунов macOS M1 для более быстрой компиляции.
Заключение
Внедрение CI/CD для приложений React Native - это не только автоматизация - это создание надежного, воспроизводимого процесса доставки, который масштабируется с вашей командой. Интегрируя тестирование, создание, подписание и развертывание в единый конвейер, вы снижаете риск, ускоряете выпуски и позволяете разработчикам сосредоточиться на функциях. Начните с малого: сначала включите подкладку и единичные тесты, затем добавьте сборки и, наконец, автоматизируйте развертывания. По мере созревания вашего трубопровода, включите тесты E2E, ворота качества кода и мониторинг.
Инструменты и шаблоны, описанные здесь — GitHub Actions, fastlane, Detox и надлежащее кэширование — проверены в бою в производстве командами, отправляющими миллионы загрузок. Их принятие превратит ваш рабочий процесс разработки из ручных, подверженных ошибкам релизов в плавный, непрерывный поток высококачественных обновлений.
Для дальнейшего чтения, обратитесь к Официальной документации CI/CD React Native и CircleCI Руководство для React Native.