Menu

Deployment

Skip app projects will build and launch the Android version of the app by forking the gradle process as part of the โ€œRun Scriptsโ€ phase of the Xcode build process. This mechanism enables developers to rapidly iterate on an app by running both the iOS and Android versions side-by-side in the iOS Simulator and Android emulator. Similarly, Skip framework testing will run the transpiled Kotlin test cases by running gradle test on the transpiled modules.

In order to be able to install and run an app on a connected Android device, you must enable USB debugging on the device, as per the ADB documentation.

If you have created separate iOS and Android apps, deploy each app in the standard way for its platform. This chapter applies to dual-platform apps and frameworks.

Exporting Build Artifacts

Running the skip export command from the Terminal in the projectโ€™s directory will build your Skip framework or app, and export all the binary artifacts to the folder specified with the -d argument. This includes .aar library archives for each of the targets in the current project, as well as all the dependent archives. These binary artifacts can be used in any Kotlin or Java build process or IDE. For example, a Kotlin development team can manually add them to their Android Studio project in order to work with a shared data model that is created using Skip.

Framework Export Screenshot

For app projects, the skip export command will additionally export .apk and .aab archives for the application, which can be installed directly on an Android device or uploaded to an Android app store, such as the Google Play Store.

Framework Export Screenshot

Versions of Skip prior to 1.1.10 required that your app be buildable for both macOS and iOS targets, and would fail for unguarded API usage that was unavailable on macOS (for example, various SwiftUI Navigation constructs). This was fixed in Skip 1.1.0, but requires a manual change for projects that were created with skip init prior to that version. To fix the issue, edit the Android/settings.gradle.kts file and change the line commandLine("swift", "build") to commandLine("sh", "-c", "xcrun swift build --triple arm64-apple-ios --sdk $(xcrun --sdk iphoneos --show-sdk-path)")

Signing the Exported Android Artifacts

By default, the exported .build/skip-export/AppName-debug.apk file is signed with a single-use temporary signature, which means that you can install it on an Android emulator or simulator but future versions of the app cannot be upgraded without first manually removing the existing app.

The release APK at .build/skip-export/AppName.apk, on the other hand, is not signed at all by default. Signing the APK is something that you can manage manually however you want (such as by integrating signing into your appโ€™s CI workflow), but the default Android/app/build.gradle.kts build file will look for the presence of keystore.properties and keystore.jks files in the Android/app/ folder.

For complete information on creating and managing Android signing keys, refer to the Sign your app documentation. But to get started quickly, you can create the Android/app/keystore.jks file by running this command from the root of your project and following the prompts:

keytool -genkeypair -v -keystore Android/app/keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias app

Remember the passwords that you set for the keystore and the key itself, and then create a new Android/app/keystore.properties file with the contents:

keyAlias=app
storeFile=keystore.jks
storePassword=PASSWORD
keyPassword=PASSWORD

The keystore.properties and keystore.jks files will contain sensitive information, so be sure to avoid checking them into public source control repositories. For git, this can be done by adding them to the .gitignore file.

Once these files are present, running skip export will automatically sign the release .apk file, which will enable you to distribute and run release builds of your app directly, without going through the Google Play Store.

The apksigner command-line tool (located in ~/Library/Android/sdk/build-tools/*/apksigner) can be used to verify the signature for the .apk file.

Note that the .apk signature is the appโ€™s own signature; in order to distribute the app on the Google Play Store, you will need an upload key. We recommend using Fastlane (see below) for automatically signing and uploading the app bundle to the Play Store.

Export Options

OVERVIEW: Export the Gradle project and built artifacts

USAGE: skip export <options>

OUTPUT OPTIONS:
  -o, --output <path>     Send output to the given file (stdout: -)
  -E, --message-errout    Emit messages to the output rather than stderr
  -v, --verbose           Whether to display verbose messages
  -q, --quiet             Quiet mode: suppress output
  -J, --json              Emit output as formatted JSON
  -j, --json-compact      Emit output as compact JSON
  -M, --message-plain     Show console messages as plain text rather than JSON
  -A, --json-array        Wrap and delimit JSON output as an array
  --plain/--no-plain      Show no colors or progress animations (default:
                          --no-plain)

TOOL OPTIONS:
  --xcodebuild <path>     Xcode command path
  --swift <path>          Swift command path
  --gradle <path>         Gradle command path
  --adb <path>            ADB command path
  --emulator <path>       Android emulator path
  --android-home <path>   Path to the Android SDK (ANDROID_HOME)

OPTIONS:
  -d, --dir <directory>   Export output folder
  --package <package-name>
                          App package name
  --module <ModuleName>   Modules to export
  --project <dir>         Project folder (default: .)
  --summary-file <file>   Output summary path
  --build/--no-build      Build the Swift project before exporting (default:
                          --build)
  --show-tree/--no-show-tree
                          Display a file system tree summary (default:
                          --no-show-tree)
  --release/--no-release  Perform release build (default: --release)
  --debug/--no-debug      Perform debug build (default: --debug)
  --export-project/--no-export-project
                          Export project sources (default: --export-project)
  --nested/--no-nested    Output folders to variant sub-folders (default:
                          --no-nested)
  -h, --help              Show help information.

Running Gradle Manually

In addition to skip export, a Skip app project contains a gradle project in the Android/ folder that can be run directly using the gradle command. This is useful for manually executing gradle tasks, such as launching the app on an emulator or configured device with the launchDebug task:

skipapp-showcase % gradle -p Android launchDebug

To release an Android app, you may want to perform the build yourself, either manually or as part of a continuous integration (CI) process. To build a release version of your app from the Terminal, you can run:

skipapp-showcase % gradle -p Android/ assemble

This will run the Gradle project specified in the Android/gradle.settings.kts file (Showcase source code), which will invoke the Swift Package Manager build to transpile the Swift into Kotlin. The resulting build artifacts can then be found in the .build/Android/ folder, like so:

skiptools/skipapp-showcase % ls -lah .build/Android/app/outputs/apk/*/*.apk
73M .build/Android/app/outputs/apk/debug/app-debug.apk
11M .build/Android/app/outputs/apk/release/app-release.apk

If you need an Android Bundle for submitting to an app storefront, you can build it with:

skiptools/skipapp-showcase % gradle -p Android/ bundle
skiptools/skipapp-showcase % ls -lah .build/Android/app/outputs/bundle/*/*
 19M .build/Android/app/outputs/bundle/debug/app-debug.aab
5.6M .build/Android/app/outputs/bundle/release/app-release.aab

See the Gradle project reference for more information on the structure of a Skip gradle project. More information on using the gradle CLI for building Android apps can be found at https://developer.android.com/build/building-cmdline.

Fastlane Integration

Fastlane is a tool that automates the release of an app to the Apple App Store and the Google Play Store. It is an alternative to the manual steps required to create and upload a release of an app through the web site for each of the stores.

A complete example of a working fastlane configuration can be found in the Skip Showcase app for Darwin and Android. This sample app is released on both the Google Play Store (here) and Apple App Store (here), and is released using the process described herein.

The fastlane command-line tool can be installed using Homebrew from the Terminal:

brew install fastlane

Full documentation for fastlane can be found at https://docs.fastlane.tools.

When you initialize a new Skip app with the following command:

skip init --fastlane --appid=app.bundle.id package-name AppName

The Darwin/ and Android/ folders will each contain a template for the fastlane project, which holds the metadata files that can be edited to fill in information like the appโ€™s title, description, content ratings, and screenshots. These files can be localized for each language that your app supports.

The structure of the metadata for each platform is different. For iOS and other Apple platforms, the Darwin/ folder will look like this:

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

The Android/ folder will look like:

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

The fastlane Fastfile, Appfile, and Deliverfile for each platform can be configured to automatically submit the release for review, or to release it to the storefrontโ€™s testing service. See the fastlane documentation for further details.

App Signing and Storefront Authentication

An apikey.json file in each of the fastlane/ folders (not created by skip init) must be downloaded for each of the App Store Connect service and the Google Play Console service. These contain the authentication information necessary to upload releases to the respective storefronts. For the Apple App Store, follow the instructions for using fastlane API Key JSON file. For the Google Play Store, follow the instructions for upload to Play Store setup.

In addition to the API keys, you must also follow each platformโ€™s app signing procedures. For Darwin platforms, this will mean downloading and installing the certificate and provisioning profile for the registered app id from https://developer.apple.com. For Android, the Android/app/ folder should contain a keystore.jks and keystore.properties file, which is used by the default Android/app/build.gradle.kts for signing the release artifacts when they are present.

The apikey.json files, provisioning profiles, and keystore files will contain sensitive information, so be sure to avoid checking them into public source control repositories. For git, this can be done by adding them to the .gitignore file.

Once you are ready to create a new release of your app, you can run the fastlane release command in each of the Android/ and Darwin/ folders to build the app (transpiling it first using Skip, in the case of Android), assemble it into an .apk or .ipa, and update the file to the appropriate storefront.

Fastlane Example (Darwin)

A sample session for releasing an iOS app will look like:

fastlane release

zap skipapp-showcase/Darwin % fastlane release
[โœ”] ๐Ÿš€ 
[10:59:50]: Get started using a Gemfile for fastlane https://docs.fastlane.tools/getting-started/ios/setup/#use-a-gemfile
[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 Graph
[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://source.skip.tools/skip-model.git @ 0.7.0
[10:59:53]: โ–ธ   skip-av: https://source.skip.tools/skip-av.git @ 0.0.2
[10:59:53]: โ–ธ   skip-unit: https://source.skip.tools/skip-unit.git @ 0.7.2
[10:59:53]: โ–ธ   skip: https://source.skip.tools/skip.git @ 0.8.46
[10:59:53]: โ–ธ   skip-ui: https://source.skip.tools/skip-ui.git @ 0.9.6
[10:59:53]: โ–ธ   skip-foundation: https://source.skip.tools/skip-foundation.git @ 0.6.11
[10:59:53]: โ–ธ   skip-lib: https://source.skip.tools/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 Example (Android)

A sample session for Android will look like:

fastlane release

zap skipapp-showcase/Android % fastlane release
[โœ”] ๐Ÿš€ 
[15:29:48]: Get started using a Gemfile for fastlane https://docs.fastlane.tools/getting-started/ios/setup/#use-a-gemfile
[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 SkipLink
[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 ๐ŸŽ‰