Настройка Fastlane в React Native приложениях
Клиент: Автошкола "Вектор"

Задача
Ручная сборка и загрузка React Native билдов в Google Play и TestFlight, отсутствие единого процесса релиза и путаница с версионированием.
Решение
Решение внедрение инструмента Fastlane для автоматизации жизненного цикла сборки и доставки приложения под iOS и Android.

Вдохновением для этой статьи послужил недавний перевод приложения заказчика на новую версию React Native (0.82). Вместе с тем мы решили отойти от старого способа вручную загружать билды в Google Play и TestFlight и перейти на Fastlane. 

В процессе настройки я так и не смог найти толковую инструкцию(гайд) по настройке Fastlane, тем более заточенную конкретно под React Native проекты. Потому погрузившись в эту тему решил написать эту статью для членов нашей команды и всех кому может быть полезна эта тема. 

Настройка Fastlane в React Native приложениях

Зачем нам вообще этот ваш Fastlane

Представьте, что минимум раз в двухнедельный спринт вам необходимо загружать билды вашего React Native приложения для тестирования в Google Play и TestFlight, после чего еще и делать релиз в сторы этих же платформ. 

Время сборки .apk(.aab) или .ipa файла занимает в среднем около 5 минут (в случае если вы делаете это на мощной тачке конечно же и у вас оптимизирована сборка под обе платформы). А еще ведь нужно дождаться загрузки в стор, добавить тестировщиков, прописать номер версии и билда, добавить описание релиза и многое другое.

Настройка Fastlane в React Native приложениях

На все это у разработчика уходит уйма времени, которое можно было бы потратить на что то более полезное, например на настройку автоматических загрузок новых билдов и их публикации в сторы) 

 

Настраиваем окружение и проект 

Установить Fastlane можно следующими способами: 

Bundler

Этот способ рекомендуется официальной документацией Fastlane.

Установите сам Bundler

gem install bundler

В папках android и ios создайте файлы ./Gemfile со следующим содержимым: 

source «https://rubygems.org»

gem «fastlane» 

Запустите скрипт bundle update и добавьте файлы ./Gemfile и ./Gemfile.lock в git. 

Homebrew (macOS)

Для macOS юзеров, которые не хотят устанавливать Ruby и Fastlane локально можно использовать Homebrew
brew install fastlane

Установить fastlane локально

sudo gem install fastlane

 

Что такое SemVer и зачем он нужен вашему приложению

SemVer (или семантическое версионирование) — это правила по которым назначаются номера версий вашего приложения. Честно признаться раньше на нашем проекте версионирование было устроено следующим образом — его не было) 

Настройка Fastlane в React Native приложениях

Все это периодически вводило тестировщиков со стороны заказчика и самого заказчика в ступор и путало в том, какой тестовый билд к чему относится. Семантическое версионирование решает эту проблему, однако вместе с этим и добавляет головной боли разработчику. 

Чтобы решить эту проблему мы будем использовать npm пакет semantic-release — инструмент, который полностью автоматизирует процесс выпуска версий приложения, используя формат сообщений коммитов (по стандарту Conventional Commits) для определения типа изменений и последующего обновления версий проекта, генерации changelog и публикации этого билда.

Установите semantic-release в dev зависимости вашего проекта 

yarn add -D semantic-release

И настройте файл .releaserc примерно таким образом

{

  «branches»: [

    «master»,

  ],

  «plugins»: [

    [

      «@semantic-release/commit-analyzer»,

      {

        «preset»: «angular»

      }

    ],

    «@semantic-release/release-notes-generator»,

    «@semantic-release/changelog»,

    [

      «@semantic-release/exec»,

      {

        «prepareCmd»: «NEXT_RELEASE_VERSION=${nextRelease.version} node scripts/sync-version.js»

      }

    ],

    [

      «@semantic-release/git»,

      {

        «assets»: [

          «package.json»,

          «CHANGELOG.md»,

          «ios/YourApp/Info.plist»,

          «android/app/build.gradle»

        ],

        «message»: «chore(release): ${nextRelease.version} [skip ci]»

      }

    ]

  ]

 

Добавьте скрипт в package.json 

«release:semantic»: «semantic-release —no-ci»,

Настройка Android

Предварительные требования

Перед тем как продолжить, убедитесь, что у вас есть:

  • Аккаунт разработчика Google Play Console.
  • Приложение, созданное в Google Play Console (в отличие от iOS, Fastlane не может сделать это за вас).
  • Корректный файл .gitignore.
  • Собранные Google Credentials (учетные данные Google).

⚠️ В Google Play Console добавьте параметр &hl=en в конец URL (перед любым #), чтобы переключить интерфейс на английский язык. В некоторых языках кнопка «Create Service Account» может быть недоступна. Скачайте JSON-файл ключа и поместите его в my-project/android/key.json.

На некоторых аккаунтах вы не сможете открыть Service Account даже так, в таком случае вы можете создать Service Account через Google Cloud -> IAM & Admin -> Service Accounts. Создайте Service Account и сгенерируйте ключ в JSON формате, он автоматически скачается.

Настройка Fastlane в React Native приложениях

  • Установите все зависимости для macOS и Android. 

Инициализируйте Fastlane в папке android командой bundle exec fastlane init (если установили через Bundle) или fastlane init (если установили локально). 

Теперь нужно сгенерировать ключ для подписи приложения в Google Play следующей командой: 

keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

Она сгенерирует хранилище ключей в виде файла с именем my-release-key.keystore.

Примечание. Не забудьте сохранить файл хранилища и добавить его в .gitignore.

Скопируйте сгенерированный файл my-release-key.keystore в корневую папку android. 

 

Настройка Fastfile

Теперь откройте файл Fastfile и добавьте следующий код: 

default_platform(:android)

platform :android do

 desc «Push a new beta build to Internal Testing in Google Play»

 lane :beta do

   gradle(task: «bundle», build_type: «Release»)

   upload_to_play_store(

     track: «internal»,

     aab: «app/build/outputs/bundle/release/app-release.aab»,

     skip_upload_apk: true,

   )

 end

end 

 

Настройка iOS 

Предварительные требования 

Прежде чем продолжить, убедитесь, что у вас есть:

  •  Установите все необходимые зависимости с помощью Xcode и CocoaPods. 
  •  Выберите идентификатор пакета вашего приложения (например, com.tcm.boilerplate).
  • Аккаунт разработчика AppStore. 
  • Используйте правильный файл .gitignore. 
  • Вам также необходимо создать значок приложения, чтобы использовать Fastlane, иначе при запуске fastlane beta вы получите ошибку. 

Откройте свой проект Xcode и измените некоторую информацию:

  • На вкладке «General» в разделе «Identity» измените идентификатор пакета на свой идентификатор.

Настройка Fastlane в React Native приложениях

  • На вкладке «Signing & Capabilities» в разделе «Signing» отключите «Automatically manage signing». 
  • На вкладке «Build Settings» установите фильтр просмотра вверху на «All» и «Combined», затем перейдите в раздел «Signing» и в «Code Signing Identity» установите «Don’t Code Sign» для debug и «iOS Distribution» для release. 

Настройка Fastlane в React Native приложениях

Настройка Fastlane в React Native приложениях

Инициализируйте Fastlane в папке ios командой bundle exec fastlane init (если установили через Bundle) или fastlane init (если установили локально). 

Чтобы сгенерировать ключ для подписи пропишите в папке ios команду: 

fastlane match init

Настройка Fastlane в React Native приложениях

Создайте новый приватный репозиторий и добавьте ссылку на него. 

Чтобы при каждом релизе не заходить в аккаунт разработчика настроим App Store Connect API Key. 

  1. Создайте App Store Connect API Key на странице Users and Access 
  2. Скачайте созданный API Key file (.p8)

Поместите API Key file в папку ios/fastlane и скопируйте key_id и issuer_id. При желании их можно вынести в Appfile. 

Настройка Fastfile 

Теперь откройте Fastfile и добавьте туда следующий код: 

default_platform(:ios)

platform :ios do

 desc «Push a new beta build to TestFlight»

 lane :beta do

   api_key = app_store_connect_api_key(

     key_id: “key_id”, 

     issuer_id: “issuer_id”, 

     key_filepath: “./fastlane/key_filepath.p8” 

   )

   match(type: «appstore», readonly: false, api_key: api_key)

   build_app(

     workspace: “YourApp.xcworkspace”, 

     scheme: “YourApp”, 

     clean: true,

     export_method: «app-store»,

     destination: «generic/platform=iOS»

   )

   upload_to_testflight(

     api_key: api_key,

   )

 end

end

 

Итоги 

В итоге мы полностью подготовили окружение и настроили базовый Fastlane, для сборки релизов в Google Play и Testflight. Далее вы можете ознакомиться с официальной документацией Fastlane и доработать Fastfile по своему усмотрению. 

Получить бесплатный аудит
Получить
Напишите нам