Перевод статьи подготовлен в преддверии старта курса «Flutter Mobile Developer».
Следуйте лучшим практикам непрерывного развертывания (continuous delivery — CD) вместе с Flutter, чтобы ваше приложение было непременно доставлено вашим бета-тестерам и проверялось на регулярной основе без необходимости прибегать к ручным манипуляциям.
В этом руководстве показано, как интегрировать fastlane (набор инструментов с открытым исходным кодом) в существующие рабочие процессы тестирования и непрерывной интеграции (continuous integration — CI), например, Travis или Cirrus.
Local setup
Перед переходом в облачную систему настоятельно рекомендуется протестировать процесс сборки и развертывания локально. Вы также можете реализовать непрерывное развертывание с локального компьютера.
Теперь вы готовы выполнять развертывание локально или переносить процесс развертывания в систему непрерывной интеграции (CI).
Сначала проследуйте инструкциям в разделе локальной настройки, описанном в разделе «Локальная настройка», чтобы убедиться, что процесс работает корректно, прежде чем переходить на облачную систему, такую как Travis.
Главное, на что следует обратить внимание — это то, что, поскольку облачные инстансы эфемерны и ненадежны, вы не должны оставлять свои учетные данные, такие как JSON учетной записи службы Play Store или сертификат распространения iTunes на сервере.
Системы непрерывной интеграции (CI), такие как Cirrus, обычно поддерживают зашифрованные переменные среды для хранения приватных данных.
Примите все меры предосторожности, чтобы не выводить значения этих переменных на консоль в ваших тестовых скриптах. Эти переменные также не должны быть доступны в пул-реквестах, пока они не будут смержены, чтобы злоумышленники не могли создать пул-реквест, который умыкнет эти секреты. Будьте осторожны при взаимодействии с этими секретами в пул-реквестах, которые вы принимаете и мержите.
Следуйте лучшим практикам непрерывного развертывания (continuous delivery — CD) вместе с Flutter, чтобы ваше приложение было непременно доставлено вашим бета-тестерам и проверялось на регулярной основе без необходимости прибегать к ручным манипуляциям.
fastlane
В этом руководстве показано, как интегрировать fastlane (набор инструментов с открытым исходным кодом) в существующие рабочие процессы тестирования и непрерывной интеграции (continuous integration — CI), например, Travis или Cirrus.
Local setup
Перед переходом в облачную систему настоятельно рекомендуется протестировать процесс сборки и развертывания локально. Вы также можете реализовать непрерывное развертывание с локального компьютера.
- Установите fastlane:
gem install fastlane
илиbrew install fastlane
. Для получения более развернутой информации посетите документацию Fastlane. - Создайте проект Flutter и, когда он будет готов, убедитесь, что ваш проект собирается посредством
-
flutter build appbundle
; и -
flutter build ios --release --no-codesign
.
-
- Инициализируйте проекты Fastlane для каждой платформы.
- Запустите
fastlane init
в каталоге[project]/android
. - Запустите
fastlane init
в каталоге[project]/ios
.
- Запустите
- Убедитесь, что
Appfile
ы содержат адекватные метаданные для вашего приложения.
- Убедитесь, что
package_name
в[project]/android/fastlane/Appfile
совпадает с именем вашего пакета вAndroidManifest.xml
. - Убедитесь, что
[project]/ios/fastlane/Appfile
также соответствует идентификатору пакетаInfo.plist
. Внесите вapple_id
,itc_team_id
,team_id
данные вашей учетной записи.
- Убедитесь, что
- Настройте локальные учетные данные для входа в сторы.
- Следуйте настройке Supply и убедитесь, что
fastlane supply init
успешно синхронизирует данные с вашей Play Store консоли. Относитесь к .json файлу как к своему паролю и не храните его в каких-либо общедоступных репозиториях систем контроля версий. - Ваш юзернейм ITunes Connect уже находится в ваших
Appfile
ах в полеapple_id
. Запишите в переменную средыFASTLANE_PASSWORD
ваш пароль iTunes Connect. В противном случае он будет запрашиваться при загрузке в iTunes/TestFlight.
- Следуйте настройке Supply и убедитесь, что
- Настройте цифровую подпись кода.
- В Android есть два ключа для подписи: ключ развертывания и ключ загрузки. Конечные пользователи загружают .apk, подписанный «ключом развертывания». «Ключ загрузки» используется для аутентификации .aab/.apk, загружаемого разработчиками в Play Store, и переподписывается ключом развертывания по завершению загрузки в Play Store.
- Для ключа развертывания настоятельно рекомендуется использовать автоматическую подпись, которая управляется облаком. Для получения дополнительной информации см. официальную документацию Play Store.
- Чтобы создать ключ загрузки следуйте инструкции по генерации ключа.
- Настройте gradle на использование ключа загрузки во время создания билда приложения в режиме release, отредактировав
android.buildTypes.release
в[project]/android/app/build.gradle
.
- В iOS, когда вы будете готовы к тестированию и развертыванию с помощью TestFlight или App Store, создайте и подпишите приложение, используя сертификат распространения вместо сертификата разработки.
- Создайте и загрузите сертификат распространения в консоли Apple Developer Account.
- откройте
[project]/ios/Runner.xcworkspace/
и выберите сертификат распространения на панели настроек вашей цели.
- В Android есть два ключа для подписи: ключ развертывания и ключ загрузки. Конечные пользователи загружают .apk, подписанный «ключом развертывания». «Ключ загрузки» используется для аутентификации .aab/.apk, загружаемого разработчиками в Play Store, и переподписывается ключом развертывания по завершению загрузки в Play Store.
- Создайте скрипт
Fastfile
для каждой платформы.
- Для Android следуйте руководству по развертыванию бета-версии Fastlane Android. Все редактирование может заключаться всего лишь в добавлении
lane
, которая вызываетupload_to_play_store
. Установите значение аргументаaab
в../build/app/outputs/bundle/release/app-release.aab
, чтобы использовать пакет, которыйflutter build
уже подготовил. - Для iOS следуйте руководству по развертыванию бета-версии Fastlane iOS. Все редактирование может заключаться всего лишь в добавлении
lane
, которая вызываетbuild_ios_app
сexport_method: 'app-store'
иupload_to_testflight
. В iOS потребуется дополнительный билд, посколькуflutter build
создает.app
, а не архивирует.ipas
для релиза.
- Для Android следуйте руководству по развертыванию бета-версии Fastlane Android. Все редактирование может заключаться всего лишь в добавлении
Теперь вы готовы выполнять развертывание локально или переносить процесс развертывания в систему непрерывной интеграции (CI).
Выполнение развертывания локально
- Создайте приложение в режиме release.
-
flutter build appbundle
. -
flutter build ios --release --no-codesign
. Сейчас не нужно подписывать, так как fastlane будет осуществлять подпись при архивировании.
-
- Запустите скрипт Fastfile на каждой платформе.
-
cd android
, затемfastlane [название созданной вами lane]
. -
cd ios
, затемfastlane [название созданной вами lane]
.
-
Настройка сборки и развертывания в облаке
Сначала проследуйте инструкциям в разделе локальной настройки, описанном в разделе «Локальная настройка», чтобы убедиться, что процесс работает корректно, прежде чем переходить на облачную систему, такую как Travis.
Главное, на что следует обратить внимание — это то, что, поскольку облачные инстансы эфемерны и ненадежны, вы не должны оставлять свои учетные данные, такие как JSON учетной записи службы Play Store или сертификат распространения iTunes на сервере.
Системы непрерывной интеграции (CI), такие как Cirrus, обычно поддерживают зашифрованные переменные среды для хранения приватных данных.
Примите все меры предосторожности, чтобы не выводить значения этих переменных на консоль в ваших тестовых скриптах. Эти переменные также не должны быть доступны в пул-реквестах, пока они не будут смержены, чтобы злоумышленники не могли создать пул-реквест, который умыкнет эти секреты. Будьте осторожны при взаимодействии с этими секретами в пул-реквестах, которые вы принимаете и мержите.
- Сделайте учетные данные эфемерными.
- В Android:
- Удалите поле
json_key_file
изAppfile
и сохраните содержимое JSON строки в зашифрованном переменной вашей CI системы. Используйте аргументjson_key_data
вupload_to_play_store
, чтобы прочитать переменную среды непосредственно в вашемFastfile
. - Сериализуйте свой ключ загрузки (например, используя base64) и сохраните его как зашифрованную переменную среды. Вы можете десериализовать его в своей системе CI на этапе установки с помощью
-
echo "$PLAY_STORE_UPLOAD_KEY" | base64 --decode > /home/cirrus/[directory # и имя файла, указанное в вашем gradle].keystore
- Удалите поле
- В iOS:
- Переместите локальную переменную среды
FASTLANE_PASSWORD
для использования зашифрованных переменных сред в системе CI. - Системе CI требуется доступ к вашему сертификату распространения. Рекомендуется использовать систему Fastlane Match для синхронизации ваших сертификатов на разных машинах.
- Переместите локальную переменную среды
- В Android:
- Рекомендуется использовать Gemfile вместо использования индетерминированного
gem install fastlane
в системе CI, чтобы гарантировать стабильность и воспроизводимость зависимостей fastlane между локальными и облачными машинами каждый раз. Однако этот шаг не является обязательным.
- В обоих
[project]/android
и[project]/ios
папках создайте Gemfile, содержащий следующее содержимое: -
source "https://rubygems.org" gem "fastlane"
- В обоих каталогах запустите
bundle update
и внеситеGemfile.
иGemfile.lock
в систему контроля версий. - При локальном запуске используйте
bundle exec fastlane
вместоfastlane
.
- В обоих
- Создайте тестовый скрипт CI, например
.travis.yml
или.cirrus.yml
, в корне репозитория.
- Сегментируйте свой скрипт для работы на платформах Linux и macOS.
- Не забудьте указать зависимость от Xcode для macOS (например, o
sx_image: xcode9.2
). - См. документацию Fastlane по CI для настройки конкретной CI.
- На этапе установки, в зависимости от платформы, убедитесь, что:
- Bundler доступен с помощью
gem install bundler
. - Для Android убедитесь, что Android SDK доступен и указан путь
ANDROID_SDK_ROOT
. - Запустите
bundle install
в[project]/android
или[project]/ios
. - Убедитесь, что Flutter SDK доступен и установлен в
PATH
.
- Bundler доступен с помощью
- На скриптовом этапе задачи CI:
- Запустите приложение
flutter build appbundle
илиflutter build ios --release --no-codesign
, в зависимости от платформы. cd android
илиcd ios
bundle exec fastlane [имя lane]
Ссылки
См. скрипт Cirrus для репозитория фреймворка Flutter.
Другие службы
Ниже приведены некоторые другие варианты, которые помогут автоматизировать развертывание вашего приложения.
- Codemagic CI/CD для Flutter
- Flutter CI/CD с Bitrise
- Appcircle CI/CD для Flutter
- GitHub Actions- CI/CD от GitHub
А здесь пример проекта - Запустите приложение