部署
Skip 应用项目会通过将 gradle 进程作为 Xcode 构建过程中 Run Scripts 阶段的一部分来启动,从而构建并运行应用的 Android 版本。这种机制使开发者能够通过在 iOS 模拟器和 Android 模拟器中同时运行 iOS 和 Android 版本来快速迭代应用。同样,Skip 框架测试会通过在转译后的模块上运行 gradle test 来执行转译后的 Kotlin 测试用例。
导出构建产物
Section titled “导出构建产物”在项目目录中从终端运行 skip export 命令将构建你的 Skip 框架或应用,并将所有二进制产物导出到 -d 参数指定的文件夹中。这包括当前项目中每个目标的 .aar 库归档文件,以及所有依赖的归档文件。这些二进制产物可用于任何 Kotlin 或 Java 构建流程或 IDE。例如,Kotlin 开发团队可以手动将它们添加到 Android Studio 项目中,以便使用 Skip 创建的共享数据模型。
对于应用项目,skip export 命令还会额外导出应用的 .apk 和 .aab 归档文件,可以直接安装到 Android 设备上或上传到 Android 应用商店(如 Google Play 商店)。
签名导出的 Android 产物
Section titled “签名导出的 Android 产物”调试 APK(.build/skip-export/AppName-debug.apk)使用临时密钥签名。你可以将其安装到模拟器或设备上进行测试,但在安装更新版本之前需要先卸载它(与可以就地升级的生产应用不同)。
发布 APK(.build/skip-export/AppName.apk)默认未签名。你必须在通过 Play 商店分发或安装到设备之前对其进行签名。你可以将签名集成到 CI 工作流中,也可以使用项目 Android/app/build.gradle.kts 中的内置支持,它会在 Android/app/ 文件夹中查找 keystore.properties 和 keystore.jks 文件。
有关创建和管理 Android 签名密钥的完整信息,请参阅签署你的应用 ↗文档。但为了快速上手,你可以通过从项目根目录运行以下命令并按照提示操作来创建 Android/app/keystore.jks 文件:
keytool -genkeypair -v -keystore Android/app/keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias app记住你为密钥库和密钥本身设置的密码,然后创建一个新的 Android/app/keystore.properties 文件,内容如下:
keyAlias=appstoreFile=keystore.jksstorePassword=PASSWORDkeyPassword=PASSWORD这些文件就位后,运行 skip export 将自动签名发布版 .apk 文件,使你能够直接分发和运行应用的发布版本,而无需通过 Google Play 商店。
apksigner 命令行工具(位于 ~/Library/Android/sdk/build-tools/*/apksigner)可用于验证 .apk 文件的签名。
有关该命令的详细信息,请参阅skip export CLI 参考。
手动运行 Gradle
Section titled “手动运行 Gradle”除了 skip export,Skip 应用项目在 Android/ 文件夹中还包含一个 gradle 项目,可以直接使用 gradle 命令运行。这对于手动执行 gradle 任务很有用,例如使用 launchDebug 任务在模拟器或已配置的设备上启动应用:
skipapp-showcase % gradle -p Android launchDebug要发布 Android 应用,你可能需要自己执行构建,可以手动操作或作为持续集成(CI)流程的一部分。要从终端构建应用的发布版本,可以运行:
gradle -p Android/ assemble这将运行 Android/gradle.settings.kts 文件中指定的 Gradle 项目(Showcase 源代码 ↗),它会调用 Swift Package Manager 来为 Android 构建项目。构建产物可以在 .build/Android/ 文件夹中找到,如下所示:
skiptools/skipapp-showcase % ls -lah .build/Android/app/outputs/apk/*/*.apk73M .build/Android/app/outputs/apk/debug/app-debug.apk11M .build/Android/app/outputs/apk/release/app-release.apk如果你需要一个用于提交到应用商店的 Android Bundle,可以使用以下命令构建:
skiptools/skipapp-showcase % gradle -p Android/ bundleskiptools/skipapp-showcase % ls -lah .build/Android/app/outputs/bundle/*/* 19M .build/Android/app/outputs/bundle/debug/app-debug.aab5.6M .build/Android/app/outputs/bundle/release/app-release.aab有关 Skip gradle 项目结构的更多信息,请参阅 Gradle 项目参考。有关使用 gradle CLI 构建 Android 应用的更多信息,可以在 https://developer.android.com/build/building-cmdline ↗ 找到。
Fastlane 集成
Section titled “Fastlane 集成”Fastlane 是一个可以自动将应用发布到 Apple App Store 和 Google Play Store 的工具。它替代了通过各商店网站手动创建和上传应用发布版本所需的步骤。
fastlane 命令行工具可以通过终端使用 Homebrew 安装:
brew install fastlanefastlane 的完整文档可以在 https://docs.fastlane.tools ↗ 找到。
当你使用以下命令初始化一个新的 Skip 应用时:
skip init --fastlane --appid=app.bundle.id package-name AppNameDarwin/ 和 Android/ 文件夹中将各自包含一个 fastlane 项目模板,其中包含可以编辑的元数据文件,用于填写应用标题、描述、内容分级和截图等信息。这些文件可以为你的应用支持的每种语言进行本地化。
各平台的元数据结构不同。对于 iOS 和其他 Apple 平台,Darwin/ 文件夹的结构如下:
文件夹Darwin/fastlane
- AppStore.xcconfig
- Appfile
- Deliverfile
- Fastfile
- README.md
- apikey.json*
文件夹metadata
文件夹en-US
- description.txt
- keywords.txt
- release_notes.txt
- subtitle.txt
文件夹screenshots
文件夹en-US
- 0_APP_IPHONE_55_0.png
- 0_APP_IPHONE_65_0.png
- 1_APP_IPHONE_65_1.png
- 2_APP_IPHONE_65_2.png
- 3_APP_IPHONE_65_3.png
- 4_APP_IPHONE_65_4.png
- 5_APP_IPHONE_65_5.png
Android/ 文件夹的结构如下:
文件夹Android/fastlane
- Appfile
- Fastfile
- README.md
- apikey.json*
文件夹metadata
文件夹android
文件夹en-US
- full_description.txt
文件夹images
- featureGraphic.png
- icon.png
文件夹phoneScreenshots
- 1_en-US.png
- 2_en-US.png
- 3_en-US.png
- 4_en-US.png
- short_description.txt
- title.txt
- video.txt
每个平台的 fastlane Fastfile、Appfile 和 Deliverfile 可以配置为自动提交发布版本进行审核,或将其发布到商店的测试服务。详情请参阅 fastlane 文档 ↗。
应用签名与商店认证
Section titled “应用签名与商店认证”每个 fastlane/ 文件夹中的 apikey.json 文件(不是由 skip init 创建的)必须分别从 App Store Connect 服务和 Google Play Console 服务下载。这些文件包含上传发布版本到相应商店所需的认证信息。
对于 Apple App Store,请按照使用 fastlane API Key JSON 文件 ↗的说明操作。对于 Google Play 商店,请按照上传到 Play 商店设置 ↗的说明操作。
除了 API 密钥,你还必须遵循各平台的应用签名流程。对于 Darwin 平台,这意味着需要从 https://developer.apple.com ↗ 下载并安装已注册应用 ID 的证书和配置文件。对于 Android,Android/app/ 文件夹应包含 keystore.jks 和 keystore.properties 文件,默认的 Android/app/build.gradle.kts 会在这些文件存在时使用它们来签名发布产物。
当你准备好创建应用的新发布版本时,可以在 Android/ 和 Darwin/ 文件夹中分别运行 fastlane release 命令来构建应用(对于 Android,首先使用 Skip 进行转译),将其打包为 .apk 或 .ipa,并上传到相应的商店。
Fastlane 示例(Darwin)
Section titled “Fastlane 示例(Darwin)”发布 iOS 应用的示例会话如下:
zap skipapp-showcase/Darwin % fastlane release[✔] 🚀[10:59:50]: ------------------------------[10:59:50]: --- Step: default_platform ---[10:59:50]: ------------------------------[10:59:50]: Driving the lane 'release' 🚀[10:59:50]: -------------------------------------[10:59:50]: --- Step: Switch to assemble lane ---[10:59:50]: -------------------------------------[10:59:50]: Cruising over to lane 'assemble' 🚖[10:59:50]: -----------------------[10:59:50]: --- Step: build_app ---[10:59:50]: -----------------------[10:59:50]: Resolving Swift Package Manager dependencies...[10:59:50]: $ xcodebuild -resolvePackageDependencies -scheme Showcase -project ./Showcase.xcodeproj -derivedDataPath ../.build/Darwin/DerivedData -xcconfig fastlane/AppStore.xcconfig[10:59:51]: ▸ Command line invocation:[10:59:51]: ▸ /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -resolvePackageDependencies -scheme Showcase -project ./Showcase.xcodeproj -derivedDataPath ../.build/Darwin/DerivedData -xcconfig fastlane/AppStore.xcconfig[10:59:51]: ▸ Build settings from configuration file 'fastlane/AppStore.xcconfig':[10:59:51]: ▸ Resolve Package Graph202 collapsed lines
[10:59:53]: ▸ dependency 'skip-ui' is not used by any targetdependency 'skip-av' is not used by any target[10:59:53]: ▸ Resolved source packages:[10:59:53]: ▸ skipapp-showcase: /srcroot/skipapp-showcase[10:59:53]: ▸ skip-model: https://github.com/skiptools/skip-model.git @ 0.7.0[10:59:53]: ▸ skip-av: https://github.com/skiptools/skip-av.git @ 0.0.2[10:59:53]: ▸ skip-unit: https://github.com/skiptools/skip-unit.git @ 0.7.2[10:59:53]: ▸ skip: https://github.com/skiptools/skip.git @ 0.8.46[10:59:53]: ▸ skip-ui: https://github.com/skiptools/skip-ui.git @ 0.9.6[10:59:53]: ▸ skip-foundation: https://github.com/skiptools/skip-foundation.git @ 0.6.11[10:59:53]: ▸ skip-lib: https://github.com/skiptools/skip-lib.git @ 0.7.13[10:59:53]: ▸ resolved source packages: skipapp-showcase, skip-model, skip-av, skip-unit, skip, skip-ui, skip-foundation, skip-lib[10:59:53]: $ xcodebuild -showBuildSettings -scheme Showcase -project ./Showcase.xcodeproj -derivedDataPath ../.build/Darwin/DerivedData -xcconfig fastlane/AppStore.xcconfig 2>&1
+-----------------------------------------------------------------------------+| Summary for gym 2.220.0 |+--------------------------------------+--------------------------------------+| sdk | iphoneos || xcconfig | fastlane/AppStore.xcconfig || derived_data_path | ../.build/Darwin/DerivedData || output_directory | ../.build/fastlane/Darwin || skip_archive | false || skip_codesigning | false || project | ./Showcase.xcodeproj || scheme | Showcase || clean | false || output_name | Showcase || silent | false || skip_package_ipa | false || skip_package_pkg | false || result_bundle | false || buildlog_path | ~/Library/Logs/gym || destination | generic/platform=iOS || xcodebuild_formatter | xcpretty || build_timing_summary | false || skip_profile_detection | false || xcodebuild_command | xcodebuild || skip_package_dependencies_resolutio | false || n | || disable_package_automatic_updates | false || use_system_scm | false || xcode_path | /Applications/Xcode.app |+--------------------------------------+--------------------------------------+
[10:59:56]: $ set -o pipefail && xcodebuild -scheme Showcase -project ./Showcase.xcodeproj -derivedDataPath ../.build/Darwin/DerivedData -xcconfig fastlane/AppStore.xcconfig -sdk 'iphoneos' -destination 'generic/platform=iOS' -archivePath ~/Library/Developer/Xcode/Archives/App.xcarchive -skipPackagePluginValidation -skipMacroValidation archive | tee ~/Library/Logs/gym/Showcase-Showcase.log | xcpretty[11:00:40]: ▸ Touching skipapp-showcase_Showcase.bundle (in target 'skipapp-showcase_Showcase' from project 'skipapp-showcase')[11:00:40]: ▸ Linking Showcase.o[11:00:40]: ▸ Processing empty-ShowcaseApp.plist[11:00:40]: ▸ Linking ShowcaseApp[11:00:40]: ▸ Generating 'ShowcaseApp.framework.dSYM'[11:00:40]: ▸ Touching ShowcaseApp.framework (in target 'ShowcaseApp' from project 'skipapp-showcase')[11:00:40]: ▸ Copying /srcroot/skipapp-showcase/.build/Darwin/DerivedData/Build/Intermediates.noindex/ArchiveIntermediates/Showcase/InstallationBuildProductsLocation/Applications/Showcase.app/protest_guerrilla.ttf[11:00:40]: ▸ Linking Showcase[11:00:41]: ▸ Running script 'Run skip gradle'[11:00:41]: ▸ Processing Info.plist[11:00:41]: ▸ Touching Showcase.app (in target 'Showcase' from project 'Showcase')[11:00:41]: ▸ Archive Succeeded[11:00:41]: Generated plist file with the following values:[11:00:41]: ▸ -----------------------------------------[11:00:41]: ▸[11:00:41]: ▸ "method": "app-store"[11:00:41]: ▸[11:00:41]: ▸ -----------------------------------------[11:00:41]: $ /usr/bin/xcrun /opt/homebrew/Cellar/fastlane/2.220.0/libexec/gems/fastlane-2.220.0/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh -exportArchive -exportOptionsPlist '/var/folders/zl/wkdjv4s1271fbm6w0plzknkh0000gn/T/gym_config20240612-40159-xgzrb9.plist' -archivePath ~/Library/Developer/Xcode/Archives/2024-06-12/Showcase\ 2024-06-12\ 10.59.56.xcarchive -exportPath '/var/folders/zl/wkdjv4s1271fbm6w0plzknkh0000gn/T/gym_output20240612-40159-udedtq' -skipPackagePluginValidation -skipMacroValidation[11:00:55]: Successfully exported and signed the ipa file:[11:00:55]: /srcroot/skipapp-showcase/.build/fastlane/Darwin/Showcase.ipa[11:00:55]: Cruising back to lane 'release' 🚘[11:00:56]: ---------------------------------[11:00:56]: --- Step: upload_to_app_store ---[11:00:56]: ---------------------------------[11:00:56]: Successfully loaded '/srcroot/skipapp-showcase/Darwin/fastlane/Deliverfile' 📄
+--------------------------------------------------------------------------+| Detected Values from './fastlane/Deliverfile' |+-----------------------------------+--------------------------------------+| copyright | 2024 || force | true || automatic_release | true || skip_screenshots | false || precheck_include_in_app_purchases | false || submit_for_review | true |+-----------------------------------+--------------------------------------+
[11:00:56]: Creating authorization token for App Store Connect API
+-----------------------------------------------------------------------------+| deliver 2.220.0 Summary |+--------------------------------------+--------------------------------------+| api_key_path | fastlane/apikey.json || app_rating_config_path | fastlane/metadata/rating.json || screenshots_path | ./fastlane/screenshots || metadata_path | ./fastlane/metadata || app_version | 1.0.3 || username | appfair@appfair.org || app_identifier | org.appfair.app.Showcase || platform | ios || edit_live | false || use_live_version | false || skip_binary_upload | false || skip_screenshots | false || skip_metadata | false || skip_app_version_update | false || force | true || overwrite_screenshots | false || screenshot_processing_timeout | 3600 || sync_screenshots | false || submit_for_review | true || verify_only | false || reject_if_possible | false || version_check_wait_retry_limit | 7 || automatic_release | true || phased_release | false || reset_ratings | false || run_precheck_before_submit | true || precheck_default_rule_level | warn || copyright | 2024 || ignore_language_directory_validation | false || precheck_include_in_app_purchases | false |+--------------------------------------+--------------------------------------+
[11:00:56]: Making sure the latest version on App Store Connect matches '1.0.3'...[11:00:59]: Successfully set the version to '1.0.3'[11:00:59]: Loading './fastlane/metadata/en-US/description.txt'...[11:00:59]: Loading './fastlane/metadata/en-US/keywords.txt'...[11:00:59]: Loading './fastlane/metadata/en-US/release_notes.txt'...[11:00:59]: Loading './fastlane/metadata/en-US/support_url.txt'...[11:00:59]: Loading './fastlane/metadata/en-US/subtitle.txt'...[11:00:59]: Loading './fastlane/metadata/en-US/privacy_url.txt'...[11:01:02]: No changes to localized App Info detected. Skipping upload.[11:01:02]: Will begin uploading metadata for '1.0.3' on App Store Connect[11:01:02]: Uploading metadata to App Store Connect for version[11:01:06]: Uploading metadata to App Store Connect for localized version 'en-US'[11:01:08]: Setting the app's age rating...[11:01:09]: Will begin uploading snapshots for '1.0.3' on App Store Connect[11:01:09]: Starting with the upload of screenshots...[✔] Waiting for all the screenshots to finish being processed...[11:01:09]: Successfully uploaded all screenshots[✔] Sorting screenshots uploaded...[11:01:10]: Successfully uploaded screenshots to App Store Connect[11:01:10]: Uploading binary to App Store Connect[11:01:10]: Going to upload updated app to App Store Connect[11:01:10]: This might take a few minutes. Please don't interrupt the script.[11:01:47]: --------------------------------------------------------------------[11:01:47]: Successfully uploaded package to App Store Connect. It might take a few minutes until it's visible online.[11:01:47]: --------------------------------------------------------------------[11:01:47]: Finished the upload to App Store Connect[11:01:47]: Running precheck before submitting to review, if you'd like to disable this check you can set run_precheck_before_submit to false[11:01:47]: Making sure we pass precheck 👮♀️ 👮 before we submit 🛫
+-----------------------------------------------------+| Summary for precheck 2.220.0 |+--------------------------+--------------------------+| default_rule_level | warn || include_in_app_purchases | false || app_identifier | org.appfair.app.Showcase || api_key_path | fastlane/apikey.json || username | appfair@appfair.org || platform | ios || use_live | false |+--------------------------+--------------------------+
[11:01:47]: Creating authorization token for App Store Connect API[11:01:47]: Checking app for precheck rule violations[11:01:51]: ✅ Passed: No negative sentiment[11:01:51]: ✅ Passed: No placeholder text[11:01:51]: ✅ Passed: No mentioning competitors[11:01:51]: ✅ Passed: No future functionality promises[11:01:51]: ✅ Passed: No words indicating test content[11:01:51]: ✅ Passed: No curse words[11:01:51]: ✅ Passed: No words indicating your IAP is free[11:01:51]: ✅ Passed: Incorrect, or missing copyright date[11:01:51]: ✅ Passed: No broken urls[11:01:51]: precheck 👮♀️ 👮 finished without detecting any potential problems 🛫[11:01:51]: Selecting the latest build...[11:01:51]: Waiting for processing on... app_id: 6474885022, app_version: 1.0.3, build_version: 103, platform: IOS[11:01:52]: Read more information on why this build isn't showing up yet - https://github.com/fastlane/fastlane/issues/14997[11:01:52]: Waiting for the build to show up in the build list - this may take a few minutes (check your email for processing issues if this continues)[11:02:07]: Waiting for the build to show up in the build list - this may take a few minutes (check your email for processing issues if this continues)[11:02:22]: Waiting for the build to show up in the build list - this may take a few minutes (check your email for processing issues if this continues)[11:02:37]: Waiting for the build to show up in the build list - this may take a few minutes (check your email for processing issues if this continues)[11:02:54]: Waiting for App Store Connect to finish processing the new build (1.0.3 - 103) for IOS[11:03:10]: Waiting for App Store Connect to finish processing the new build (1.0.3 - 103) for IOS[11:03:26]: Waiting for App Store Connect to finish processing the new build (1.0.3 - 103) for IOS[11:03:42]: Successfully finished processing the build 1.0.3 - 103 for IOS[11:03:42]: Selecting build 1.0.3 (103)...[11:03:44]: Successfully selected build[11:03:45]: Successfully updated IDFA declarations on App Store Connect[11:03:46]: Successfully updated contents rights declaration on App Store Connect[11:04:01]: Successfully submitted the app for review!
+------------------------------------------+| fastlane summary |+------+---------------------+-------------+| Step | Action | Time (in s) |+------+---------------------+-------------+| 1 | default_platform | 0 || 2 | Switch to assemble | 0 || | lane | || 3 | build_app | 65 || 4 | upload_to_app_store | 185 |+------+---------------------+-------------+
[11:04:01]: fastlane.tools finished successfully 🎉Fastlane 示例(Android)
Section titled “Fastlane 示例(Android)”Android 的示例会话如下:
zap skipapp-showcase/Android % fastlane release[✔] 🚀[15:29:48]: ------------------------------[15:29:48]: --- Step: default_platform ---[15:29:48]: ------------------------------[15:29:48]: ------------------------------[15:29:48]: --- Step: default_platform ---[15:29:48]: ------------------------------[15:29:48]: Driving the lane 'release' 🚀[15:29:48]: -------------------------------------[15:29:48]: --- Step: Switch to assemble lane ---[15:29:48]: -------------------------------------[15:29:48]: Cruising over to lane 'assemble' 🚖[15:29:48]: ---------------------------[15:29:48]: --- Step: bundleRelease ---[15:29:48]: ---------------------------[15:29:48]: $ /opt/homebrew/bin/gradle bundleRelease -p .[15:29:53]: ▸ [0/1] Planning build[15:29:53]: ▸ [1/1] Compiling plugin Create SkipLink107 collapsed lines
[15:29:53]: ▸ [2/2] Compiling plugin skipstone[15:29:53]: ▸ Building for debugging...[15:29:53]: ▸ [2/8] Write sources[15:29:53]: ▸ [3/13] Write swift-version--58304C5D6DBC2206.txt[15:29:53]: ▸ note: Skip 0.8.46: transpile plugin to: /srcroot/skipapp-showcase/.build/plugins/outputs/skip-unit/SkipUnit/skipstone/SkipUnit/src/main at 15:29:53…[15:30:13]: ▸ > Task :app:processReleaseManifest[15:30:13]: ▸ > Task :app:mergeReleaseArtProfile UP-TO-DATE[15:30:13]: ▸ > Task :app:processApplicationManifestReleaseForBundle[15:30:13]: ▸ > Task :app:mergeReleaseAssets UP-TO-DATE[15:30:13]: ▸ > Task :app:mergeReleaseNativeLibs NO-SOURCE[15:30:13]: ▸ > Task :app:stripReleaseDebugSymbols NO-SOURCE[15:30:13]: ▸ > Task :app:extractReleaseNativeSymbolTables NO-SOURCE[15:30:13]: ▸ > Task :app:processReleaseManifestForPackage[15:30:13]: ▸ > Task :app:processReleaseResources[15:30:14]: ▸ > Task :app:bundleReleaseResources[15:30:14]: ▸ > Task :skipstone:Showcase:compileReleaseKotlin[15:30:14]: ▸ > Task :skipstone:Showcase:compileReleaseJavaWithJavac NO-SOURCE[15:30:14]: ▸ > Task :skipstone:Showcase:mergeReleaseGeneratedProguardFiles UP-TO-DATE[15:30:14]: ▸ > Task :skipstone:Showcase:exportReleaseConsumerProguardFiles UP-TO-DATE[15:30:14]: ▸ > Task :skipstone:Showcase:processReleaseJavaRes UP-TO-DATE[15:30:14]: ▸ > Task :skipstone:Showcase:bundleLibRuntimeToJarRelease[15:30:14]: ▸ > Task :skipstone:Showcase:bundleLibCompileToJarRelease[15:30:15]: ▸ > Task :app:compileReleaseKotlin[15:30:15]: ▸ > Task :app:compileReleaseJavaWithJavac[15:30:15]: ▸ > Task :app:mergeReleaseGeneratedProguardFiles UP-TO-DATE[15:30:15]: ▸ > Task :app:processReleaseJavaRes UP-TO-DATE[15:30:15]: ▸ > Task :app:mergeReleaseJavaResource UP-TO-DATE[15:30:15]: ▸ > Task :app:expandReleaseArtProfileWildcards[15:30:45]: ▸ > Task :app:minifyReleaseWithR8[15:31:05]: ▸ > Task :app:buildReleasePreBundle[15:31:06]: ▸ > Task :app:compileReleaseArtProfile[15:31:06]: ▸ > Task :app:packageReleaseBundle[15:31:08]: ▸ > Task :app:shrinkBundleReleaseResources[15:31:10]: ▸ > Task :app:signReleaseBundle[15:31:10]: ▸ > Task :app:produceReleaseBundleIdeListingFile[15:31:10]: ▸ > Task :app:createReleaseBundleListingFileRedirect UP-TO-DATE[15:31:10]: ▸ > Task :app:bundleRelease[15:31:10]: ▸ BUILD SUCCESSFUL in 1m 21s[15:31:10]: ▸ 169 actionable tasks: 30 executed, 139 up-to-date[15:31:10]: Cruising back to lane 'release' 🚘[15:31:10]: ----------------------------------[15:31:10]: --- Step: upload_to_play_store ---[15:31:10]: ----------------------------------
+---------------------------------------------------------------------------+| Summary for supply 2.220.0 |+------------------------------------+--------------------------------------+| aab | ../.build/Android/app/outputs/bundl || | e/release/app-release.aab || package_name | org.appfair.app.Showcase || release_status | completed || track | production || metadata_path | ./fastlane/metadata/android || json_key | fastlane/apikey.json || skip_upload_apk | false || skip_upload_aab | false || skip_upload_metadata | false || skip_upload_changelogs | false || skip_upload_images | false || skip_upload_screenshots | false || sync_image_upload | false || track_promote_release_status | completed || validate_only | false || check_superseded_tracks | false || timeout | 300 || deactivate_on_promote | true || changes_not_sent_for_review | false || rescue_changes_not_sent_for_review | true || ack_bundle_installation_warning | false |+------------------------------------+--------------------------------------+
[15:31:11]: Preparing aab at path '../.build/Android/app/outputs/bundle/release/app-release.aab' for upload...[15:31:28]: Updating track 'production'...[15:31:29]: Preparing uploads for language 'en-US'...[15:31:30]: ⬆️ Uploading image file ./fastlane/metadata/android/en-US/images/featureGraphic.png...[15:31:32]: ⬆️ Uploading image file ./fastlane/metadata/android/en-US/images/icon.png...[15:31:34]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/phoneScreenshots/1_en-US.png...[15:31:37]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/phoneScreenshots/2_en-US.png...[15:31:40]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/phoneScreenshots/3_en-US.png...[15:31:42]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/phoneScreenshots/4_en-US.png...[15:31:45]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/sevenInchScreenshots/1_en-US.png...[15:31:48]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/sevenInchScreenshots/2_en-US.png...[15:31:50]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/sevenInchScreenshots/3_en-US.png...[15:31:53]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/sevenInchScreenshots/4_en-US.png...[15:31:56]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/tenInchScreenshots/1_en-US.png...[15:31:58]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/tenInchScreenshots/2_en-US.png...[15:32:01]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/tenInchScreenshots/3_en-US.png...[15:32:04]: ⬆️ Uploading screenshot ./fastlane/metadata/android/en-US/images/tenInchScreenshots/4_en-US.png...[15:32:07]: Uploaded all items for language 'en-US'... (37.582534 secs)[15:32:07]: Uploading all changes to Google Play...[15:32:10]: Successfully finished the upload to Google Play
+-------------------------------------------+| fastlane summary |+------+----------------------+-------------+| Step | Action | Time (in s) |+------+----------------------+-------------+| 1 | default_platform | 0 || 2 | default_platform | 0 || 3 | Switch to assemble | 0 || | lane | || 4 | bundleRelease | 81 || 5 | upload_to_play_store | 59 |+------+----------------------+-------------+
[15:32:10]: fastlane.tools finished successfully 🎉