misc: optimize slow cmp_shared build step in CI (#1904)

This commit is contained in:
Hekmatullah 2025-08-14 22:48:18 +01:00 committed by GitHub
parent c8e1d1ad67
commit e8b7c94565
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 275 additions and 99 deletions

17
.github/ci-gradle.properties vendored Normal file
View File

@ -0,0 +1,17 @@
# Disable daemon for CI to avoid leftover processes
org.gradle.daemon=false
# Run tasks in parallel where possible
org.gradle.parallel=true
# Increase heap and metaspace for larger builds (macOS-latest has ~7 GB available)
org.gradle.jvmargs=-Xmx7g
# Limit max workers to avoid memory pressure in CI
org.gradle.workers.max=3
# Disable Kotlin incremental compilation in CI for clean, consistent builds
kotlin.incremental=false
# Use in-process Kotlin compiler to avoid extra forked processes
kotlin.compiler.execution.strategy=in-process

View File

@ -74,15 +74,20 @@ on:
default: 'development'
description: 'Target branch for release'
build_ios:
distribute_ios_firebase:
type: boolean
default: false
description: Build iOS App
description: Distribute iOS App via Firebase App Distribution
publish_ios:
distribute_ios_testflight:
type: boolean
default: false
description: Publish iOS App On App Store
description: Distribute iOS App via TestFlight (App Store Connect)
distribute_ios_appstore:
type: boolean
default: false
description: Distribute iOS App to Appstore
permissions:
contents: write
@ -96,17 +101,27 @@ concurrency:
jobs:
multi_platform_build_and_publish:
name: Multi-Platform Build and Publish
uses: openMF/mifos-x-actionhub/.github/workflows/multi-platform-build-and-publish.yaml@v1.0.0
uses: openMF/mifos-x-actionhub/.github/workflows/multi-platform-build-and-publish.yaml@main
with:
release_type: ${{ inputs.release_type }}
target_branch: ${{ inputs.target_branch }}
android_package_name: 'mifospay-android' # <-- Change this to your android package name
ios_package_name: 'mifospay-ios' # <-- Change this to your ios package name
desktop_package_name: 'mifospay-desktop' # <-- Change this to your desktop package name
web_package_name: 'mifospay-web' # <-- Change this to your web package name
tester_groups: 'mifos-mobile-apps' # <-- Change this to your Firebase tester group
build_ios: ${{ inputs.build_ios }}
publish_ios: ${{ inputs.publish_ios }}
android_package_name: 'cmp-android'
ios_package_name: 'cmp-ios'
desktop_package_name: 'cmp-desktop'
web_package_name: 'cmp-web'
tester_groups: 'mifos-mobile-apps'
app_identifier: 'org.mifospay'
git_url: 'git@github.com:openMF/ios-provisioning-profile.git'
git_branch: 'mifospay'
match_type: 'adhoc'
provisioning_profile_name: 'match AdHoc org.mifospay'
firebase_app_id: '1:728434912738:ios:86a7badfaed88b841a1dbb'
metadata_path: './fastlane/metadata'
use_cocoapods: true # <-- Set to true if using CocoaPods integration for KMP
shared_module: ':cmp-shared' # <-- Gradle path to your shared KMP module (e.g., :shared)
distribute_ios_firebase: ${{ inputs.distribute_ios_firebase }}
distribute_ios_testflight: ${{ inputs.distribute_ios_testflight }}
distribute_ios_appstore: ${{ inputs.distribute_ios_appstore }}
secrets:
original_keystore_file: ${{ secrets.ORIGINAL_KEYSTORE_FILE }}
original_keystore_file_password: ${{ secrets.ORIGINAL_KEYSTORE_FILE_PASSWORD }}
@ -121,6 +136,11 @@ jobs:
notarization_apple_id: ${{ secrets.NOTARIZATION_APPLE_ID }}
notarization_password: ${{ secrets.NOTARIZATION_PASSWORD }}
notarization_team_id: ${{ secrets.NOTARIZATION_TEAM_ID }}
appstore_key_id: ${{ secrets.APPSTORE_KEY_ID }}
appstore_issuer_id: ${{ secrets.APPSTORE_ISSUER_ID }}
appstore_auth_key: ${{ secrets.APPSTORE_AUTH_KEY }}
match_password: ${{ secrets.MATCH_PASSWORD }}
match_ssh_private_key: ${{ secrets.MATCH_SSH_PRIVATE_KEY }}
windows_signing_key: ${{ secrets.WINDOWS_SIGNING_KEY }}
windows_signing_password: ${{ secrets.WINDOWS_SIGNING_PASSWORD }}

View File

@ -81,7 +81,7 @@ permissions:
jobs:
pr_checks:
name: PR Checks
uses: openMF/mifos-x-actionhub/.github/workflows/pr-check.yaml@v1.0.3
uses: openMF/mifos-x-actionhub/.github/workflows/pr-check.yaml@main
secrets: inherit
with:
android_package_name: 'cmp-android' # <-- Change Your Android Package Name

View File

@ -7,6 +7,7 @@ rescue Errno::ENOENT
end
gem "fastlane"
gem "cocoapods"
plugins_path = File.join(File.dirname(__FILE__), "fastlane", "Pluginfile")
eval_gemfile(plugins_path) if File.exist?(plugins_path)

View File

@ -5,8 +5,23 @@ GEM
base64
nkf
rexml
activesupport (7.2.2.1)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.3.1)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
json (>= 1.5.1)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.4.0)
@ -30,18 +45,63 @@ GEM
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.3.0)
benchmark (0.3.0)
bigdecimal (3.2.2)
claide (1.1.0)
cocoapods (1.16.2)
addressable (~> 2.8)
claide (>= 1.0.2, < 2.0)
cocoapods-core (= 1.16.2)
cocoapods-deintegrate (>= 1.0.3, < 2.0)
cocoapods-downloader (>= 2.1, < 3.0)
cocoapods-plugins (>= 1.0.0, < 2.0)
cocoapods-search (>= 1.0.0, < 2.0)
cocoapods-trunk (>= 1.6.0, < 2.0)
cocoapods-try (>= 1.1.0, < 2.0)
colored2 (~> 3.1)
escape (~> 0.0.4)
fourflusher (>= 2.3.0, < 3.0)
gh_inspector (~> 1.0)
molinillo (~> 0.8.0)
nap (~> 1.0)
ruby-macho (>= 2.3.0, < 3.0)
xcodeproj (>= 1.27.0, < 2.0)
cocoapods-core (1.16.2)
activesupport (>= 5.0, < 8)
addressable (~> 2.8)
algoliasearch (~> 1.0)
concurrent-ruby (~> 1.1)
fuzzy_match (~> 2.0.4)
nap (~> 1.0)
netrc (~> 0.11)
public_suffix (~> 4.0)
typhoeus (~> 1.0)
cocoapods-deintegrate (1.0.5)
cocoapods-downloader (2.1)
cocoapods-plugins (1.0.0)
nap
cocoapods-search (1.0.1)
cocoapods-trunk (1.6.0)
nap (>= 0.8, < 2.0)
netrc (~> 0.11)
cocoapods-try (1.2.0)
colored (1.2)
colored2 (3.1.2)
commander (4.6.0)
highline (~> 2.0.0)
concurrent-ruby (1.3.5)
connection_pool (2.5.0)
declarative (0.0.20)
digest-crc (0.7.0)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.6.20240107)
dotenv (2.8.1)
drb (2.2.0)
ruby2_keywords
emoji_regex (3.2.3)
escape (0.0.4)
ethon (0.16.0)
ffi (>= 1.15.0)
excon (0.112.0)
faraday (1.10.4)
faraday-em_http (~> 1.0)
@ -120,6 +180,9 @@ GEM
fastlane-plugin-increment_build_number (0.0.4)
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
ffi (1.17.1-arm64-darwin)
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
@ -166,6 +229,8 @@ GEM
domain_name (~> 0.5)
httpclient (2.9.0)
mutex_m
i18n (1.14.7)
concurrent-ruby (~> 1.0)
jmespath (1.6.2)
json (2.13.2)
jwt (2.10.2)
@ -173,16 +238,20 @@ GEM
logger (1.7.0)
mini_magick (4.13.2)
mini_mime (1.1.5)
minitest (5.20.0)
molinillo (0.8.0)
multi_json (1.17.0)
multipart-post (2.4.1)
mutex_m (0.3.0)
nanaimo (0.4.0)
nap (1.1.0)
naturally (2.3.0)
netrc (0.11.0)
nkf (0.2.0)
optparse (0.6.0)
os (1.1.4)
plist (3.7.2)
public_suffix (6.0.2)
public_suffix (4.0.7)
rake (13.3.0)
representable (3.2.0)
declarative (< 0.1.0)
@ -191,8 +260,10 @@ GEM
retriable (3.1.2)
rexml (3.4.1)
rouge (3.28.0)
ruby-macho (2.5.1)
ruby2_keywords (0.0.5)
rubyzip (2.4.1)
securerandom (0.3.1)
security (0.1.5)
signet (0.20.0)
addressable (~> 2.8)
@ -211,6 +282,10 @@ GEM
tty-screen (0.8.2)
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
typhoeus (1.4.1)
ethon (>= 0.9.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
uber (0.1.0)
unicode-display_width (2.6.0)
word_wrap (1.0.0)
@ -227,10 +302,11 @@ GEM
xcpretty (~> 0.2, >= 0.0.7)
PLATFORMS
arm64-darwin-24
ruby
x64-mingw-ucrt
DEPENDENCIES
cocoapods
fastlane
fastlane-plugin-firebase_app_distribution
fastlane-plugin-increment_build_number

View File

@ -13,9 +13,9 @@ internal fun Project.configureKotlinMultiplatform() {
jvm("desktop")
androidTarget()
iosArm64()
iosSimulatorArm64()
iosX64()
iosArm64()
js(IR) {
this.nodejs()
binaries.executable()

View File

@ -1,4 +1,4 @@
package: name='org.mifospay' versionCode='1' versionName='2025.8.2-beta.0.2' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15'
package: name='org.mifospay' versionCode='1' versionName='2025.8.2-beta.0.3' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15'
minSdkVersion:'26'
targetSdkVersion:'34'
uses-permission: name='android.permission.INTERNET'

View File

@ -1,12 +1,21 @@
platform :ios, '16.0'
use_frameworks!
deployment_target = '16.0'
target 'iosApp' do
project 'iosApp.xcodeproj'
use_frameworks!
platform :ios, deployment_target
# Pods for iosApp
pod 'cmp_shared', :path => '../cmp-shared'
# Native Firebase iOS Pods required by firebase-kotlin-sdk
pod 'FirebaseCore'
pod 'FirebaseAnalytics'
pod 'FirebaseCrashlytics'
end
post_install do |installer|
installer.generated_projects.each do |project|
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = deployment_target
end
end
project.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = deployment_target
end
end
end

16
cmp-ios/Podfile.lock Normal file
View File

@ -0,0 +1,16 @@
PODS:
- cmp_shared (1.0)
DEPENDENCIES:
- cmp_shared (from `../cmp-shared`)
EXTERNAL SOURCES:
cmp_shared:
:path: "../cmp-shared"
SPEC CHECKSUMS:
cmp_shared: 572f72160ae05ea5b3f48ce339a45689782322e3
PODFILE CHECKSUM: fba668dc0eba2e4694ef273d90789cf739b8504c
COCOAPODS: 1.16.2

View File

@ -114,7 +114,6 @@
7555FF77242A565900829871 /* Sources */,
B92378962B6B1156000C7307 /* Frameworks */,
7555FF79242A565900829871 /* Resources */,
F4AFB1CDEBBAABC6D5F3DC8F /* [CP] Embed Pods Frameworks */,
752A860311D78307D18B373B /* [CP] Copy Pods Resources */,
);
buildRules = (
@ -212,23 +211,6 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
F4AFB1CDEBBAABC6D5F3DC8F /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@ -371,10 +353,10 @@
baseConfigurationReference = E5D357E5C5AAADD27F979C77 /* Pods-iosApp.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CODE_SIGN_IDENTITY = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
DEVELOPMENT_TEAM = "${TEAM_ID}";
DEVELOPMENT_TEAM = L432S2FZP5;
ENABLE_PREVIEWS = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@ -389,9 +371,9 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_ID}${TEAM_ID}";
PRODUCT_BUNDLE_IDENTIFIER = org.mifospay;
PRODUCT_NAME = "${APP_NAME}";
PROVISIONING_PROFILE_SPECIFIER = "";
PROVISIONING_PROFILE_SPECIFIER = "match AdHoc org.mifospay";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
@ -402,10 +384,10 @@
baseConfigurationReference = 471D4B8AF5995E32718DCCCD /* Pods-iosApp.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CODE_SIGN_IDENTITY = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
DEVELOPMENT_TEAM = "${TEAM_ID}";
DEVELOPMENT_TEAM = L432S2FZP5;
ENABLE_PREVIEWS = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@ -420,9 +402,9 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_ID}${TEAM_ID}";
PRODUCT_BUNDLE_IDENTIFIER = org.mifospay;
PRODUCT_NAME = "${APP_NAME}";
PROVISIONING_PROFILE_SPECIFIER = "";
PROVISIONING_PROFILE_SPECIFIER = "match AdHoc org.mifospay";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>cmp-ios.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:iosApp.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict />
</plist>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<string>6</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSPhotoLibraryAddUsageDescription</key>

View File

@ -9,27 +9,15 @@
*/
plugins {
alias(libs.plugins.kmp.library.convention)
alias(libs.plugins.cmp.feature.convention)
alias(libs.plugins.android.library)
alias(libs.plugins.compose.compiler)
alias(libs.plugins.jetbrainsCompose)
alias(libs.plugins.kotlin.parcelize)
alias(libs.plugins.kotlinCocoapods)
}
kotlin {
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach { iosTarget ->
iosTarget.binaries.framework {
baseName = "ComposeApp"
isStatic = true
optimized = true
}
}
iosArm64()
iosSimulatorArm64()
iosX64()
sourceSets {
commonMain.dependencies {
@ -43,9 +31,6 @@ kotlin {
implementation(compose.components.uiToolingPreview)
implementation(compose.components.resources)
implementation(libs.window.size)
implementation(libs.koin.core)
implementation(libs.koin.compose)
implementation(libs.koin.compose.viewmodel)
implementation(projects.feature.auth)
implementation(projects.libs.mifosPasscode)

View File

@ -9,11 +9,17 @@ module FastlaneConfig
BUILD_CONFIG = {
project_path: "cmp-ios/iosApp.xcodeproj",
workspace_path: "cmp-ios/iosApp.xcworkspace",
configuration: "Release",
podfile_path: "cmp-ios/Podfile",
plist_path: "cmp-ios/iosApp/Info.plist",
scheme: "iosApp",
scheme: "cmp-ios",
output_name: "iosApp.ipa",
output_directory: "cmp-ios/build",
match_git_private_key: "./secrets/match_ci_key",
target: "iosApp",
team_id: "L432S2FZP5",
code_sign_identity: "Apple Distribution",
configuration: "Release",
match_type: "adhoc",
app_identifier: "org.mifospay",
provisioning_profile_name: "match AdHoc org.mifospay",
@ -22,7 +28,7 @@ module FastlaneConfig
key_id: "7V3ABCDEFG",
issuer_id: "7ab9e231-9603-4c3e-a147-be3b0f123456",
key_filepath: "./secrets/Auth_key.p8",
version_number: "1.0.0",
version_number: "1.0",
metadata_path: "./fastlane/metadata",
app_rating_config_path: "./fastlane/age_rating.json"
}

View File

@ -328,9 +328,7 @@ platform :ios do
unless ENV['CI']
UI.message("🖥️ Running locally, skipping CI-specific setup.")
else
setup_ci(
provider: "circleci"
)
setup_ci
end
end
@ -350,7 +348,7 @@ platform :ios do
match(
type: options[:match_type] || ios_config[:match_type],
app_identifier: options[:app_identifier] || ios_config[:app_identifier],
readonly: false,
readonly: true,
git_url: options[:git_url] || ios_config[:git_url],
git_branch: options[:git_branch] || ios_config[:git_branch],
git_private_key: options[:git_private_key] || ios_config[:match_git_private_key],
@ -364,16 +362,29 @@ platform :ios do
app_identifier = options[:app_identifier] || ios_config[:app_identifier]
provisioning_profile_name = options[:provisioning_profile_name] || ios_config[:provisioning_profile_name]
cocoapods(
podfile: ios_config[:podfile_path],
clean_install: true,
repo_update: true
)
# Manual signing for your main app target
update_code_signing_settings(
use_automatic_signing: false,
path: ios_config[:project_path],
targets: [ios_config[:target]],
team_id: ios_config[:team_id],
code_sign_identity: ios_config[:code_sign_identity],
profile_name: provisioning_profile_name,
bundle_identifier: app_identifier
)
build_ios_app(
scheme: ios_config[:scheme],
workspace: ios_config[:workspace_path],
output_name: ios_config[:output_name],
output_directory: ios_config[:output_directory],
export_options: {
provisioningProfiles: {
app_identifier => provisioning_profile_name
}
}
configuration: ios_config[:configuration]
)
end
@ -384,6 +395,13 @@ platform :ios do
desc "Build Ios application"
lane :build_ios do |options|
ios_config = FastlaneConfig::IosConfig::BUILD_CONFIG
cocoapods(
podfile: ios_config[:podfile_path],
clean_install: true,
repo_update: true
)
build_ios_app(
scheme: ios_config[:scheme],
workspace: ios_config[:workspace_path],
@ -472,7 +490,8 @@ platform :ios do
latest_build_number = latest_testflight_build_number(
app_identifier: options[:app_identifier] || ios_config[:app_identifier],
api_key: Actions.lane_context[SharedValues::APP_STORE_CONNECT_API_KEY]
api_key: Actions.lane_context[SharedValues::APP_STORE_CONNECT_API_KEY],
version: ios_config[:version_number]
)
increment_build_number(
@ -508,9 +527,10 @@ platform :ios do
version_number: ios_config[:version_number]
)
latest_build_number = latest_testflight_build_number(
latest_build_number = app_store_build_number(
app_identifier: options[:app_identifier] || ios_config[:app_identifier],
api_key: Actions.lane_context[SharedValues::APP_STORE_CONNECT_API_KEY]
api_key: Actions.lane_context[SharedValues::APP_STORE_CONNECT_API_KEY],
version: ios_config[:version_number]
)
increment_build_number(

View File

@ -5,72 +5,87 @@
<testcase classname="fastlane.lanes" name="00: default_platform" time="0.000168">
<testcase classname="fastlane.lanes" name="00: default_platform" time="0.001053">
</testcase>
<testcase classname="fastlane.lanes" name="01: Switch to ios increment_version lane" time="0.000156">
<testcase classname="fastlane.lanes" name="01: Switch to ios increment_version lane" time="0.00043">
</testcase>
<testcase classname="fastlane.lanes" name="02: firebase_app_distribution_get_latest_release" time="1.487805">
<testcase classname="fastlane.lanes" name="02: firebase_app_distribution_get_latest_release" time="1.157779">
</testcase>
<testcase classname="fastlane.lanes" name="03: Switch to ios build_signed_ios lane" time="0.000382">
<testcase classname="fastlane.lanes" name="03: increment_build_number" time="0.848547">
</testcase>
<testcase classname="fastlane.lanes" name="04: Switch to ios setup_ci_if_needed lane" time="0.000269">
<testcase classname="fastlane.lanes" name="04: Switch to ios build_signed_ios lane" time="0.000849">
</testcase>
<testcase classname="fastlane.lanes" name="05: Switch to ios load_api_key lane" time="0.000286">
<testcase classname="fastlane.lanes" name="05: Switch to ios setup_ci_if_needed lane" time="0.000275">
</testcase>
<testcase classname="fastlane.lanes" name="06: app_store_connect_api_key" time="0.010104">
<testcase classname="fastlane.lanes" name="06: Switch to ios load_api_key lane" time="0.000238">
</testcase>
<testcase classname="fastlane.lanes" name="07: Switch to ios fetch_certificates_with_match lane" time="0.000295">
<testcase classname="fastlane.lanes" name="07: app_store_connect_api_key" time="0.019969">
</testcase>
<testcase classname="fastlane.lanes" name="08: match" time="6.779149">
<testcase classname="fastlane.lanes" name="08: Switch to ios fetch_certificates_with_match lane" time="0.000275">
</testcase>
<testcase classname="fastlane.lanes" name="09: Switch to ios build_ios_project lane" time="0.000162">
<testcase classname="fastlane.lanes" name="09: match" time="4.097984">
</testcase>
<testcase classname="fastlane.lanes" name="10: build_ios_app" time="1599.756975">
<testcase classname="fastlane.lanes" name="10: Switch to ios build_ios_project lane" time="0.000169">
</testcase>
<testcase classname="fastlane.lanes" name="11: Switch to ios generateReleaseNote lane" time="0.000179">
<testcase classname="fastlane.lanes" name="11: cocoapods" time="7.410226">
</testcase>
<testcase classname="fastlane.lanes" name="12: changelog_from_git_commits" time="0.018834">
<testcase classname="fastlane.lanes" name="12: update_code_signing_settings" time="0.736504">
</testcase>
<testcase classname="fastlane.lanes" name="13: firebase_app_distribution" time="222.652332">
<testcase classname="fastlane.lanes" name="13: build_ios_app" time="68.8691">
</testcase>
<testcase classname="fastlane.lanes" name="14: Switch to ios generateReleaseNote lane" time="0.001172">
</testcase>
<testcase classname="fastlane.lanes" name="15: changelog_from_git_commits" time="0.021015">
</testcase>
<testcase classname="fastlane.lanes" name="16: firebase_app_distribution" time="49.270173">
</testcase>