fastlane 2.224.0 → 2.232.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 (159) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +98 -92
  3. data/bin/fastlane +2 -2
  4. data/cert/lib/cert/options.rb +7 -2
  5. data/cert/lib/cert/runner.rb +23 -11
  6. data/deliver/lib/assets/summary.html.erb +3 -3
  7. data/deliver/lib/deliver/app_screenshot.rb +215 -347
  8. data/deliver/lib/deliver/app_screenshot_iterator.rb +4 -1
  9. data/deliver/lib/deliver/app_screenshot_validator.rb +5 -21
  10. data/deliver/lib/deliver/loader.rb +2 -9
  11. data/deliver/lib/deliver/options.rb +1 -1
  12. data/deliver/lib/deliver/runner.rb +1 -1
  13. data/deliver/lib/deliver/upload_metadata.rb +5 -0
  14. data/deliver/lib/deliver/upload_screenshots.rb +4 -2
  15. data/fastlane/lib/assets/completions/completion.bash +1 -1
  16. data/fastlane/lib/assets/completions/completion.sh +2 -2
  17. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +16 -15
  18. data/fastlane/lib/fastlane/actions/appium.rb +1 -1
  19. data/fastlane/lib/fastlane/actions/docs/create_app_online.md +6 -3
  20. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +12 -8
  21. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +56 -17
  22. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +13 -1
  23. data/fastlane/lib/fastlane/actions/get_version_number.rb +1 -1
  24. data/fastlane/lib/fastlane/actions/import_certificate.rb +9 -1
  25. data/fastlane/lib/fastlane/actions/import_from_git.rb +11 -4
  26. data/fastlane/lib/fastlane/actions/increment_build_number.rb +1 -1
  27. data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +3 -2
  28. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +2 -2
  29. data/fastlane/lib/fastlane/actions/modify_services.rb +1 -0
  30. data/fastlane/lib/fastlane/actions/notarize.rb +4 -0
  31. data/fastlane/lib/fastlane/actions/onesignal.rb +1 -1
  32. data/fastlane/lib/fastlane/actions/register_device.rb +1 -1
  33. data/fastlane/lib/fastlane/actions/register_devices.rb +1 -1
  34. data/fastlane/lib/fastlane/actions/setup_ci.rb +14 -4
  35. data/fastlane/lib/fastlane/actions/testfairy.rb +41 -4
  36. data/fastlane/lib/fastlane/actions/unlock_keychain.rb +6 -1
  37. data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +1 -1
  38. data/fastlane/lib/fastlane/actions/xcov.rb +1 -7
  39. data/fastlane/lib/fastlane/cli_tools_distributor.rb +9 -0
  40. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +4 -4
  41. data/fastlane/lib/fastlane/erb_template_helper.rb +1 -7
  42. data/fastlane/lib/fastlane/fast_file.rb +9 -6
  43. data/fastlane/lib/fastlane/helper/s3_client_helper.rb +4 -0
  44. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
  45. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +20 -20
  46. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +1 -1
  47. data/fastlane/lib/fastlane/version.rb +2 -1
  48. data/fastlane/swift/Actions.swift +1 -1
  49. data/fastlane/swift/Appfile.swift +13 -5
  50. data/fastlane/swift/ArgumentProcessor.swift +1 -1
  51. data/fastlane/swift/Atomic.swift +1 -1
  52. data/fastlane/swift/ControlCommand.swift +5 -4
  53. data/fastlane/swift/Deliverfile.swift +2 -2
  54. data/fastlane/swift/DeliverfileProtocol.swift +265 -68
  55. data/fastlane/swift/Fastlane.swift +187 -168
  56. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +3 -1
  57. data/fastlane/swift/Gymfile.swift +2 -2
  58. data/fastlane/swift/GymfileProtocol.swift +227 -54
  59. data/fastlane/swift/LaneFileProtocol.swift +7 -5
  60. data/fastlane/swift/MainProcess.swift +1 -1
  61. data/fastlane/swift/Matchfile.swift +2 -2
  62. data/fastlane/swift/MatchfileProtocol.swift +226 -59
  63. data/fastlane/swift/OptionalConfigValue.swift +1 -1
  64. data/fastlane/swift/Plugins.swift +1 -1
  65. data/fastlane/swift/Precheckfile.swift +2 -2
  66. data/fastlane/swift/PrecheckfileProtocol.swift +45 -13
  67. data/fastlane/swift/RubyCommand.swift +6 -7
  68. data/fastlane/swift/RubyCommandable.swift +1 -1
  69. data/fastlane/swift/Runner.swift +3 -3
  70. data/fastlane/swift/RunnerArgument.swift +1 -1
  71. data/fastlane/swift/Scanfile.swift +2 -2
  72. data/fastlane/swift/ScanfileProtocol.swift +334 -84
  73. data/fastlane/swift/Screengrabfile.swift +2 -2
  74. data/fastlane/swift/ScreengrabfileProtocol.swift +89 -24
  75. data/fastlane/swift/Snapshotfile.swift +2 -2
  76. data/fastlane/swift/SnapshotfileProtocol.swift +216 -53
  77. data/fastlane/swift/SocketClient.swift +7 -7
  78. data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
  79. data/fastlane/swift/SocketResponse.swift +1 -1
  80. data/fastlane/swift/formatting/Brewfile.lock.json +15 -25
  81. data/fastlane/swift/formatting/Rakefile +1 -2
  82. data/fastlane/swift/main.swift +1 -1
  83. data/fastlane_core/lib/assets/XMLTemplate.xml.erb +5 -1
  84. data/fastlane_core/lib/fastlane_core/cert_checker.rb +10 -0
  85. data/fastlane_core/lib/fastlane_core/command_executor.rb +3 -1
  86. data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +5 -1
  87. data/fastlane_core/lib/fastlane_core/helper.rb +6 -1
  88. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +4 -14
  89. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +19 -2
  90. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +143 -106
  91. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +3 -1
  92. data/fastlane_core/lib/fastlane_core/project.rb +8 -0
  93. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +7 -1
  94. data/frameit/lib/frameit/device.rb +2 -2
  95. data/frameit/lib/frameit/device_types.rb +108 -70
  96. data/frameit/lib/frameit/template_finder.rb +1 -1
  97. data/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh +1 -0
  98. data/gym/lib/gym/module.rb +9 -4
  99. data/gym/lib/gym/options.rb +20 -2
  100. data/gym/lib/gym/runner.rb +38 -3
  101. data/match/lib/assets/READMETemplate.md +2 -2
  102. data/match/lib/match/generator.rb +2 -2
  103. data/match/lib/match/options.rb +1 -0
  104. data/match/lib/match/runner.rb +1 -1
  105. data/match/lib/match/storage/s3_storage.rb +4 -7
  106. data/pilot/lib/pilot/build_manager.rb +7 -1
  107. data/precheck/lib/precheck/options.rb +1 -1
  108. data/produce/lib/produce/commands_generator.rb +2 -0
  109. data/produce/lib/produce/developer_center.rb +1 -0
  110. data/produce/lib/produce/options.rb +1 -1
  111. data/produce/lib/produce/service.rb +6 -1
  112. data/scan/lib/scan/error_handler.rb +5 -0
  113. data/scan/lib/scan/options.rb +13 -3
  114. data/scan/lib/scan/test_command_generator.rb +10 -2
  115. data/sigh/lib/assets/resign.sh +7 -5
  116. data/sigh/lib/sigh/local_manage.rb +6 -4
  117. data/sigh/lib/sigh/options.rb +1 -0
  118. data/sigh/lib/sigh/runner.rb +23 -3
  119. data/snapshot/lib/snapshot/detect_values.rb +1 -1
  120. data/snapshot/lib/snapshot/options.rb +13 -1
  121. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +4 -2
  122. data/spaceship/lib/spaceship/client.rb +153 -22
  123. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +65 -9
  124. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +4 -4
  125. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +7 -1
  126. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +16 -16
  127. data/spaceship/lib/spaceship/connect_api/models/build_upload.rb +42 -0
  128. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +2 -0
  129. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +33 -2
  130. data/spaceship/lib/spaceship/connect_api/models/device.rb +1 -2
  131. data/spaceship/lib/spaceship/connect_api/models/profile.rb +2 -3
  132. data/spaceship/lib/spaceship/connect_api/models/webhook.rb +62 -0
  133. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +0 -6
  134. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +9 -0
  135. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +38 -0
  136. data/spaceship/lib/spaceship/connect_api.rb +2 -0
  137. data/spaceship/lib/spaceship/errors.rb +23 -6
  138. data/spaceship/lib/spaceship/portal/key.rb +22 -3
  139. data/spaceship/lib/spaceship/portal/portal_client.rb +29 -2
  140. data/spaceship/lib/spaceship/spaceauth_runner.rb +5 -15
  141. data/supply/lib/supply/client.rb +18 -1
  142. data/supply/lib/supply/uploader.rb +22 -11
  143. data/trainer/lib/trainer/legacy_xcresult.rb +586 -0
  144. data/trainer/lib/trainer/options.rb +5 -0
  145. data/trainer/lib/trainer/plist_test_summary_parser.rb +84 -0
  146. data/trainer/lib/trainer/test_parser.rb +12 -293
  147. data/trainer/lib/trainer/xcresult/helper.rb +63 -0
  148. data/trainer/lib/trainer/xcresult/repetition.rb +39 -0
  149. data/trainer/lib/trainer/xcresult/test_case.rb +221 -0
  150. data/trainer/lib/trainer/xcresult/test_case_attributes.rb +49 -0
  151. data/trainer/lib/trainer/xcresult/test_plan.rb +91 -0
  152. data/trainer/lib/trainer/xcresult/test_suite.rb +134 -0
  153. data/trainer/lib/trainer/xcresult.rb +31 -388
  154. data/trainer/lib/trainer.rb +3 -1
  155. metadata +172 -33
  156. data/fastlane/lib/fastlane/actions/hipchat.rb +0 -200
  157. data/fastlane/lib/fastlane/core_ext/bundler_monkey_patch.rb +0 -14
  158. data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +0 -43
  159. data/fastlane/lib/fastlane/plugins/template/.travis.yml +0 -4
@@ -8,7 +8,7 @@ module Fastlane
8
8
  end
9
9
 
10
10
  case detect_provider(params)
11
- when 'circleci'
11
+ when 'circleci', 'codebuild'
12
12
  setup_output_paths
13
13
  end
14
14
 
@@ -20,7 +20,7 @@ module Fastlane
20
20
  end
21
21
 
22
22
  def self.detect_provider(params)
23
- params[:provider] || (Helper.is_circle_ci? ? 'circleci' : nil)
23
+ params[:provider] || (Helper.is_circle_ci? ? 'circleci' : nil) || (Helper.is_codebuild? ? 'codebuild' : nil)
24
24
  end
25
25
 
26
26
  def self.setup_keychain(params)
@@ -34,7 +34,7 @@ module Fastlane
34
34
  return
35
35
  end
36
36
 
37
- keychain_name = "fastlane_tmp_keychain"
37
+ keychain_name = params[:keychain_name]
38
38
  ENV["MATCH_KEYCHAIN_NAME"] = keychain_name
39
39
  ENV["MATCH_KEYCHAIN_PASSWORD"] = ""
40
40
 
@@ -108,7 +108,12 @@ module Fastlane
108
108
  env_name: "FL_SETUP_CI_TIMEOUT",
109
109
  description: "Set a custom timeout in seconds for keychain. Set `0` if you want to specify 'no time-out'",
110
110
  type: Integer,
111
- default_value: 3600)
111
+ default_value: 3600),
112
+ FastlaneCore::ConfigItem.new(key: :keychain_name,
113
+ env_name: "FL_SETUP_CI_KEYCHAIN_NAME",
114
+ description: "Set a custom keychain name",
115
+ type: String,
116
+ default_value: "fastlane_tmp_keychain")
112
117
  ]
113
118
  end
114
119
 
@@ -128,6 +133,11 @@ module Fastlane
128
133
  'setup_ci(
129
134
  provider: "circleci",
130
135
  timeout: 0
136
+ )',
137
+ 'setup_ci(
138
+ provider: "circleci",
139
+ timeout: 0,
140
+ keychain_name: "custom_keychain_name"
131
141
  )'
132
142
  ]
133
143
  end
@@ -98,6 +98,14 @@ module Fastlane
98
98
  [key, value]
99
99
  when :tags
100
100
  [key, value.join(',')]
101
+ when :folder_name
102
+ [key, value]
103
+ when :landing_page_mode
104
+ [key, value]
105
+ when :upload_to_saucelabs
106
+ [key, value]
107
+ when :platform
108
+ [key, value]
101
109
  else
102
110
  UI.user_error!("Unknown parameter: #{key}")
103
111
  end
@@ -143,11 +151,14 @@ module Fastlane
143
151
  private_class_method :parse_response
144
152
 
145
153
  def self.description
146
- 'Upload a new build to [TestFairy](https://www.testfairy.com/)'
154
+ 'Upload a new build to SauceLabs\' TestFairy'
147
155
  end
148
156
 
149
157
  def self.details
150
- "You can retrieve your API key on [your settings page](https://free.testfairy.com/settings/)"
158
+ <<~DETAILS
159
+ Upload a new build to [TestFairy](https://saucelabs.com/products/mobile-testing/app-betas).
160
+ You can retrieve your API key on [your settings page](https://app.testfairy.com/settings/access-key)
161
+ DETAILS
151
162
  end
152
163
 
153
164
  def self.available_options
@@ -237,7 +248,7 @@ module Fastlane
237
248
  FastlaneCore::ConfigItem.new(key: :custom,
238
249
  optional: true,
239
250
  env_name: "FL_TESTFAIRY_CUSTOM",
240
- description: "Array of custom options. Contact support@testfairy.com for more information",
251
+ description: "Array of custom options. Contact support for more information",
241
252
  default_value: ''),
242
253
  FastlaneCore::ConfigItem.new(key: :timeout,
243
254
  env_name: "FL_TESTFAIRY_TIMEOUT",
@@ -249,7 +260,33 @@ module Fastlane
249
260
  env_name: "FL_TESTFAIRY_TAGS",
250
261
  description: "Custom tags that can be used to organize your builds",
251
262
  type: Array,
252
- default_value: [])
263
+ default_value: []),
264
+ FastlaneCore::ConfigItem.new(key: :folder_name,
265
+ optional: true,
266
+ env_name: "FL_TESTFAIRY_FOLDER_NAME",
267
+ description: "Name of the dashboard folder that contains this app",
268
+ default_value: ''),
269
+ FastlaneCore::ConfigItem.new(key: :landing_page_mode,
270
+ optional: true,
271
+ env_name: "FL_TESTFAIRY_LANDING_PAGE_MODE",
272
+ description: "Visibility of build landing after upload. Can be 'open' or 'closed'",
273
+ default_value: 'open',
274
+ verify_block: proc do |value|
275
+ UI.user_error!("The landing page mode can only be open or closed") unless %w(open closed).include?(value)
276
+ end),
277
+ FastlaneCore::ConfigItem.new(key: :upload_to_saucelabs,
278
+ optional: true,
279
+ env_name: "FL_TESTFAIRY_UPLOAD_TO_SAUCELABS",
280
+ description: "Upload file directly to Sauce Labs. It can be 'on' or 'off'",
281
+ default_value: 'off',
282
+ verify_block: proc do |value|
283
+ UI.user_error!("The upload to Sauce Labs can only be on or off") unless %w(on off).include?(value)
284
+ end),
285
+ FastlaneCore::ConfigItem.new(key: :platform,
286
+ optional: true,
287
+ env_name: "FL_TESTFAIRY_PLATFORM",
288
+ description: "Use if upload build is not iOS or Android. Contact support for more information",
289
+ default_value: '')
253
290
  ]
254
291
  end
255
292
 
@@ -42,7 +42,12 @@ module Fastlane
42
42
  end
43
43
 
44
44
  def self.replace_keychain_in_search_list(keychain_path)
45
- Actions.lane_context[Actions::SharedValues::ORIGINAL_DEFAULT_KEYCHAIN] = Fastlane::Actions.sh("security default-keychain", log: false).strip
45
+ begin
46
+ UI.message("Reading existing default keychain")
47
+ Actions.lane_context[Actions::SharedValues::ORIGINAL_DEFAULT_KEYCHAIN] = Fastlane::Actions.sh("security default-keychain").strip
48
+ rescue => e
49
+ raise unless e.message.include?("security: SecKeychainCopyDefault: A default keychain could not be found.")
50
+ end
46
51
  escaped_path = keychain_path.shellescape
47
52
  Fastlane::Actions.sh("security list-keychains -s #{escaped_path}", log: false)
48
53
  end
@@ -49,7 +49,7 @@ module Fastlane
49
49
  end
50
50
 
51
51
  def self.is_supported?(platform)
52
- [:ios, :mac].include?(platform)
52
+ [:ios, :mac, :xros].include?(platform)
53
53
  end
54
54
 
55
55
  def self.example_code
@@ -20,7 +20,7 @@ module Fastlane
20
20
  def self.details
21
21
  [
22
22
  "Create nice code coverage reports and post coverage summaries on Slack *(xcov gem is required)*.",
23
- "More information: [https://github.com/nakiostudio/xcov](https://github.com/nakiostudio/xcov)."
23
+ "More information: [https://github.com/fastlane-community/xcov](https://github.com/fastlane-community/xcov)."
24
24
  ].join("\n")
25
25
  end
26
26
 
@@ -31,12 +31,6 @@ module Fastlane
31
31
  def self.available_options
32
32
  return [] unless Helper.mac?
33
33
 
34
- # We call Gem::Specification.find_by_name in many more places than this, but for right now
35
- # this is the only place we're having trouble. If there are other reports about RubyGems
36
- # 2.6.2 causing problems, we may need to move this code and require it someplace better,
37
- # like fastlane_core
38
- require 'fastlane/core_ext/bundler_monkey_patch'
39
-
40
34
  begin
41
35
  Gem::Specification.find_by_name('xcov')
42
36
  rescue Gem::LoadError
@@ -65,6 +65,15 @@ module Fastlane
65
65
  end
66
66
  end
67
67
 
68
+ # Ruby version warning
69
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new(Fastlane::SUGGESTED_MINIMUM_RUBY) && !FastlaneCore::Env.truthy?("FASTLANE_SKIP_RUBY_VERSION_WARNING")
70
+ warn = "WARNING: Support for your Ruby version (#{RUBY_VERSION}) is going away. fastlane will soon require Ruby #{Fastlane::SUGGESTED_MINIMUM_RUBY} or newer."
71
+ UI.important(warn)
72
+ at_exit do
73
+ UI.important(warn)
74
+ end
75
+ end
76
+
68
77
  # Needs to go after load_dot_env for variable FASTLANE_SKIP_UPDATE_CHECK
69
78
  FastlaneCore::UpdateChecker.start_looking_for_update('fastlane')
70
79
 
@@ -97,7 +97,7 @@ module Fastlane
97
97
  if File.exist?(custom_file_location)
98
98
  UI.verbose("Using custom md.erb file for action #{action.action_name}")
99
99
 
100
- result = ERB.new(File.read(custom_file_location), 0, '-').result(binding) # https://web.archive.org/web/20160430190141/www.rrn.dk/rubys-erb-templating-system
100
+ result = ERB.new(File.read(custom_file_location), trim_mode: '-').result(binding) # https://web.archive.org/web/20160430190141/www.rrn.dk/rubys-erb-templating-system
101
101
 
102
102
  return result
103
103
  end
@@ -122,7 +122,7 @@ module Fastlane
122
122
  end
123
123
 
124
124
  template = File.join(Fastlane::ROOT, "lib/assets/ActionDetails.md.erb")
125
- result = ERB.new(File.read(template), 0, '-').result(binding)
125
+ result = ERB.new(File.read(template), trim_mode: '-').result(binding)
126
126
 
127
127
  action_mds[action.action_name] = result
128
128
  end
@@ -139,7 +139,7 @@ module Fastlane
139
139
 
140
140
  # Generate actions.md
141
141
  template = File.join(Fastlane::ROOT, "lib/assets/Actions.md.erb")
142
- result = ERB.new(File.read(template), 0, '-').result(binding) # https://web.archive.org/web/20160430190141/www.rrn.dk/rubys-erb-templating-system
142
+ result = ERB.new(File.read(template), trim_mode: '-').result(binding) # https://web.archive.org/web/20160430190141/www.rrn.dk/rubys-erb-templating-system
143
143
  File.write(File.join(docs_dir, "generated", "actions.md"), result)
144
144
 
145
145
  # Generate actions sub pages (e.g. generated/actions/slather.md, generated/actions/scan.md)
@@ -165,7 +165,7 @@ module Fastlane
165
165
  end
166
166
 
167
167
  template = File.join(Fastlane::ROOT, "lib/assets/ActionDetails.md.erb")
168
- result = ERB.new(File.read(template), 0, '-').result(binding) # https://web.archive.org/web/20160430190141/www.rrn.dk/rubys-erb-templating-system
168
+ result = ERB.new(File.read(template), trim_mode: '-').result(binding) # https://web.archive.org/web/20160430190141/www.rrn.dk/rubys-erb-templating-system
169
169
 
170
170
  # Actions get placed in "generated/actions" directory
171
171
  file_name = File.join(generated_actions_dir, "#{action.action_name}.md")
@@ -26,13 +26,7 @@ module Fastlane
26
26
  end
27
27
 
28
28
  def render(template)
29
- # From Ruby 2.6, ERB.new takes keyword arguments and positional ones are deprecated
30
- # https://bugs.ruby-lang.org/issues/14256
31
- if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.6.0")
32
- ERB.new(template, trim_mode: @trim_mode).result(binding)
33
- else
34
- ERB.new(template, nil, @trim_mode).result(binding)
35
- end
29
+ ERB.new(template, trim_mode: @trim_mode).result(binding)
36
30
  end
37
31
  end
38
32
  end
@@ -278,7 +278,8 @@ module Fastlane
278
278
  # @param version [String, Array] Version requirement for repo tags
279
279
  # @param dependencies [Array] An optional array of additional Fastfiles in the repository
280
280
  # @param cache_path [String] An optional path to a directory where the repository should be cloned into
281
- def import_from_git(url: nil, branch: 'HEAD', path: 'fastlane/Fastfile', version: nil, dependencies: [], cache_path: nil) # rubocop:disable Metrics/PerceivedComplexity
281
+ # @param git_extra_headers [Array] An optional array of custom HTTP headers to access the git repo (`Authorization: Basic <YOUR BASE64 KEY>`, `Cache-Control: no-cache`, etc.)
282
+ def import_from_git(url: nil, branch: 'HEAD', path: 'fastlane/Fastfile', version: nil, dependencies: [], cache_path: nil, git_extra_headers: []) # rubocop:disable Metrics/PerceivedComplexity
282
283
  UI.user_error!("Please pass a path to the `import_from_git` action") if url.to_s.length == 0
283
284
 
284
285
  Actions.execute_action('import_from_git') do
@@ -297,8 +298,6 @@ module Fastlane
297
298
  import_block = proc do |target_path|
298
299
  clone_folder = File.join(target_path, repo_name)
299
300
 
300
- branch_option = "--branch #{branch}" if branch != 'HEAD'
301
-
302
301
  checkout_dependencies = dependencies.map(&:shellescape).join(" ")
303
302
 
304
303
  # If the current call is eligible for caching, we check out all the
@@ -309,12 +308,16 @@ module Fastlane
309
308
  if Dir[clone_folder].empty?
310
309
  UI.message("Cloning remote git repo...")
311
310
  Helper.with_env_values('GIT_TERMINAL_PROMPT' => '0') do
311
+ command = ['git', 'clone', url, clone_folder, '--no-checkout']
312
312
  # When using cached clones, we need the entire repository history
313
313
  # so we can switch between tags or branches instantly, or else,
314
314
  # it would defeat the caching's purpose.
315
- depth = is_eligible_for_caching ? "" : "--depth 1"
316
-
317
- Actions.sh("git clone #{url.shellescape} #{clone_folder.shellescape} #{depth} --no-checkout #{branch_option}")
315
+ command += ['--depth', '1'] unless is_eligible_for_caching
316
+ command += ['--branch', branch] unless branch == 'HEAD'
317
+ git_extra_headers.each do |header|
318
+ command += ['--config', "http.extraHeader=#{header}"]
319
+ end
320
+ Actions.sh(*command)
318
321
  end
319
322
  end
320
323
 
@@ -39,6 +39,10 @@ module Fastlane
39
39
  obj.public_url.to_s
40
40
  end
41
41
 
42
+ def download_file(bucket_name, key, destination_path)
43
+ Aws::S3::TransferManager.new(client: client).download_file(destination_path, bucket: bucket_name, key: key)
44
+ end
45
+
42
46
  def delete_file(bucket_name, file_name)
43
47
  bucket = find_bucket!(bucket_name)
44
48
  file = bucket.object(file_name)
@@ -15,7 +15,7 @@ Gem::Specification.new do |spec|
15
15
  spec.files = Dir["lib/**/*"] + %w(README.md LICENSE)
16
16
  spec.require_paths = ['lib']
17
17
  spec.metadata['rubygems_mfa_required'] = 'true'
18
- spec.required_ruby_version = '>= 2.6'
18
+ spec.required_ruby_version = '>= 2.7'
19
19
 
20
20
  # Don't add a dependency to fastlane or fastlane_re
21
21
  # since this would cause a circular dependency
@@ -6,24 +6,24 @@ on:
6
6
  jobs:
7
7
  test:
8
8
  runs-on: ubuntu-latest
9
+ strategy:
10
+ matrix:
11
+ ruby-version: ['3.0', '3.1', '3.2', '3.3', '3.4']
9
12
  steps:
10
- - uses: actions/checkout@v2
11
- - uses: actions/cache@v1
12
- with:
13
- path: vendor/bundle
14
- key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile') }}
15
- restore-keys: |
16
- ${{ runner.os }}-gem-
17
- - name: Set up Ruby
18
- uses: ruby/setup-ruby@v1
19
- with:
20
- ruby-version: 2.5
21
- - name: Install dependencies
22
- run: bundle check || bundle install --jobs=4 --retry=3 --path vendor/bundle
23
- - name: Run tests
24
- run: bundle exec rake
25
- - name: Upload artifact
26
- uses: actions/upload-artifact@v2
27
- with:
28
- name: test-results
29
- path: test-results
13
+ - uses: actions/checkout@v6
14
+
15
+ - name: Set up Ruby
16
+ uses: ruby/setup-ruby@v1
17
+ with:
18
+ ruby-version: ${{ matrix.ruby-version }}
19
+ bundler-cache: true
20
+
21
+ - name: Run tests
22
+ run: bundle exec rake
23
+
24
+ - name: Upload artifact
25
+ uses: actions/upload-artifact@v5
26
+ if: failure()
27
+ with:
28
+ name: test-results-ruby-${{ matrix.ruby-version }}
29
+ path: test-results
@@ -3,7 +3,7 @@ require:
3
3
  - rubocop/require_tools
4
4
  - rubocop-performance
5
5
  AllCops:
6
- TargetRubyVersion: 2.6
6
+ TargetRubyVersion: 2.7
7
7
  NewCops: enable
8
8
  Include:
9
9
  - "**/*.rb"
@@ -1,7 +1,8 @@
1
1
  module Fastlane
2
- VERSION = '2.224.0'.freeze
2
+ VERSION = '2.232.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
6
6
  RUBOCOP_REQUIREMENT = '1.50.2'.freeze
7
+ SUGGESTED_MINIMUM_RUBY = '3.2.0'.freeze
7
8
  end
@@ -1,5 +1,5 @@
1
1
  // Actions.swift
2
- // Copyright (c) 2024 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  // This autogenerated file will be overwritten or replaced when running "fastlane generate_swift"
5
5
  //
@@ -1,11 +1,19 @@
1
1
  // Appfile.swift
2
- // Copyright (c) 2024 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
- var appIdentifier: String { return "" } // The bundle identifier of your app
5
- var appleID: String { return "" } // Your Apple Developer Portal username
4
+ var appIdentifier: String {
5
+ return ""
6
+ } // The bundle identifier of your app
7
+ var appleID: String {
8
+ return ""
9
+ } // Your Apple Developer Portal username
6
10
 
7
- var teamID: String { return "" } // Developer Portal Team ID
8
- var itcTeam: String? { return nil } // App Store Connect Team ID (may be nil if no team)
11
+ var teamID: String {
12
+ return ""
13
+ } // Developer Portal Team ID
14
+ var itcTeam: String? {
15
+ return nil
16
+ } // App Store Connect Team ID (may be nil if no team)
9
17
 
10
18
  // you can even provide different app identifiers, Apple IDs and team names per lane:
11
19
  // More information: https://docs.fastlane.tools/advanced/#appfile
@@ -1,5 +1,5 @@
1
1
  // ArgumentProcessor.swift
2
- // Copyright (c) 2024 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  //
5
5
  // ** NOTE **
@@ -1,5 +1,5 @@
1
1
  // Atomic.swift
2
- // Copyright (c) 2024 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  import Foundation
5
5
 
@@ -1,5 +1,5 @@
1
1
  // ControlCommand.swift
2
- // Copyright (c) 2024 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  //
5
5
  // ** NOTE **
@@ -12,7 +12,9 @@ import Foundation
12
12
 
13
13
  struct ControlCommand: RubyCommandable {
14
14
  static let commandKey = "command"
15
- var type: CommandType { return .control }
15
+ var type: CommandType {
16
+ return .control
17
+ }
16
18
 
17
19
  enum ShutdownCommandType {
18
20
  static let userMessageKey: String = "userMessage"
@@ -59,8 +61,7 @@ struct ControlCommand: RubyCommandable {
59
61
  }
60
62
 
61
63
  let jsonData = try! JSONSerialization.data(withJSONObject: jsonDictionary, options: [])
62
- let jsonString = String(data: jsonData, encoding: .utf8)!
63
- return jsonString
64
+ return String(data: jsonData, encoding: .utf8)!
64
65
  }
65
66
 
66
67
  init(commandType: ShutdownCommandType, message: String? = nil) {
@@ -1,5 +1,5 @@
1
1
  // Deliverfile.swift
2
- // Copyright (c) 2024 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  // This class is automatically included in FastlaneRunner during build
5
5
 
@@ -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.224.0
20
+ // Generated with fastlane 2.232.0