Android
Fastlane
Поиск…
замечания
Fastlane - это инструмент для разработчиков iOS, Mac и Android для автоматизации утомительных задач, таких как создание скриншотов, настройка профилей подготовки и выпуск приложения.
Документы: https://docs.fastlane.tools/
Исходный код: https://github.com/fastlane/fastlane
Fastfile для создания и загрузки нескольких вариантов для бета-версии Crashlytics
Это пример настройки Fastfile для приложения с несколькими вкусами . Это дает вам возможность создавать и внедрять все вкусы или один аромат. После развертывания он сообщает Slack о статусе развертывания и отправляет уведомление тестировщикам в бета-тестировании группой тестировщиков Crashlytics.
Чтобы создавать и развертывать все варианты, используйте:
fastlane android beta
Для создания одного APK и развертывания используйте:
fastlane android beta app:flavorName
Используя один файл Fastlane, вы можете управлять приложениями iOS, Android и Mac. Если вы используете этот файл только для одной platform
приложения, не требуется.
Как это устроено
- аргумент
android
говорит fastlane, что мы будем использовать:android
платформу:android
. - Внутри платформы
:android
вы можете иметь несколько полос движения. В настоящее время у меня есть только:beta
лейн. Второй аргумент из приведенной выше команды указывает полосу, которую мы хотим использовать. -
options[:app]
- Есть две задачи Gradle . Во-первых, он работает с
gradle clean
. Если вы предоставили аромат с ключомapp
, fastfile запускаетgradle assembleReleaseFlavor
. В противном случае он запускаетgradle assembleRelease
для создания всехgradle assembleRelease
. - Если мы строим для всех ароматов, массив сгенерированных имен файлов APK хранится внутри
SharedValues::GRADLE_ALL_APK_OUTPUT_PATHS
. Мы используем это для циклического создания сгенерированных файлов и развертывания их в Beta с помощью Crashlytics . поляnotifications
иgroups
являются необязательными. Они используются для уведомления тестеров, зарегистрированных для приложения на бета-версии Crashlytics . - Если вы знакомы с Crashlytics, вы можете знать, что для активации приложения на портале вы должны запустить его на устройстве и использовать его в первую очередь. В противном случае Crashlytics будет считать приложение неактивным и выдает ошибку. В этом случае я фиксирую его и сообщаю Slack как провал, поэтому вы узнаете, какое приложение неактивно.
- Если развертывание будет успешным, fastlane отправит сообщение успеха Slack .
-
#{/([^\/]*)$/.match(apk)}
это регулярное выражение используется для получения имени аромата из пути APK. Вы можете удалить его, если он не работает для вас. -
get_version_name
иget_version_code
- два плагина Fastlane для получения имени и кода версии приложения. Вы должны установить эти драгоценные камни, если хотите, или их можно удалить. Подробнее о плагинах здесь. - Оператор
else
будет выполнен, если вы создаете и развертываете один APK. Нам не нужно предоставлятьapk_path
для Crashlytics, так как у нас есть только одно приложение. -
error do
блок в конце используется для получения уведомления, если что-то еще не работает во время выполнения.
Заметка
Не забудьте заменить SLACK_URL
, API_TOKEN
, GROUP_NAME
и BUILD_SECRET
своими собственными учетными данными.
fastlane_version "1.46.1"
default_platform :android
platform :android do
before_all do
ENV["SLACK_URL"] = "https://hooks.slack.com/servic...."
end
lane :beta do |options|
# Clean and build the Release version of the app.
# Usage `fastlane android beta app:flavorName`
gradle(task: "clean")
gradle(task: "assemble",
build_type: "Release",
flavor: options[:app])
# If user calls `fastlane android beta` command, it will build all projects and push them to Crashlytics
if options[:app].nil?
lane_context[SharedValues::GRADLE_ALL_APK_OUTPUT_PATHS].each do | apk |
puts "Uploading APK to Crashlytics: " + apk
begin
crashlytics(
api_token: "[API_TOKEN]",
build_secret: "[BUILD_SECRET]",
groups: "[GROUP_NAME]",
apk_path: apk,
notifications: "true"
)
slack(
message: "Successfully deployed new build for #{/([^\/]*)$/.match(apk)} #{get_version_name} - #{get_version_code}",
success: true,
default_payloads: [:git_branch, :lane, :test_result]
)
rescue => ex
# If the app is inactive in Crashlytics, deployment will fail. Handle it here and report to slack
slack(
message: "Error uploading => #{/([^\/]*)$/.match(apk)} #{get_version_name} - #{get_version_code}: #{ex}",
success: false,
default_payloads: [:git_branch, :lane, :test_result]
)
end
end
after_all do |lane|
# This block is called, only if the executed lane was successful
slack(
message: "Operation completed for #{lane_context[SharedValues::GRADLE_ALL_APK_OUTPUT_PATHS].size} app(s) for #{get_version_name} - #{get_version_code}",
default_payloads: [:git_branch, :lane, :test_result],
success: true
)
end
else
# Single APK upload to Beta by Crashlytics
crashlytics(
api_token: "[API_TOKEN]",
build_secret: "[BUILD_SECRET]",
groups: "[GROUP_NAME]",
notifications: "true"
)
after_all do |lane|
# This block is called, only if the executed lane was successful
slack(
message: "Successfully deployed new build for #{options[:app]} #{get_version_name} - #{get_version_code}",
default_payloads: [:git_branch, :lane, :test_result],
success: true
)
end
end
error do |lane, exception|
slack(
message: exception.message,
success: false,
default_payloads: [:git_branch, :lane, :test_result]
)
end
end
end
Fastfile для создания и установки всех вариантов для данного типа сборки на устройство
Добавьте эту полосу в свой Fastfile и запустите fastlane installAll type:{BUILD_TYPE}
в командной строке. Замените BUILD_TYPE
на тип сборки, который вы хотите построить.
Например: fastlane installAll type:Debug
Эта команда построит все варианты данного типа и установит его на ваше устройство. В настоящее время он не работает, если у вас установлено более одного устройства. Убедитесь, что у вас есть только один. В будущем я планирую добавить опцию для выбора целевого устройства.
lane :installAll do |options|
gradle(task: "clean")
gradle(task: "assemble",
build_type: options[:type])
lane_context[SharedValues::GRADLE_ALL_APK_OUTPUT_PATHS].each do | apk |
puts "Uploading APK to Device: " + apk
begin
adb(
command: "install -r #{apk}"
)
rescue => ex
puts ex
end
end
end