fastlane 2.141.0 → 2.142.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +84 -84
  4. data/fastlane/lib/fastlane/actions/README.md +2 -0
  5. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +13 -5
  6. data/fastlane/lib/fastlane/actions/cocoapods.rb +2 -2
  7. data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +1 -1
  8. data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +35 -7
  9. data/fastlane/lib/fastlane/actions/get_github_release.rb +3 -0
  10. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +9 -3
  11. data/fastlane/lib/fastlane/actions/notarize.rb +183 -0
  12. data/fastlane/lib/fastlane/actions/s3.rb +2 -2
  13. data/fastlane/lib/fastlane/actions/spm.rb +8 -0
  14. data/fastlane/lib/fastlane/actions/swiftlint.rb +17 -2
  15. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +13 -3
  16. data/fastlane/lib/fastlane/helper/adb_helper.rb +1 -1
  17. data/fastlane/lib/fastlane/plugins/plugin_manager.rb +1 -1
  18. data/fastlane/lib/fastlane/server/socket_server_action_command_executor.rb +1 -1
  19. data/fastlane/lib/fastlane/version.rb +1 -1
  20. data/fastlane/swift/Deliverfile.swift +1 -1
  21. data/fastlane/swift/Fastlane.swift +55 -6
  22. data/fastlane/swift/Gymfile.swift +1 -1
  23. data/fastlane/swift/Matchfile.swift +1 -1
  24. data/fastlane/swift/Precheckfile.swift +1 -1
  25. data/fastlane/swift/RubyCommand.swift +1 -1
  26. data/fastlane/swift/Scanfile.swift +1 -1
  27. data/fastlane/swift/ScanfileProtocol.swift +5 -1
  28. data/fastlane/swift/Screengrabfile.swift +1 -1
  29. data/fastlane/swift/Snapshotfile.swift +1 -1
  30. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +2 -0
  31. data/fastlane_core/lib/fastlane_core/project.rb +4 -0
  32. data/gym/lib/gym/.code_signing_mapping.rb.swp +0 -0
  33. data/gym/lib/gym/runner.rb +2 -2
  34. data/match/lib/match/storage/google_cloud_storage.rb +2 -2
  35. data/pilot/lib/pilot/build_manager.rb +9 -3
  36. data/scan/lib/scan/options.rb +5 -0
  37. data/scan/lib/scan/runner.rb +9 -7
  38. data/scan/lib/scan/test_command_generator.rb +6 -3
  39. data/screengrab/lib/screengrab/runner.rb +20 -15
  40. data/snapshot/lib/snapshot/fixes/simulator_shared_pasteboard.rb +16 -0
  41. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +2 -0
  42. metadata +19 -16
@@ -0,0 +1,183 @@
1
+ module Fastlane
2
+ module Actions
3
+ class NotarizeAction < Action
4
+ def self.run(params)
5
+ package_path = params[:package]
6
+ bundle_id = params[:bundle_id]
7
+ try_early_stapling = params[:try_early_stapling]
8
+ print_log = params[:print_log]
9
+ verbose = params[:verbose]
10
+
11
+ # Compress and read bundle identifier only for .app bundle.
12
+ compressed_package_path = nil
13
+ if File.extname(package_path) == '.app'
14
+ compressed_package_path = "#{package_path}.zip"
15
+ Actions.sh(
16
+ "ditto -c -k --rsrc --keepParent \"#{package_path}\" \"#{compressed_package_path}\"",
17
+ log: verbose
18
+ )
19
+
20
+ unless bundle_id
21
+ info_plist_path = File.join(package_path, 'Contents', 'Info.plist')
22
+ bundle_id = Actions.sh(
23
+ "/usr/libexec/PlistBuddy -c \"Print :CFBundleIdentifier\" \"#{info_plist_path}\"",
24
+ log: verbose
25
+ ).strip
26
+ end
27
+ end
28
+
29
+ UI.user_error!('Could not read bundle identifier, provide as a parameter') unless bundle_id
30
+
31
+ apple_id_account = CredentialsManager::AccountManager.new(user: params[:username])
32
+
33
+ # Add password as a temporary environment variable for altool.
34
+ # Use app specific password if specified.
35
+ ENV['FL_NOTARIZE_PASSWORD'] = ENV['FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD'] || apple_id_account.password
36
+
37
+ UI.message('Uploading package to notarization service, might take a while')
38
+
39
+ notarization_upload_command = "xcrun altool --notarize-app -t osx -f \"#{compressed_package_path || package_path}\" --primary-bundle-id #{bundle_id} -u #{apple_id_account.user} -p @env:FL_NOTARIZE_PASSWORD --output-format xml"
40
+ notarization_upload_command << " --asc-provider \"#{params[:asc_provider]}\"" if params[:asc_provider]
41
+
42
+ notarization_upload_response = Actions.sh(
43
+ notarization_upload_command,
44
+ log: verbose
45
+ )
46
+
47
+ FileUtils.rm_rf(compressed_package_path) if compressed_package_path
48
+
49
+ notarization_upload_plist = Plist.parse_xml(notarization_upload_response)
50
+ notarization_request_id = notarization_upload_plist['notarization-upload']['RequestUUID']
51
+
52
+ UI.success("Successfully uploaded package to notarization service with request identifier #{notarization_request_id}")
53
+
54
+ notarization_info = {}
55
+ while notarization_info.empty? || (notarization_info['Status'] == 'in progress')
56
+ if notarization_info.empty?
57
+ UI.message('Waiting to query request status')
58
+ elsif try_early_stapling
59
+ UI.message('Request in progress, trying early staple')
60
+
61
+ begin
62
+ self.staple(package_path, verbose)
63
+ UI.message('Successfully notarized and early stapled package.')
64
+
65
+ return
66
+ rescue
67
+ UI.message('Early staple failed, waiting to query again')
68
+ end
69
+ end
70
+
71
+ sleep(30)
72
+
73
+ UI.message('Querying request status')
74
+
75
+ notarization_info_response = Actions.sh(
76
+ "xcrun altool --notarization-info #{notarization_request_id} -u #{apple_id_account.user} -p @env:FL_NOTARIZE_PASSWORD --output-format xml",
77
+ log: verbose
78
+ )
79
+
80
+ notarization_info_plist = Plist.parse_xml(notarization_info_response)
81
+ notarization_info = notarization_info_plist['notarization-info']
82
+ end
83
+
84
+ log_url = notarization_info['LogFileURL']
85
+ ENV['FL_NOTARIZE_LOG_FILE_URL'] = log_url
86
+ log_suffix = ''
87
+ if log_url && print_log
88
+ log_response = Net::HTTP.get(URI(log_url))
89
+ log_json_object = JSON.parse(log_response)
90
+ log_suffix = ", with log:\n#{JSON.pretty_generate(log_json_object)}"
91
+ end
92
+
93
+ case notarization_info['Status']
94
+ when 'success'
95
+ UI.message('Stapling package')
96
+
97
+ self.staple(package_path, verbose)
98
+
99
+ UI.success("Successfully notarized and stapled package#{log_suffix}")
100
+ when 'invalid'
101
+ UI.user_error!("Could not notarize package with message '#{notarization_info['Status Message']}'#{log_suffix}")
102
+ else
103
+ UI.crash!("Could not notarize package with status '#{notarization_info['Status']}'#{log_suffix}")
104
+ end
105
+ ensure
106
+ ENV.delete('FL_NOTARIZE_PASSWORD')
107
+ end
108
+
109
+ def self.staple(package_path, verbose)
110
+ Actions.sh(
111
+ "xcrun stapler staple \"#{package_path}\"",
112
+ log: verbose
113
+ )
114
+ end
115
+
116
+ def self.description
117
+ 'Notarizes a macOS app'
118
+ end
119
+
120
+ def self.authors
121
+ ['zeplin']
122
+ end
123
+
124
+ def self.available_options
125
+ username = CredentialsManager::AppfileConfig.try_fetch_value(:apple_dev_portal_id)
126
+ username ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
127
+
128
+ asc_provider = CredentialsManager::AppfileConfig.try_fetch_value(:itc_team_id)
129
+
130
+ [
131
+ FastlaneCore::ConfigItem.new(key: :package,
132
+ env_name: 'FL_NOTARIZE_PACKAGE',
133
+ description: 'Path to package to notarize, e.g. .app bundle or disk image',
134
+ is_string: true,
135
+ verify_block: proc do |value|
136
+ UI.user_error!("Could not find package at '#{value}'") unless File.exist?(value)
137
+ end),
138
+ FastlaneCore::ConfigItem.new(key: :try_early_stapling,
139
+ env_name: 'FL_NOTARIZE_TRY_EARLY_STAPLING',
140
+ description: 'Whether to try early stapling while the notarization request is in progress',
141
+ optional: true,
142
+ default_value: false,
143
+ type: Boolean),
144
+ FastlaneCore::ConfigItem.new(key: :bundle_id,
145
+ env_name: 'FL_NOTARIZE_BUNDLE_ID',
146
+ description: 'Bundle identifier to uniquely identify the package',
147
+ optional: true,
148
+ is_string: true),
149
+ FastlaneCore::ConfigItem.new(key: :username,
150
+ env_name: 'FL_NOTARIZE_USERNAME',
151
+ description: 'Apple ID username',
152
+ default_value: username,
153
+ default_value_dynamic: true),
154
+ FastlaneCore::ConfigItem.new(key: :asc_provider,
155
+ env_name: 'FL_NOTARIZE_ASC_PROVIDER',
156
+ description: 'Provider short name for accounts associated with multiple providers',
157
+ optional: true,
158
+ default_value: asc_provider),
159
+ FastlaneCore::ConfigItem.new(key: :print_log,
160
+ env_name: 'FL_NOTARIZE_PRINT_LOG',
161
+ description: 'Whether to print notarization log file, listing issues on failure and warnings on success',
162
+ optional: true,
163
+ default_value: false,
164
+ type: Boolean),
165
+ FastlaneCore::ConfigItem.new(key: :verbose,
166
+ env_name: 'FL_NOTARIZE_VERBOSE',
167
+ description: 'Whether to log requests',
168
+ optional: true,
169
+ default_value: false,
170
+ type: Boolean)
171
+ ]
172
+ end
173
+
174
+ def self.is_supported?(platform)
175
+ platform == :mac
176
+ end
177
+
178
+ def self.category
179
+ :code_signing
180
+ end
181
+ end
182
+ end
183
+ end
@@ -434,8 +434,8 @@ module Fastlane
434
434
  access_key: ENV["S3_ACCESS_KEY"], # Required from user.
435
435
  secret_access_key: ENV["S3_SECRET_ACCESS_KEY"], # Required from user.
436
436
  bucket: ENV["S3_BUCKET"], # Required from user.
437
- ipa: "AppName.ipa", # Optional is you use `ipa` to build
438
- dsym: "AppName.app.dSYM.zip", # Optional is you use `ipa` to build
437
+ ipa: "AppName.ipa", # Optional if you use `ipa` to build
438
+ dsym: "AppName.app.dSYM.zip", # Optional if you use `ipa` to build
439
439
  path: "v{CFBundleShortVersionString}_b{CFBundleVersion}/", # This is actually the default.
440
440
  upload_metadata: true, # Upload version.json, plist and HTML. Set to false to skip uploading of these files.
441
441
  version_file_name: "app_version.json", # Name of the file to upload to S3. Defaults to "version.json"
@@ -15,6 +15,9 @@ module Fastlane
15
15
  end
16
16
  if params[:xcpretty_output]
17
17
  cmd += ["2>&1", "|", "xcpretty", "--#{params[:xcpretty_output]}"]
18
+ if params[:xcpretty_args]
19
+ cmd << (params[:xcpretty_args]).to_s
20
+ end
18
21
  cmd = %w(set -o pipefail &&) + cmd
19
22
  end
20
23
 
@@ -67,6 +70,11 @@ module Fastlane
67
70
  verify_block: proc do |value|
68
71
  UI.user_error!("Please pass a valid xcpretty output type: (#{xcpretty_output_types.join('|')})") unless xcpretty_output_types.include?(value)
69
72
  end),
73
+ FastlaneCore::ConfigItem.new(key: :xcpretty_args,
74
+ env_name: "FL_SPM_XCPRETTY_ARGS",
75
+ description: "Pass in xcpretty additional command line arguments (e.g. '--test --no-color' or '--tap --no-utf'), requires xcpretty_output to be specified also",
76
+ type: String,
77
+ optional: true),
70
78
  FastlaneCore::ConfigItem.new(key: :verbose,
71
79
  short_option: "-v",
72
80
  env_name: "FL_SPM_VERBOSE",
@@ -37,6 +37,7 @@ module Fastlane
37
37
  Actions.sh(command)
38
38
  rescue
39
39
  handle_swiftlint_error(params[:ignore_exit_status], $?.exitstatus)
40
+ raise if params[:raise_if_swiftlint_error]
40
41
  end
41
42
  end
42
43
 
@@ -106,10 +107,22 @@ module Fastlane
106
107
  is_string: false,
107
108
  type: Boolean,
108
109
  optional: true),
110
+ FastlaneCore::ConfigItem.new(key: :raise_if_swiftlint_error,
111
+ description: "Raises an error if swiftlint fails, so you can fail CI/CD jobs if necessary \
112
+ (true/false)",
113
+ default_value: false,
114
+ is_string: false,
115
+ type: Boolean,
116
+ optional: true),
109
117
  FastlaneCore::ConfigItem.new(key: :reporter,
110
- description: 'Choose output reporter',
118
+ description: "Choose output reporter. Available: xcode, json, csv, checkstyle, junit, html, \
119
+ emoji, sonarqube, markdown, github-actions-logging",
111
120
  is_string: true,
112
- optional: true),
121
+ optional: true,
122
+ verify_block: proc do |value|
123
+ available = ['xcode', 'json', 'csv', 'checkstyle', 'junit', 'html', 'emoji', 'sonarqube', 'markdown', 'github-actions-logging']
124
+ UI.user_error!("Available values are '#{available.join("', '")}'") unless available.include?(value)
125
+ end),
113
126
  FastlaneCore::ConfigItem.new(key: :quiet,
114
127
  description: "Don't print status logs like 'Linting <file>' & 'Done linting'",
115
128
  default_value: false,
@@ -161,7 +174,9 @@ module Fastlane
161
174
  "AppDelegate.swift",
162
175
  "path/to/project/Model.swift"
163
176
  ],
177
+ raise_if_swiftlint_error: true, # Allow fastlane to raise an error if swiftlint fails
164
178
  ignore_exit_status: true # Allow fastlane to continue even if SwiftLint returns a non-zero exit status
179
+
165
180
  )'
166
181
  ]
167
182
  end
@@ -10,8 +10,8 @@ module Fastlane
10
10
  find_gsp_path(params)
11
11
  find_api_token(params)
12
12
 
13
- if !params[:api_token] && !params[:gsp_path]
14
- UI.user_error!('Either Fabric API key or path to Firebase Crashlytics GoogleService-Info.plist must be given.')
13
+ if !params[:app_id] && !params[:gsp_path] && !params[:api_token]
14
+ UI.user_error!('Either Firebase Crashlytics App ID, path to GoogleService-Info.plist or legacy Fabric API key must be given.')
15
15
  end
16
16
 
17
17
  dsym_paths = []
@@ -87,7 +87,9 @@ module Fastlane
87
87
  UI.message("Uploading '#{path}'...")
88
88
  command = []
89
89
  command << File.expand_path(params[:binary_path]).shellescape
90
- if params[:gsp_path]
90
+ if params[:app_id]
91
+ command << "-ai #{params[:app_id].shellescape}"
92
+ elsif params[:gsp_path]
91
93
  command << "-gsp #{params[:gsp_path].shellescape}"
92
94
  elsif params[:api_token]
93
95
  command << "-a #{params[:api_token]}"
@@ -186,6 +188,14 @@ module Fastlane
186
188
  UI.user_error!("Couldn't find file at path '#{File.expand_path(value)}'") unless File.exist?(value)
187
189
  UI.user_error!("No Path to GoogleService-Info.plist for Firebase Crashlytics given, pass using `gsp_path: 'path'`") if value.to_s.length == 0
188
190
  end),
191
+ FastlaneCore::ConfigItem.new(key: :app_id,
192
+ env_name: "CRASHLYTICS_APP_ID",
193
+ sensitive: true,
194
+ optional: true,
195
+ description: "Firebase Crashlytics APP ID",
196
+ verify_block: proc do |value|
197
+ UI.user_error!("No App ID for Firebase Crashlytics given, pass using `app_id: 'appId'`") if value.to_s.length == 0
198
+ end),
189
199
  FastlaneCore::ConfigItem.new(key: :binary_path,
190
200
  env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_BINARY_PATH",
191
201
  description: "The path to the upload-symbols file of the Fabric app",
@@ -24,7 +24,7 @@ module Fastlane
24
24
  adb_path = File.join(android_home, "platform-tools", "adb")
25
25
  end
26
26
 
27
- self.adb_path = adb_path
27
+ self.adb_path = File.expand_path(adb_path)
28
28
  self.adb_host = adb_host
29
29
  end
30
30
 
@@ -373,7 +373,7 @@ module Fastlane
373
373
  # (a plugin may contain any number of actions)
374
374
  version_number = Fastlane::ActionCollector.determine_version(gem_name)
375
375
  references = Fastlane.const_get(module_name).all_classes.collect do |path|
376
- next unless File.dirname(path).end_with?("/actions") # we only want to match actions
376
+ next unless File.dirname(path).include?("/actions") # we only want to match actions
377
377
 
378
378
  File.basename(path).gsub("_action", "").gsub(".rb", "").to_sym # the _action is optional
379
379
  end
@@ -83,7 +83,7 @@ module Fastlane
83
83
 
84
84
  case command.method_name
85
85
  when "sh"
86
- error_callback = proc { |string_value| closure_argument_value = string_value }
86
+ error_callback = proc { |string_value| closure_argument_value = string_value } if parameter_map[:error_callback]
87
87
  command_param = parameter_map[:command]
88
88
  log_param = parameter_map[:log]
89
89
  action_return = Fastlane::FastFile.sh(command_param, log: log_param, error_callback: error_callback)
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.141.0'.freeze
2
+ VERSION = '2.142.0'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  RUBOCOP_REQUIREMENT = '0.49.1'.freeze
@@ -18,4 +18,4 @@ class Deliverfile: DeliverfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.141.0
21
+ // Generated with fastlane 2.142.0
@@ -2832,7 +2832,7 @@ func ensureEnvVars(envVars: [String]) {
2832
2832
  /**
2833
2833
  Raises an exception if not on a specific git branch
2834
2834
 
2835
- - parameter branch: The branch that should be checked for. String that can be either the full name of the branch or a regex to match
2835
+ - parameter branch: The branch that should be checked for. String that can be either the full name of the branch or a regex e.g. `^feature/.*$` to match
2836
2836
 
2837
2837
  This action will check if your git repo is checked out to a specific branch.
2838
2838
  You may only want to make releases from a specific branch, so `ensure_git_branch` will stop a lane if it was accidentally executed on an incorrect branch.
@@ -2892,14 +2892,19 @@ func ensureNoDebugCode(text: String,
2892
2892
  /**
2893
2893
  Ensure the right version of Xcode is used
2894
2894
 
2895
- - parameter version: Xcode version to verify that is selected
2895
+ - parameters:
2896
+ - version: Xcode version to verify that is selected
2897
+ - strict: Should the version be verified strictly (all 3 version numbers), or matching only the given version numbers (i.e. `11.3` == `11.3.x`)
2896
2898
 
2897
2899
  If building your app requires a specific version of Xcode, you can invoke this command before using gym.
2898
2900
  For example, to ensure that a beta version of Xcode is not accidentally selected to build, which would make uploading to TestFlight fail.
2899
2901
  You can either manually provide a specific version using `version: ` or you make use of the `.xcode-version` file.
2902
+ Using the `strict` parameter, you can either verify the full set of version numbers strictly (i.e. `11.3.1`) or only a subset of them (i.e. `11.3` or `11`).
2900
2903
  */
2901
- func ensureXcodeVersion(version: String? = nil) {
2902
- let command = RubyCommand(commandID: "", methodName: "ensure_xcode_version", className: nil, args: [RubyCommand.Argument(name: "version", value: version)])
2904
+ func ensureXcodeVersion(version: String? = nil,
2905
+ strict: Bool = true) {
2906
+ let command = RubyCommand(commandID: "", methodName: "ensure_xcode_version", className: nil, args: [RubyCommand.Argument(name: "version", value: version),
2907
+ RubyCommand.Argument(name: "strict", value: strict)])
2903
2908
  _ = runner.executeCommand(command)
2904
2909
  }
2905
2910
 
@@ -4612,6 +4617,35 @@ func nexusUpload(file: String,
4612
4617
  _ = runner.executeCommand(command)
4613
4618
  }
4614
4619
 
4620
+ /**
4621
+ Notarizes a macOS app
4622
+
4623
+ - parameters:
4624
+ - package: Path to package to notarize, e.g. .app bundle or disk image
4625
+ - tryEarlyStapling: Whether to try early stapling while the notarization request is in progress
4626
+ - bundleId: Bundle identifier to uniquely identify the package
4627
+ - username: Apple ID username
4628
+ - ascProvider: Provider short name for accounts associated with multiple providers
4629
+ - printLog: Whether to print notarization log file, listing issues on failure and warnings on success
4630
+ - verbose: Whether to log requests
4631
+ */
4632
+ func notarize(package: String,
4633
+ tryEarlyStapling: Bool = false,
4634
+ bundleId: String? = nil,
4635
+ username: String,
4636
+ ascProvider: String? = nil,
4637
+ printLog: Bool = false,
4638
+ verbose: Bool = false) {
4639
+ let command = RubyCommand(commandID: "", methodName: "notarize", className: nil, args: [RubyCommand.Argument(name: "package", value: package),
4640
+ RubyCommand.Argument(name: "try_early_stapling", value: tryEarlyStapling),
4641
+ RubyCommand.Argument(name: "bundle_id", value: bundleId),
4642
+ RubyCommand.Argument(name: "username", value: username),
4643
+ RubyCommand.Argument(name: "asc_provider", value: ascProvider),
4644
+ RubyCommand.Argument(name: "print_log", value: printLog),
4645
+ RubyCommand.Argument(name: "verbose", value: verbose)])
4646
+ _ = runner.executeCommand(command)
4647
+ }
4648
+
4615
4649
  /**
4616
4650
  Display a macOS notification with custom message and title
4617
4651
 
@@ -5584,6 +5618,7 @@ func rubyVersion() {
5584
5618
  - shouldZipBuildProducts: Should zip the derived data build products and place in output path?
5585
5619
  - resultBundle: Should an Xcode result bundle be generated in the output directory
5586
5620
  - useClangReportName: Generate the json compilation database with clang naming convention (compile_commands.json)
5621
+ - concurrentWorkers: Specify the exact number of test runners that will be spawned during parallel testing. Equivalent to -parallel-testing-worker-count
5587
5622
  - maxConcurrentSimulators: Constrain the number of simulator devices on which to test concurrently. Equivalent to -maximum-concurrent-test-simulator-destinations
5588
5623
  - disableConcurrentTesting: Do not run test bundles in parallel on the specified destinations. Testing will occur on each destination serially. Equivalent to -disable-concurrent-testing
5589
5624
  - skipBuild: Should debug build be skipped before test build?
@@ -5645,6 +5680,7 @@ func runTests(workspace: String? = nil,
5645
5680
  shouldZipBuildProducts: Bool = false,
5646
5681
  resultBundle: Bool = false,
5647
5682
  useClangReportName: Bool = false,
5683
+ concurrentWorkers: Int? = nil,
5648
5684
  maxConcurrentSimulators: Int? = nil,
5649
5685
  disableConcurrentTesting: Bool = false,
5650
5686
  skipBuild: Bool = false,
@@ -5703,6 +5739,7 @@ func runTests(workspace: String? = nil,
5703
5739
  RubyCommand.Argument(name: "should_zip_build_products", value: shouldZipBuildProducts),
5704
5740
  RubyCommand.Argument(name: "result_bundle", value: resultBundle),
5705
5741
  RubyCommand.Argument(name: "use_clang_report_name", value: useClangReportName),
5742
+ RubyCommand.Argument(name: "concurrent_workers", value: concurrentWorkers),
5706
5743
  RubyCommand.Argument(name: "max_concurrent_simulators", value: maxConcurrentSimulators),
5707
5744
  RubyCommand.Argument(name: "disable_concurrent_testing", value: disableConcurrentTesting),
5708
5745
  RubyCommand.Argument(name: "skip_build", value: skipBuild),
@@ -5842,6 +5879,7 @@ func say(text: Any,
5842
5879
  - shouldZipBuildProducts: Should zip the derived data build products and place in output path?
5843
5880
  - resultBundle: Should an Xcode result bundle be generated in the output directory
5844
5881
  - useClangReportName: Generate the json compilation database with clang naming convention (compile_commands.json)
5882
+ - concurrentWorkers: Specify the exact number of test runners that will be spawned during parallel testing. Equivalent to -parallel-testing-worker-count
5845
5883
  - maxConcurrentSimulators: Constrain the number of simulator devices on which to test concurrently. Equivalent to -maximum-concurrent-test-simulator-destinations
5846
5884
  - disableConcurrentTesting: Do not run test bundles in parallel on the specified destinations. Testing will occur on each destination serially. Equivalent to -disable-concurrent-testing
5847
5885
  - skipBuild: Should debug build be skipped before test build?
@@ -5903,6 +5941,7 @@ func scan(workspace: Any? = scanfile.workspace,
5903
5941
  shouldZipBuildProducts: Bool = scanfile.shouldZipBuildProducts,
5904
5942
  resultBundle: Bool = scanfile.resultBundle,
5905
5943
  useClangReportName: Bool = scanfile.useClangReportName,
5944
+ concurrentWorkers: Int? = scanfile.concurrentWorkers,
5906
5945
  maxConcurrentSimulators: Int? = scanfile.maxConcurrentSimulators,
5907
5946
  disableConcurrentTesting: Bool = scanfile.disableConcurrentTesting,
5908
5947
  skipBuild: Bool = scanfile.skipBuild,
@@ -5961,6 +6000,7 @@ func scan(workspace: Any? = scanfile.workspace,
5961
6000
  RubyCommand.Argument(name: "should_zip_build_products", value: shouldZipBuildProducts),
5962
6001
  RubyCommand.Argument(name: "result_bundle", value: resultBundle),
5963
6002
  RubyCommand.Argument(name: "use_clang_report_name", value: useClangReportName),
6003
+ RubyCommand.Argument(name: "concurrent_workers", value: concurrentWorkers),
5964
6004
  RubyCommand.Argument(name: "max_concurrent_simulators", value: maxConcurrentSimulators),
5965
6005
  RubyCommand.Argument(name: "disable_concurrent_testing", value: disableConcurrentTesting),
5966
6006
  RubyCommand.Argument(name: "skip_build", value: skipBuild),
@@ -6863,6 +6903,7 @@ func splunkmint(dsym: String? = nil,
6863
6903
  - xcconfig: Use xcconfig file to override swift package generate-xcodeproj defaults
6864
6904
  - configuration: Build with configuration (debug|release) [default: debug]
6865
6905
  - xcprettyOutput: Specifies the output type for xcpretty. eg. 'test', or 'simple'
6906
+ - xcprettyArgs: Pass in xcpretty additional command line arguments (e.g. '--test --no-color' or '--tap --no-utf'), requires xcpretty_output to be specified also
6866
6907
  - verbose: Increase verbosity of informational output
6867
6908
  */
6868
6909
  func spm(command: String = "build",
@@ -6871,6 +6912,7 @@ func spm(command: String = "build",
6871
6912
  xcconfig: String? = nil,
6872
6913
  configuration: String? = nil,
6873
6914
  xcprettyOutput: String? = nil,
6915
+ xcprettyArgs: String? = nil,
6874
6916
  verbose: Bool = false) {
6875
6917
  let command = RubyCommand(commandID: "", methodName: "spm", className: nil, args: [RubyCommand.Argument(name: "command", value: command),
6876
6918
  RubyCommand.Argument(name: "build_path", value: buildPath),
@@ -6878,6 +6920,7 @@ func spm(command: String = "build",
6878
6920
  RubyCommand.Argument(name: "xcconfig", value: xcconfig),
6879
6921
  RubyCommand.Argument(name: "configuration", value: configuration),
6880
6922
  RubyCommand.Argument(name: "xcpretty_output", value: xcprettyOutput),
6923
+ RubyCommand.Argument(name: "xcpretty_args", value: xcprettyArgs),
6881
6924
  RubyCommand.Argument(name: "verbose", value: verbose)])
6882
6925
  _ = runner.executeCommand(command)
6883
6926
  }
@@ -7033,7 +7076,8 @@ func supply(packageName: String,
7033
7076
  - strict: Fail on warnings? (true/false)
7034
7077
  - files: List of files to process
7035
7078
  - ignoreExitStatus: Ignore the exit status of the SwiftLint command, so that serious violations don't fail the build (true/false)
7036
- - reporter: Choose output reporter
7079
+ - raiseIfSwiftlintError: Raises an error if swiftlint fails, so you can fail CI/CD jobs if necessary (true/false)
7080
+ - reporter: Choose output reporter. Available: xcode, json, csv, checkstyle, junit, html, emoji, sonarqube, markdown, github-actions-logging
7037
7081
  - quiet: Don't print status logs like 'Linting <file>' & 'Done linting'
7038
7082
  - executable: Path to the `swiftlint` executable on your machine
7039
7083
  - format: Format code when mode is :autocorrect
@@ -7046,6 +7090,7 @@ func swiftlint(mode: Any = "lint",
7046
7090
  strict: Bool = false,
7047
7091
  files: Any? = nil,
7048
7092
  ignoreExitStatus: Bool = false,
7093
+ raiseIfSwiftlintError: Bool = false,
7049
7094
  reporter: String? = nil,
7050
7095
  quiet: Bool = false,
7051
7096
  executable: String? = nil,
@@ -7058,6 +7103,7 @@ func swiftlint(mode: Any = "lint",
7058
7103
  RubyCommand.Argument(name: "strict", value: strict),
7059
7104
  RubyCommand.Argument(name: "files", value: files),
7060
7105
  RubyCommand.Argument(name: "ignore_exit_status", value: ignoreExitStatus),
7106
+ RubyCommand.Argument(name: "raise_if_swiftlint_error", value: raiseIfSwiftlintError),
7061
7107
  RubyCommand.Argument(name: "reporter", value: reporter),
7062
7108
  RubyCommand.Argument(name: "quiet", value: quiet),
7063
7109
  RubyCommand.Argument(name: "executable", value: executable),
@@ -7690,6 +7736,7 @@ func updateUrlSchemes(path: String,
7690
7736
  - dsymPaths: Paths to the DSYM files or zips to upload
7691
7737
  - apiToken: Crashlytics API Key
7692
7738
  - gspPath: Path to GoogleService-Info.plist
7739
+ - appId: Firebase Crashlytics APP ID
7693
7740
  - binaryPath: The path to the upload-symbols file of the Fabric app
7694
7741
  - platform: The platform of the app (ios, appletvos, mac)
7695
7742
  - dsymWorkerThreads: The number of threads to use for simultaneous dSYM upload
@@ -7700,6 +7747,7 @@ func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji
7700
7747
  dsymPaths: [String]? = nil,
7701
7748
  apiToken: String? = nil,
7702
7749
  gspPath: String? = nil,
7750
+ appId: String? = nil,
7703
7751
  binaryPath: String? = nil,
7704
7752
  platform: String = "ios",
7705
7753
  dsymWorkerThreads: Int = 1) {
@@ -7707,6 +7755,7 @@ func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji
7707
7755
  RubyCommand.Argument(name: "dsym_paths", value: dsymPaths),
7708
7756
  RubyCommand.Argument(name: "api_token", value: apiToken),
7709
7757
  RubyCommand.Argument(name: "gsp_path", value: gspPath),
7758
+ RubyCommand.Argument(name: "app_id", value: appId),
7710
7759
  RubyCommand.Argument(name: "binary_path", value: binaryPath),
7711
7760
  RubyCommand.Argument(name: "platform", value: platform),
7712
7761
  RubyCommand.Argument(name: "dsym_worker_threads", value: dsymWorkerThreads)])
@@ -8632,4 +8681,4 @@ let snapshotfile: Snapshotfile = Snapshotfile()
8632
8681
 
8633
8682
  // Please don't remove the lines below
8634
8683
  // They are used to detect outdated files
8635
- // FastlaneRunnerAPIVersion [0.9.69]
8684
+ // FastlaneRunnerAPIVersion [0.9.70]