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

Зачем нам вообще этот ваш Fastlane
Представьте, что минимум раз в двухнедельный спринт вам необходимо загружать билды вашего React Native приложения для тестирования в Google Play и TestFlight, после чего еще и делать релиз в сторы этих же платформ.
Время сборки .apk(.aab) или .ipa файла занимает в среднем около 5 минут (в случае если вы делаете это на мощной тачке конечно же и у вас оптимизирована сборка под обе платформы). А еще ведь нужно дождаться загрузки в стор, добавить тестировщиков, прописать номер версии и билда, добавить описание релиза и многое другое.

На все это у разработчика уходит уйма времени, которое можно было бы потратить на что то более полезное, например на настройку автоматических загрузок новых билдов и их публикации в сторы)
Настраиваем окружение и проект
Установить 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 (или семантическое версионирование) — это правила по которым назначаются номера версий вашего приложения. Честно признаться раньше на нашем проекте версионирование было устроено следующим образом — его не было)

Все это периодически вводило тестировщиков со стороны заказчика и самого заказчика в ступор и путало в том, какой тестовый билд к чему относится. Семантическое версионирование решает эту проблему, однако вместе с этим и добавляет головной боли разработчику.
Чтобы решить эту проблему мы будем использовать 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 формате, он автоматически скачается.

- Установите все зависимости для 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» измените идентификатор пакета на свой идентификатор.

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


Инициализируйте Fastlane в папке ios командой bundle exec fastlane init (если установили через Bundle) или fastlane init (если установили локально).
Чтобы сгенерировать ключ для подписи пропишите в папке ios команду:
fastlane match init

Создайте новый приватный репозиторий и добавьте ссылку на него.
Чтобы при каждом релизе не заходить в аккаунт разработчика настроим App Store Connect API Key.
- Создайте App Store Connect API Key на странице Users and Access
- Скачайте созданный 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 по своему усмотрению.