fastlane 2.237.0 → 2.238.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +111 -104
  3. data/deliver/lib/deliver/options.rb +1 -1
  4. data/fastlane/lib/fastlane/actions/deploygate.rb +3 -2
  5. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +4 -2
  6. data/fastlane/lib/fastlane/actions/hockey.rb +3 -2
  7. data/fastlane/lib/fastlane/actions/installr.rb +3 -2
  8. data/fastlane/lib/fastlane/actions/mailgun.rb +1 -0
  9. data/fastlane/lib/fastlane/actions/notarize.rb +3 -18
  10. data/fastlane/lib/fastlane/actions/register_devices.rb +21 -5
  11. data/fastlane/lib/fastlane/actions/setup_ci.rb +7 -2
  12. data/fastlane/lib/fastlane/actions/spm.rb +6 -0
  13. data/fastlane/lib/fastlane/actions/testfairy.rb +5 -3
  14. data/fastlane/lib/fastlane/actions/tryouts.rb +3 -2
  15. data/fastlane/lib/fastlane/actions/update_project_team.rb +17 -9
  16. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +33 -7
  17. data/fastlane/lib/fastlane/version.rb +1 -1
  18. data/fastlane/swift/Deliverfile.swift +1 -1
  19. data/fastlane/swift/DeliverfileProtocol.swift +2 -2
  20. data/fastlane/swift/Fastlane.swift +29 -19
  21. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +1 -1
  22. data/fastlane/swift/Gymfile.swift +1 -1
  23. data/fastlane/swift/GymfileProtocol.swift +1 -1
  24. data/fastlane/swift/Matchfile.swift +1 -1
  25. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  26. data/fastlane/swift/Precheckfile.swift +1 -1
  27. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  28. data/fastlane/swift/Scanfile.swift +1 -1
  29. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  30. data/fastlane/swift/Screengrabfile.swift +1 -1
  31. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  32. data/fastlane/swift/Snapshotfile.swift +1 -1
  33. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  34. data/fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb +31 -5
  35. data/fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb +24 -12
  36. data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +22 -12
  37. data/fastlane_core/lib/fastlane_core/cert_checker.rb +22 -9
  38. data/fastlane_core/lib/fastlane_core/helper.rb +4 -3
  39. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +6 -2
  40. data/fastlane_core/lib/fastlane_core/pkg_upload_package_builder.rb +1 -1
  41. data/fastlane_core/lib/fastlane_core/print_table.rb +0 -16
  42. data/fastlane_core/lib/fastlane_core/queue_worker.rb +10 -1
  43. data/fastlane_core/lib/fastlane_core/video_utils.rb +4 -2
  44. data/gym/lib/gym/module.rb +20 -2
  45. data/pilot/lib/pilot/build_manager.rb +2 -2
  46. data/pilot/lib/pilot/options.rb +2 -2
  47. data/pilot/lib/pilot/tester_manager.rb +2 -2
  48. data/precheck/lib/precheck/rules/copyright_date_rule.rb +1 -1
  49. data/precheck/lib/precheck/rules/unreachable_urls_rule.rb +2 -2
  50. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +4 -1
  51. data/spaceship/lib/spaceship/client.rb +0 -1
  52. data/spaceship/lib/spaceship/connect_api/file_uploader.rb +1 -1
  53. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +6 -0
  54. data/spaceship/lib/spaceship/connect_api/models/beta_group.rb +5 -0
  55. data/spaceship/lib/spaceship/helper/plist_middleware.rb +37 -8
  56. metadata +71 -29
@@ -8,10 +8,8 @@ module Fastlane
8
8
  project_path = params[:path]
9
9
  selected_targets = params[:targets]
10
10
 
11
- UI.user_error!("Could not find path to xcodeproj '#{project_path}'. Pass the path to your project (not workspace)!") unless File.exist?(project_path)
12
-
13
11
  # Load .xcodeproj
14
- project = Xcodeproj::Project.open(project_path)
12
+ project = Fastlane::Helper::XcodeprojHelper.get_project!(project_path)
15
13
 
16
14
  # Fetch target
17
15
  targets = project.native_targets
@@ -25,10 +23,20 @@ module Fastlane
25
23
 
26
24
  # Set teamid in target
27
25
  targets.each do |target|
28
- UI.message("Updating development team (#{params[:teamid]}) for target `#{target.name}` in the project '#{project_path}'")
29
- # Update the build settings
30
26
  target.build_configurations.each do |configuration|
31
- configuration.build_settings['DEVELOPMENT_TEAM'] = params[:teamid]
27
+ # Iterate over any keys that start with DEVELOPMENT_TEAM
28
+ # This will also set keys that have filtering like [sdk=iphoneos*]
29
+ keys = configuration.build_settings.keys.select { |key| key.to_s.start_with?("DEVELOPMENT_TEAM") }
30
+ keys.each do |key|
31
+ configuration.build_settings[key] = params[:teamid]
32
+ UI.message("Updated build setting '#{key}' to '#{params[:teamid]}' for configuration '#{configuration.name}'")
33
+ end
34
+
35
+ # Explicitly set the key with value if keys don't exist
36
+ unless keys.include?('DEVELOPMENT_TEAM')
37
+ configuration.build_settings['DEVELOPMENT_TEAM'] = params[:teamid]
38
+ UI.message("Added build setting 'DEVELOPMENT_TEAM' with value '#{params[:teamid]}' for configuration '#{configuration.name}'")
39
+ end
32
40
  end
33
41
 
34
42
  project.save
@@ -42,7 +50,7 @@ module Fastlane
42
50
  end
43
51
 
44
52
  def self.details
45
- "This action updates the Developer Team ID of your Xcode project."
53
+ "This action updates (or adds) the Developer Team ID of your Xcode project."
46
54
  end
47
55
 
48
56
  def self.available_options
@@ -69,8 +77,8 @@ module Fastlane
69
77
  ]
70
78
  end
71
79
 
72
- def self.author
73
- "lgaches"
80
+ def self.authors
81
+ ["lgaches", "iBotPeaches"]
74
82
  end
75
83
 
76
84
  def self.is_supported?(platform)
@@ -36,20 +36,29 @@ module Fastlane
36
36
  end
37
37
 
38
38
  worker = FastlaneCore::QueueWorker.new(max_worker_threads) do |dsym_path|
39
- handle_dsym(params, dsym_path, max_worker_threads)
39
+ handle_dsym(params, dsym_path)
40
40
  end
41
41
  worker.batch_enqueue(dsym_paths)
42
- worker.start
43
- UI.success("Successfully uploaded dSYM files to Crashlytics 💯")
42
+ results = worker.start
43
+
44
+ if results.all?
45
+ UI.success("Successfully uploaded dSYM files to Crashlytics 💯")
46
+ elsif results.any?
47
+ UI.success("Successfully uploaded some dSYM files to Crashlytics 💯")
48
+ UI.important("Some dSYM files failed to upload, see the errors above")
49
+ else
50
+ UI.user_error!("Service failed to upload any dSYM files to Crashlytics")
51
+ end
44
52
  end
45
53
 
46
54
  # @param current_path this is a path to either a dSYM or a zipped dSYM
47
55
  # this might also be either nested or not, we're flexible
48
- def self.handle_dsym(params, current_path, max_worker_threads)
56
+ def self.handle_dsym(params, current_path)
49
57
  if current_path.end_with?(".dSYM", ".zip")
50
- upload_dsym(params, current_path)
58
+ return upload_dsym(params, current_path)
51
59
  else
52
60
  UI.error("Don't know how to handle '#{current_path}'")
61
+ return false
53
62
  end
54
63
  end
55
64
 
@@ -69,12 +78,21 @@ module Fastlane
69
78
  end
70
79
  command << "-p #{params[:platform] == 'appletvos' ? 'tvos' : params[:platform]}"
71
80
  command << File.expand_path(path).shellescape
81
+
72
82
  begin
73
83
  command_to_execute = command.join(" ")
74
84
  UI.verbose("upload_dsym using command: #{command_to_execute}")
75
85
  Actions.sh(command_to_execute, log: params[:debug])
86
+ return true
76
87
  rescue => ex
77
- UI.error(ex.to_s) # it fails, however we don't want to fail everything just for this
88
+ # If it fails - emit the warning, then continue (or crash) depending on "fail_on_error"
89
+ UI.error(ex.to_s)
90
+
91
+ if params[:fail_on_error] == true
92
+ raise
93
+ end
94
+
95
+ return false
78
96
  end
79
97
  end
80
98
 
@@ -118,7 +136,10 @@ module Fastlane
118
136
  end
119
137
 
120
138
  def self.details
121
- "This action allows you to upload symbolication files to Crashlytics. It's extra useful if you use it to download the latest dSYM files from Apple when you use Bitcode. This action will not fail the build if one of the uploads failed. The reason for that is that sometimes some of dSYM files are invalid, and we don't want them to fail the complete build."
139
+ [
140
+ "This action allows you to upload symbolication files to Crashlytics. It's extra useful if you use it to download the latest dSYM files from Apple when you use Bitcode. This action will not fail the build if one of the uploads failed by default.",
141
+ "The reason for that is that sometimes some of dSYM files are invalid, and we don't want them to fail the complete build. However, fail_on_build parameter can be used to prevent this behavior."
142
+ ].join("\n")
122
143
  end
123
144
 
124
145
  def self.available_options
@@ -195,6 +216,11 @@ module Fastlane
195
216
  min_threads = 1
196
217
  UI.user_error!("Too few threads (#{value}) minimum number of threads: #{min_threads}") unless value >= min_threads
197
218
  end),
219
+ FastlaneCore::ConfigItem.new(key: :fail_on_error,
220
+ env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_FAIL_ON_ERROR",
221
+ description: "Should the action fail when an upload fails?",
222
+ type: Boolean,
223
+ default_value: false),
198
224
  FastlaneCore::ConfigItem.new(key: :debug,
199
225
  env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_DEBUG",
200
226
  description: "Enable debug mode for upload-symbols",
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.237.0'.freeze
2
+ VERSION = '2.238.0'.freeze
3
3
  SUMMARY = "The easiest way to build and release mobile apps.".freeze
4
4
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
5
5
  MINIMUM_XCODE_RELEASE = "7.0".freeze
@@ -17,4 +17,4 @@ public class Deliverfile: DeliverfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.237.0
20
+ // Generated with fastlane 2.238.0
@@ -125,7 +125,7 @@ public protocol DeliverfileProtocol: AnyObject {
125
125
  /// The name of your Developer Portal team if you're in multiple teams
126
126
  var devPortalTeamName: String? { get }
127
127
 
128
- /// The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `pathToXcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
128
+ /// The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `xcrun iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
129
129
  var itcProvider: String? { get }
130
130
 
131
131
  /// The provider public ID to be used with altool (--provider-public-id). This value will override the automatically detected provider value for altool uploads. Required after Xcode 26 when your account is associated with multiple providers and using username/app-password authentication
@@ -532,4 +532,4 @@ public extension DeliverfileProtocol {
532
532
 
533
533
  // Please don't remove the lines below
534
534
  // They are used to detect outdated files
535
- // FastlaneRunnerAPIVersion [0.9.151]
535
+ // FastlaneRunnerAPIVersion [0.9.152]
@@ -684,7 +684,7 @@ public func appledoc(input: [String],
684
684
  - teamName: The name of your App Store Connect team if you're in multiple teams
685
685
  - devPortalTeamId: The short ID of your Developer Portal team, if you're in multiple teams. Different from your iTC team ID!
686
686
  - devPortalTeamName: The name of your Developer Portal team if you're in multiple teams
687
- - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `pathToXcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
687
+ - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `xcrun iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
688
688
  - providerPublicId: The provider public ID to be used with altool (--provider-public-id). This value will override the automatically detected provider value for altool uploads. Required after Xcode 26 when your account is associated with multiple providers and using username/app-password authentication
689
689
  - runPrecheckBeforeSubmit: Run precheck before submitting to app review
690
690
  - precheckDefaultRuleLevel: The default precheck rule level unless otherwise configured
@@ -3847,7 +3847,7 @@ public func deleteKeychain(name: OptionalConfigValue<String?> = .fastlaneDefault
3847
3847
  - teamName: The name of your App Store Connect team if you're in multiple teams
3848
3848
  - devPortalTeamId: The short ID of your Developer Portal team, if you're in multiple teams. Different from your iTC team ID!
3849
3849
  - devPortalTeamName: The name of your Developer Portal team if you're in multiple teams
3850
- - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `pathToXcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
3850
+ - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `xcrun iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
3851
3851
  - providerPublicId: The provider public ID to be used with altool (--provider-public-id). This value will override the automatically detected provider value for altool uploads. Required after Xcode 26 when your account is associated with multiple providers and using username/app-password authentication
3852
3852
  - runPrecheckBeforeSubmit: Run precheck before submitting to app review
3853
3853
  - precheckDefaultRuleLevel: The default precheck rule level unless otherwise configured
@@ -7493,7 +7493,6 @@ public func nexusUpload(file: String,
7493
7493
  - parameters:
7494
7494
  - package: Path to package to notarize, e.g. .app bundle or disk image
7495
7495
  - skipStapling: Do not staple the notarization ticket to the artifact; useful for single file executables and ZIP archives
7496
- - bundleId: Bundle identifier to uniquely identify the package
7497
7496
  - username: Apple ID username
7498
7497
  - ascProvider: Provider short name for accounts associated with multiple providers
7499
7498
  - printLog: Whether to print notarization log file, listing issues on failure and warnings on success
@@ -7503,7 +7502,6 @@ public func nexusUpload(file: String,
7503
7502
  */
7504
7503
  public func notarize(package: String,
7505
7504
  skipStapling: OptionalConfigValue<Bool> = .fastlaneDefault(false),
7506
- bundleId: OptionalConfigValue<String?> = .fastlaneDefault(nil),
7507
7505
  username: OptionalConfigValue<String?> = .fastlaneDefault(nil),
7508
7506
  ascProvider: OptionalConfigValue<String?> = .fastlaneDefault(nil),
7509
7507
  printLog: OptionalConfigValue<Bool> = .fastlaneDefault(false),
@@ -7513,7 +7511,6 @@ public func notarize(package: String,
7513
7511
  {
7514
7512
  let packageArg = RubyCommand.Argument(name: "package", value: package, type: nil)
7515
7513
  let skipStaplingArg = skipStapling.asRubyArgument(name: "skip_stapling", type: nil)
7516
- let bundleIdArg = bundleId.asRubyArgument(name: "bundle_id", type: nil)
7517
7514
  let usernameArg = username.asRubyArgument(name: "username", type: nil)
7518
7515
  let ascProviderArg = ascProvider.asRubyArgument(name: "asc_provider", type: nil)
7519
7516
  let printLogArg = printLog.asRubyArgument(name: "print_log", type: nil)
@@ -7522,7 +7519,6 @@ public func notarize(package: String,
7522
7519
  let apiKeyArg = apiKey.asRubyArgument(name: "api_key", type: nil)
7523
7520
  let array: [RubyCommand.Argument?] = [packageArg,
7524
7521
  skipStaplingArg,
7525
- bundleIdArg,
7526
7522
  usernameArg,
7527
7523
  ascProviderArg,
7528
7524
  printLogArg,
@@ -7903,11 +7899,11 @@ public func pem(platform: String = "ios",
7903
7899
  - lastName: The tester's last name
7904
7900
  - email: The tester's email
7905
7901
  - testersFilePath: Path to a CSV file of testers
7906
- - groups: Associate tester to one group or more by group name / group id. E.g. `-g "Team 1","Team 2"` This is required when `distribute_external` option is set to true or when we want to add a tester to one or more external testing groups
7902
+ - groups: Associate tester to one group or more by group name / group id. E.g. `-g "Team 1","a06cf5b5-95a9-4beb-88c6-f22bd6b3f7a2"` This is required when `distribute_external` option is set to true or when we want to add a tester to one or more external testing groups
7907
7903
  - teamId: The ID of your App Store Connect team if you're in multiple teams
7908
7904
  - teamName: The name of your App Store Connect team if you're in multiple teams
7909
7905
  - devPortalTeamId: The short ID of your team in the developer portal, if you're in multiple teams. Different from your iTC team ID!
7910
- - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `pathToXcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
7906
+ - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `xcrun iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
7911
7907
  - providerPublicId: The provider public ID to be used with altool (--provider-public-id). This value will override the automatically detected provider value for altool uploads. Required after Xcode 26 when your account is associated with multiple providers and using username/app-password authentication
7912
7908
  - waitProcessingInterval: Interval in seconds to wait for App Store Connect processing
7913
7909
  - waitProcessingTimeoutDuration: Timeout duration in seconds to wait for App Store Connect processing. If set, after exceeding timeout duration, this will `force stop` to wait for App Store Connect processing and exit with exception
@@ -8690,6 +8686,7 @@ public func recreateSchemes(project: String) {
8690
8686
  This will register iOS/Mac devices with the Developer Portal so that you can include them in your provisioning profiles.
8691
8687
  This is an optimistic action, in that it will only ever add new devices to the member center, and never remove devices. If a device which has already been registered within the member center is not passed to this action, it will be left alone in the member center and continue to work.
8692
8688
  The action will connect to the Apple Developer Portal using the username you specified in your `Appfile` with `apple_id`, but you can override it using the `username` option, or by setting the env variable `ENV['DELIVER_USER']`.
8689
+ When using `devices_file`, blank lines and lines starting with `#` are ignored, so you can group devices, add notes, or comment out a device row without removing it.
8693
8690
  */
8694
8691
  public func registerDevices(devices: OptionalConfigValue<[String: Any]?> = .fastlaneDefault(nil),
8695
8692
  devicesFile: OptionalConfigValue<String?> = .fastlaneDefault(nil),
@@ -10076,6 +10073,7 @@ public func setPodKey(useBundleExec: OptionalConfigValue<Bool> = .fastlaneDefaul
10076
10073
  - provider: CI provider. If none is set, the provider is detected automatically
10077
10074
  - timeout: Set a custom timeout in seconds for keychain. Set `0` if you want to specify 'no time-out'
10078
10075
  - keychainName: Set a custom keychain name
10076
+ - setDefaultKeychain: Set the temporary keychain as the system default
10079
10077
 
10080
10078
  - Creates a new temporary keychain for use with match|
10081
10079
  - Switches match to `readonly` mode to not create new profiles/cert on CI|
@@ -10086,16 +10084,19 @@ public func setPodKey(useBundleExec: OptionalConfigValue<Bool> = .fastlaneDefaul
10086
10084
  public func setupCi(force: OptionalConfigValue<Bool> = .fastlaneDefault(false),
10087
10085
  provider: OptionalConfigValue<String?> = .fastlaneDefault(nil),
10088
10086
  timeout: Int = 3600,
10089
- keychainName: String = "fastlane_tmp_keychain")
10087
+ keychainName: String = "fastlane_tmp_keychain",
10088
+ setDefaultKeychain: OptionalConfigValue<Bool> = .fastlaneDefault(true))
10090
10089
  {
10091
10090
  let forceArg = force.asRubyArgument(name: "force", type: nil)
10092
10091
  let providerArg = provider.asRubyArgument(name: "provider", type: nil)
10093
10092
  let timeoutArg = RubyCommand.Argument(name: "timeout", value: timeout, type: nil)
10094
10093
  let keychainNameArg = RubyCommand.Argument(name: "keychain_name", value: keychainName, type: nil)
10094
+ let setDefaultKeychainArg = setDefaultKeychain.asRubyArgument(name: "set_default_keychain", type: nil)
10095
10095
  let array: [RubyCommand.Argument?] = [forceArg,
10096
10096
  providerArg,
10097
10097
  timeoutArg,
10098
- keychainNameArg]
10098
+ keychainNameArg,
10099
+ setDefaultKeychainArg]
10099
10100
  let args: [RubyCommand.Argument] = array
10100
10101
  .filter { $0?.value != nil }
10101
10102
  .compactMap { $0 }
@@ -11104,6 +11105,7 @@ public func splunkmint(dsym: OptionalConfigValue<String?> = .fastlaneDefault(nil
11104
11105
  - disableSandbox: Disable using the sandbox when executing subprocesses
11105
11106
  - xcprettyOutput: Specifies the output type for xcpretty. eg. 'test', or 'simple'
11106
11107
  - xcprettyArgs: Pass in xcpretty additional command line arguments (e.g. '--test --no-color' or '--tap --no-utf'), requires xcpretty_output to be specified also
11108
+ - skipUpdate: Skip updating dependencies from their remote during a resolution
11107
11109
  - verbose: Increase verbosity of informational output
11108
11110
  - veryVerbose: Increase verbosity to include debug output
11109
11111
  - simulator: Specifies the simulator to pass for Swift Compiler (one of: iphonesimulator, macosx)
@@ -11120,6 +11122,7 @@ public func spm(command: String = "build",
11120
11122
  disableSandbox: OptionalConfigValue<Bool> = .fastlaneDefault(false),
11121
11123
  xcprettyOutput: OptionalConfigValue<String?> = .fastlaneDefault(nil),
11122
11124
  xcprettyArgs: OptionalConfigValue<String?> = .fastlaneDefault(nil),
11125
+ skipUpdate: OptionalConfigValue<Bool> = .fastlaneDefault(false),
11123
11126
  verbose: OptionalConfigValue<Bool> = .fastlaneDefault(false),
11124
11127
  veryVerbose: OptionalConfigValue<Bool> = .fastlaneDefault(false),
11125
11128
  simulator: OptionalConfigValue<String?> = .fastlaneDefault(nil),
@@ -11136,6 +11139,7 @@ public func spm(command: String = "build",
11136
11139
  let disableSandboxArg = disableSandbox.asRubyArgument(name: "disable_sandbox", type: nil)
11137
11140
  let xcprettyOutputArg = xcprettyOutput.asRubyArgument(name: "xcpretty_output", type: nil)
11138
11141
  let xcprettyArgsArg = xcprettyArgs.asRubyArgument(name: "xcpretty_args", type: nil)
11142
+ let skipUpdateArg = skipUpdate.asRubyArgument(name: "skip_update", type: nil)
11139
11143
  let verboseArg = verbose.asRubyArgument(name: "verbose", type: nil)
11140
11144
  let veryVerboseArg = veryVerbose.asRubyArgument(name: "very_verbose", type: nil)
11141
11145
  let simulatorArg = simulator.asRubyArgument(name: "simulator", type: nil)
@@ -11151,6 +11155,7 @@ public func spm(command: String = "build",
11151
11155
  disableSandboxArg,
11152
11156
  xcprettyOutputArg,
11153
11157
  xcprettyArgsArg,
11158
+ skipUpdateArg,
11154
11159
  verboseArg,
11155
11160
  veryVerboseArg,
11156
11161
  simulatorArg,
@@ -11838,11 +11843,11 @@ public func testfairy(apiKey: String,
11838
11843
  - lastName: The tester's last name
11839
11844
  - email: The tester's email
11840
11845
  - testersFilePath: Path to a CSV file of testers
11841
- - groups: Associate tester to one group or more by group name / group id. E.g. `-g "Team 1","Team 2"` This is required when `distribute_external` option is set to true or when we want to add a tester to one or more external testing groups
11846
+ - groups: Associate tester to one group or more by group name / group id. E.g. `-g "Team 1","a06cf5b5-95a9-4beb-88c6-f22bd6b3f7a2"` This is required when `distribute_external` option is set to true or when we want to add a tester to one or more external testing groups
11842
11847
  - teamId: The ID of your App Store Connect team if you're in multiple teams
11843
11848
  - teamName: The name of your App Store Connect team if you're in multiple teams
11844
11849
  - devPortalTeamId: The short ID of your team in the developer portal, if you're in multiple teams. Different from your iTC team ID!
11845
- - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `pathToXcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
11850
+ - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `xcrun iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
11846
11851
  - providerPublicId: The provider public ID to be used with altool (--provider-public-id). This value will override the automatically detected provider value for altool uploads. Required after Xcode 26 when your account is associated with multiple providers and using username/app-password authentication
11847
11852
  - waitProcessingInterval: Interval in seconds to wait for App Store Connect processing
11848
11853
  - waitProcessingTimeoutDuration: Timeout duration in seconds to wait for App Store Connect processing. If set, after exceeding timeout duration, this will `force stop` to wait for App Store Connect processing and exit with exception
@@ -12538,7 +12543,7 @@ public func updateProjectProvisioning(xcodeproj: OptionalConfigValue<String?> =
12538
12543
  - targets: Name of the targets you want to update
12539
12544
  - teamid: The Team ID you want to use
12540
12545
 
12541
- This action updates the Developer Team ID of your Xcode project.
12546
+ This action updates (or adds) the Developer Team ID of your Xcode project.
12542
12547
  */
12543
12548
  public func updateProjectTeam(path: String,
12544
12549
  targets: OptionalConfigValue<[String]?> = .fastlaneDefault(nil),
@@ -12687,9 +12692,11 @@ public func uploadAppPrivacyDetailsToAppStore(username: String,
12687
12692
  - binaryPath: The path to the upload-symbols file of the Fabric app
12688
12693
  - platform: The platform of the app (ios, appletvos, mac)
12689
12694
  - dsymWorkerThreads: The number of threads to use for simultaneous dSYM upload
12695
+ - failOnError: Should the action fail when an upload fails?
12690
12696
  - debug: Enable debug mode for upload-symbols
12691
12697
 
12692
- This action allows you to upload symbolication files to Crashlytics. It's extra useful if you use it to download the latest dSYM files from Apple when you use Bitcode. This action will not fail the build if one of the uploads failed. The reason for that is that sometimes some of dSYM files are invalid, and we don't want them to fail the complete build.
12698
+ This action allows you to upload symbolication files to Crashlytics. It's extra useful if you use it to download the latest dSYM files from Apple when you use Bitcode. This action will not fail the build if one of the uploads failed by default.
12699
+ The reason for that is that sometimes some of dSYM files are invalid, and we don't want them to fail the complete build. However, fail_on_build parameter can be used to prevent this behavior.
12693
12700
  */
12694
12701
  public func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji2.dSYM",
12695
12702
  dsymPaths: OptionalConfigValue<[String]?> = .fastlaneDefault(nil),
@@ -12699,6 +12706,7 @@ public func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/
12699
12706
  binaryPath: OptionalConfigValue<String?> = .fastlaneDefault(nil),
12700
12707
  platform: String = "ios",
12701
12708
  dsymWorkerThreads: Int = 1,
12709
+ failOnError: OptionalConfigValue<Bool> = .fastlaneDefault(false),
12702
12710
  debug: OptionalConfigValue<Bool> = .fastlaneDefault(false))
12703
12711
  {
12704
12712
  let dsymPathArg = RubyCommand.Argument(name: "dsym_path", value: dsymPath, type: nil)
@@ -12709,6 +12717,7 @@ public func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/
12709
12717
  let binaryPathArg = binaryPath.asRubyArgument(name: "binary_path", type: nil)
12710
12718
  let platformArg = RubyCommand.Argument(name: "platform", value: platform, type: nil)
12711
12719
  let dsymWorkerThreadsArg = RubyCommand.Argument(name: "dsym_worker_threads", value: dsymWorkerThreads, type: nil)
12720
+ let failOnErrorArg = failOnError.asRubyArgument(name: "fail_on_error", type: nil)
12712
12721
  let debugArg = debug.asRubyArgument(name: "debug", type: nil)
12713
12722
  let array: [RubyCommand.Argument?] = [dsymPathArg,
12714
12723
  dsymPathsArg,
@@ -12718,6 +12727,7 @@ public func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/
12718
12727
  binaryPathArg,
12719
12728
  platformArg,
12720
12729
  dsymWorkerThreadsArg,
12730
+ failOnErrorArg,
12721
12731
  debugArg]
12722
12732
  let args: [RubyCommand.Argument] = array
12723
12733
  .filter { $0?.value != nil }
@@ -12816,7 +12826,7 @@ public func uploadSymbolsToSentry(apiHost: String = "https://app.getsentry.com/a
12816
12826
  - teamName: The name of your App Store Connect team if you're in multiple teams
12817
12827
  - devPortalTeamId: The short ID of your Developer Portal team, if you're in multiple teams. Different from your iTC team ID!
12818
12828
  - devPortalTeamName: The name of your Developer Portal team if you're in multiple teams
12819
- - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `pathToXcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
12829
+ - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `xcrun iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
12820
12830
  - providerPublicId: The provider public ID to be used with altool (--provider-public-id). This value will override the automatically detected provider value for altool uploads. Required after Xcode 26 when your account is associated with multiple providers and using username/app-password authentication
12821
12831
  - runPrecheckBeforeSubmit: Run precheck before submitting to app review
12822
12832
  - precheckDefaultRuleLevel: The default precheck rule level unless otherwise configured
@@ -13354,11 +13364,11 @@ public func uploadToPlayStoreInternalAppSharing(packageName: String,
13354
13364
  - lastName: The tester's last name
13355
13365
  - email: The tester's email
13356
13366
  - testersFilePath: Path to a CSV file of testers
13357
- - groups: Associate tester to one group or more by group name / group id. E.g. `-g "Team 1","Team 2"` This is required when `distribute_external` option is set to true or when we want to add a tester to one or more external testing groups
13367
+ - groups: Associate tester to one group or more by group name / group id. E.g. `-g "Team 1","a06cf5b5-95a9-4beb-88c6-f22bd6b3f7a2"` This is required when `distribute_external` option is set to true or when we want to add a tester to one or more external testing groups
13358
13368
  - teamId: The ID of your App Store Connect team if you're in multiple teams
13359
13369
  - teamName: The name of your App Store Connect team if you're in multiple teams
13360
13370
  - devPortalTeamId: The short ID of your team in the developer portal, if you're in multiple teams. Different from your iTC team ID!
13361
- - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `pathToXcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
13371
+ - itcProvider: The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `xcrun iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
13362
13372
  - providerPublicId: The provider public ID to be used with altool (--provider-public-id). This value will override the automatically detected provider value for altool uploads. Required after Xcode 26 when your account is associated with multiple providers and using username/app-password authentication
13363
13373
  - waitProcessingInterval: Interval in seconds to wait for App Store Connect processing
13364
13374
  - waitProcessingTimeoutDuration: Timeout duration in seconds to wait for App Store Connect processing. If set, after exceeding timeout duration, this will `force stop` to wait for App Store Connect processing and exit with exception
@@ -13922,7 +13932,7 @@ public func xcov(workspace: OptionalConfigValue<String?> = .fastlaneDefault(nil)
13922
13932
  coverallsServiceJobId: OptionalConfigValue<String?> = .fastlaneDefault(nil),
13923
13933
  coverallsRepoToken: OptionalConfigValue<String?> = .fastlaneDefault(nil),
13924
13934
  xcconfig: OptionalConfigValue<String?> = .fastlaneDefault(nil),
13925
- ideFoundationPath: String = "/Applications/Xcode_26.5.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
13935
+ ideFoundationPath: String = "/Applications/Xcode_26.6.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
13926
13936
  legacySupport: OptionalConfigValue<Bool> = .fastlaneDefault(false))
13927
13937
  {
13928
13938
  let workspaceArg = workspace.asRubyArgument(name: "workspace", type: nil)
@@ -14133,4 +14143,4 @@ public let snapshotfile: Snapshotfile = .init()
14133
14143
 
14134
14144
  // Please don't remove the lines below
14135
14145
  // They are used to detect outdated files
14136
- // FastlaneRunnerAPIVersion [0.9.204]
14146
+ // FastlaneRunnerAPIVersion [0.9.205]
@@ -46,7 +46,7 @@
46
46
  C0459CAB27261886002CDFB9 /* CopyFiles */ = {
47
47
  isa = PBXCopyFilesBuildPhase;
48
48
  buildActionMask = 2147483647;
49
- dstPath = "$SRCROOT/../..";
49
+ dstPath = $SRCROOT/../..;
50
50
  dstSubfolderSpec = 0;
51
51
  files = (
52
52
  C0459CAC27261897002CDFB9 /* FastlaneRunner in CopyFiles */,
@@ -17,4 +17,4 @@ public class Gymfile: GymfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.237.0
20
+ // Generated with fastlane 2.238.0
@@ -392,4 +392,4 @@ public extension GymfileProtocol {
392
392
 
393
393
  // Please don't remove the lines below
394
394
  // They are used to detect outdated files
395
- // FastlaneRunnerAPIVersion [0.9.154]
395
+ // FastlaneRunnerAPIVersion [0.9.155]
@@ -17,4 +17,4 @@ public class Matchfile: MatchfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.237.0
20
+ // Generated with fastlane 2.238.0
@@ -413,4 +413,4 @@ public extension MatchfileProtocol {
413
413
 
414
414
  // Please don't remove the lines below
415
415
  // They are used to detect outdated files
416
- // FastlaneRunnerAPIVersion [0.9.148]
416
+ // FastlaneRunnerAPIVersion [0.9.149]
@@ -17,4 +17,4 @@ public class Precheckfile: PrecheckfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.237.0
20
+ // Generated with fastlane 2.238.0
@@ -84,4 +84,4 @@ public extension PrecheckfileProtocol {
84
84
 
85
85
  // Please don't remove the lines below
86
86
  // They are used to detect outdated files
87
- // FastlaneRunnerAPIVersion [0.9.147]
87
+ // FastlaneRunnerAPIVersion [0.9.148]
@@ -17,4 +17,4 @@ public class Scanfile: ScanfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.237.0
20
+ // Generated with fastlane 2.238.0
@@ -581,4 +581,4 @@ public extension ScanfileProtocol {
581
581
 
582
582
  // Please don't remove the lines below
583
583
  // They are used to detect outdated files
584
- // FastlaneRunnerAPIVersion [0.9.159]
584
+ // FastlaneRunnerAPIVersion [0.9.160]
@@ -17,4 +17,4 @@ public class Screengrabfile: ScreengrabfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.237.0
20
+ // Generated with fastlane 2.238.0
@@ -161,4 +161,4 @@ public extension ScreengrabfileProtocol {
161
161
 
162
162
  // Please don't remove the lines below
163
163
  // They are used to detect outdated files
164
- // FastlaneRunnerAPIVersion [0.9.149]
164
+ // FastlaneRunnerAPIVersion [0.9.150]
@@ -17,4 +17,4 @@ public class Snapshotfile: SnapshotfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.237.0
20
+ // Generated with fastlane 2.238.0
@@ -378,4 +378,4 @@ public extension SnapshotfileProtocol {
378
378
 
379
379
  // Please don't remove the lines below
380
380
  // They are used to detect outdated files
381
- // FastlaneRunnerAPIVersion [0.9.143]
381
+ // FastlaneRunnerAPIVersion [0.9.144]
@@ -1,23 +1,49 @@
1
+ require_relative '../helper'
2
+
1
3
  module FastlaneCore
2
4
  class AnalyticsEventBuilder
3
5
  attr_accessor :action_name
4
6
 
5
7
  # fastlane_client_language valid options are :ruby or :swift
6
- def initialize(p_hash: nil, session_id: nil, action_name: nil, fastlane_client_language: :ruby)
8
+ def initialize(p_hash: nil, session_id: nil, action_name: nil, fastlane_client_language: :ruby, build_tool_version: nil)
7
9
  @p_hash = p_hash
8
10
  @session_id = session_id
9
11
  @action_name = action_name
10
12
  @fastlane_client_language = fastlane_client_language
13
+ @build_tool_version = build_tool_version
11
14
  end
12
15
 
13
16
  def new_event(action_stage)
14
17
  {
15
18
  client_id: @p_hash,
16
- category: "fastlane Client Language - #{@fastlane_client_language}",
17
- action: action_stage,
18
- label: action_name,
19
- value: nil
19
+ session_id: @session_id,
20
+ name: action_stage,
21
+ params: {
22
+ fastlane_client_language: @fastlane_client_language,
23
+ fastlane_version: Fastlane::VERSION,
24
+ install_method: install_method,
25
+ ruby_version: RUBY_VERSION,
26
+ operating_system: Helper.operating_system,
27
+ build_tool_version: @build_tool_version,
28
+ ci: Helper.ci?.to_s
29
+ }.reject { |_, value| value.nil? }
20
30
  }
21
31
  end
32
+
33
+ private
34
+
35
+ def install_method
36
+ if Helper.bundler?
37
+ 'bundler'
38
+ elsif Helper.contained_fastlane?
39
+ 'standalone'
40
+ elsif Helper.homebrew?
41
+ 'homebrew'
42
+ elsif Helper.mac_app?
43
+ 'mac_app'
44
+ else
45
+ 'gem'
46
+ end
47
+ end
22
48
  end
23
49
  end
@@ -34,21 +34,33 @@ module FastlaneCore
34
34
 
35
35
  def post_request(event)
36
36
  connection = Faraday.new(GA_URL) do |conn|
37
- conn.request(:url_encoded)
37
+ # This request runs while fastlane is shutting down,
38
+ # so keep the timeouts short to not delay the user
39
+ conn.options.open_timeout = 5
40
+ conn.options.timeout = 5
38
41
  conn.adapter(Faraday.default_adapter)
39
42
  end
40
43
  connection.headers[:user_agent] = 'fastlane/' + Fastlane::VERSION
41
- connection.post("/collect", {
42
- v: "1", # API Version
43
- tid: @ga_tracking, # Tracking ID / Property ID
44
- cid: event[:client_id], # Client ID
45
- t: "event", # Event hit type
46
- ec: event[:category], # Event category
47
- ea: event[:action], # Event action
48
- el: event[:label] || "na", # Event label
49
- ev: event[:value] || "0", # Event value
50
- aip: "1" # IP anonymization
51
- })
44
+
45
+ # GA4 protocol, event parameters are sent as `ep.<name>` query parameters
46
+ params = {
47
+ v: "2", # Protocol version (GA4)
48
+ tid: @ga_tracking, # GA4 measurement ID
49
+ cid: event[:client_id], # Client ID
50
+ sid: event[:session_id], # Session ID
51
+ _ss: "1", # Session start
52
+ seg: "1", # Session engaged
53
+ # Engagement time in ms, required for events to count towards active users
54
+ _et: (event[:engagement_time_msec] || 100).to_s,
55
+ en: event[:name].to_s # Event name
56
+ }
57
+ (event[:params] || {}).each do |key, value|
58
+ params["ep.#{key}"] = value.to_s
59
+ end
60
+
61
+ connection.post("/g/collect") do |request|
62
+ request.params = params
63
+ end
52
64
  end
53
65
  end
54
66
  end