fastlane 2.238.0 → 2.241.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 (192) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +57 -177
  3. data/bin/fastlane +4 -2
  4. data/credentials_manager/README.md +1 -1
  5. data/credentials_manager/lib/credentials_manager/account_manager.rb +6 -2
  6. data/deliver/lib/deliver/app_screenshot.rb +0 -4
  7. data/deliver/lib/deliver/commands_generator.rb +1 -1
  8. data/deliver/lib/deliver/detect_values.rb +3 -1
  9. data/deliver/lib/deliver/download_screenshots.rb +8 -1
  10. data/deliver/lib/deliver/html_generator.rb +1 -1
  11. data/deliver/lib/deliver/options.rb +8 -0
  12. data/deliver/lib/deliver/runner.rb +5 -4
  13. data/deliver/lib/deliver/sync_screenshots.rb +27 -28
  14. data/deliver/lib/deliver/upload_app_clip_default_experience_header_images.rb +3 -3
  15. data/deliver/lib/deliver/upload_metadata.rb +34 -16
  16. data/deliver/lib/deliver/upload_screenshots.rb +24 -18
  17. data/docs/README.md +25 -0
  18. data/fastlane/lib/assets/TeamTable.md.erb +28 -0
  19. data/fastlane/lib/fastlane/actions/appaloosa.rb +2 -1
  20. data/fastlane/lib/fastlane/actions/appium.rb +1 -1
  21. data/fastlane/lib/fastlane/actions/apteligent.rb +8 -1
  22. data/fastlane/lib/fastlane/actions/build_and_upload_to_appetize.rb +3 -1
  23. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +7 -2
  24. data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +3 -0
  25. data/fastlane/lib/fastlane/actions/danger.rb +5 -5
  26. data/fastlane/lib/fastlane/actions/docs/build_app.md +1 -2
  27. data/fastlane/lib/fastlane/actions/docs/create_app_online.md +1 -2
  28. data/fastlane/lib/fastlane/actions/docs/get_certificates.md +0 -2
  29. data/fastlane/lib/fastlane/actions/docs/get_push_certificate.md +7 -3
  30. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +13 -3
  31. data/fastlane/lib/fastlane/actions/ensure_no_debug_code.rb +2 -2
  32. data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +1 -0
  33. data/fastlane/lib/fastlane/actions/github_api.rb +1 -2
  34. data/fastlane/lib/fastlane/actions/hg_commit_version_bump.rb +1 -1
  35. data/fastlane/lib/fastlane/actions/increment_build_number.rb +1 -1
  36. data/fastlane/lib/fastlane/actions/increment_version_number.rb +1 -1
  37. data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +16 -6
  38. data/fastlane/lib/fastlane/actions/lcov.rb +11 -2
  39. data/fastlane/lib/fastlane/actions/nexus_upload.rb +16 -4
  40. data/fastlane/lib/fastlane/actions/notification.rb +3 -2
  41. data/fastlane/lib/fastlane/actions/oclint.rb +8 -8
  42. data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +9 -4
  43. data/fastlane/lib/fastlane/actions/register_device.rb +1 -1
  44. data/fastlane/lib/fastlane/actions/say.rb +2 -4
  45. data/fastlane/lib/fastlane/actions/set_pod_key.rb +3 -3
  46. data/fastlane/lib/fastlane/actions/sonar.rb +16 -16
  47. data/fastlane/lib/fastlane/actions/sourcedocs.rb +8 -8
  48. data/fastlane/lib/fastlane/actions/spaceship_logs.rb +4 -2
  49. data/fastlane/lib/fastlane/actions/splunkmint.rb +8 -1
  50. data/fastlane/lib/fastlane/actions/swiftlint.rb +6 -3
  51. data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +4 -2
  52. data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +5 -2
  53. data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +5 -2
  54. data/fastlane/lib/fastlane/actions/verify_build.rb +1 -4
  55. data/fastlane/lib/fastlane/actions/verify_pod_keys.rb +3 -1
  56. data/fastlane/lib/fastlane/actions/xcode_server_get_assets.rb +20 -19
  57. data/fastlane/lib/fastlane/actions/xcodebuild.rb +5 -6
  58. data/fastlane/lib/fastlane/actions/zip.rb +2 -1
  59. data/fastlane/lib/fastlane/auto_complete.rb +1 -1
  60. data/fastlane/lib/fastlane/cli_tools_distributor.rb +14 -0
  61. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +23 -0
  62. data/fastlane/lib/fastlane/environment_printer.rb +12 -25
  63. data/fastlane/lib/fastlane/fast_file.rb +2 -1
  64. data/fastlane/lib/fastlane/fastlane_require.rb +5 -1
  65. data/fastlane/lib/fastlane/helper/git_helper.rb +4 -2
  66. data/fastlane/lib/fastlane/helper/sh_helper.rb +25 -7
  67. data/fastlane/lib/fastlane/new_action.rb +1 -1
  68. data/fastlane/lib/fastlane/plugins/plugin_fetcher.rb +1 -1
  69. data/fastlane/lib/fastlane/plugins/plugin_info_collector.rb +1 -1
  70. data/fastlane/lib/fastlane/plugins/plugin_manager.rb +36 -4
  71. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
  72. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +1 -1
  73. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +7 -7
  74. data/fastlane/lib/fastlane/swift_lane_manager.rb +22 -4
  75. data/fastlane/lib/fastlane/version.rb +3 -2
  76. data/fastlane/swift/Deliverfile.swift +1 -1
  77. data/fastlane/swift/DeliverfileProtocol.swift +8 -1
  78. data/fastlane/swift/Fastlane.swift +129 -11
  79. data/fastlane/swift/Gymfile.swift +1 -1
  80. data/fastlane/swift/GymfileProtocol.swift +8 -1
  81. data/fastlane/swift/MainProcess.swift +190 -20
  82. data/fastlane/swift/Matchfile.swift +1 -1
  83. data/fastlane/swift/MatchfileProtocol.swift +10 -3
  84. data/fastlane/swift/Precheckfile.swift +1 -1
  85. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  86. data/fastlane/swift/Scanfile.swift +1 -1
  87. data/fastlane/swift/ScanfileProtocol.swift +15 -1
  88. data/fastlane/swift/Screengrabfile.swift +1 -1
  89. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  90. data/fastlane/swift/Snapshotfile.swift +1 -1
  91. data/fastlane/swift/SnapshotfileProtocol.swift +8 -1
  92. data/fastlane/swift/formatting/Rakefile +1 -0
  93. data/fastlane/swift/main.swift +4 -1
  94. data/fastlane_core/README.md +1 -1
  95. data/fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb +1 -17
  96. data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +23 -8
  97. data/fastlane_core/lib/fastlane_core/device_manager.rb +2 -2
  98. data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +20 -7
  99. data/fastlane_core/lib/fastlane_core/helper.rb +34 -5
  100. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +1 -1
  101. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +16 -27
  102. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +31 -28
  103. data/fastlane_core/lib/fastlane_core/languages.rb +0 -1
  104. data/fastlane_core/lib/fastlane_core/print_table.rb +5 -2
  105. data/fastlane_core/lib/fastlane_core/project.rb +19 -0
  106. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +10 -19
  107. data/fastlane_core/lib/fastlane_core/secrets.rb +77 -0
  108. data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +3 -3
  109. data/fastlane_core/lib/fastlane_core/ui/github_issue_inspector_reporter.rb +1 -1
  110. data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +2 -1
  111. data/fastlane_core/lib/fastlane_core.rb +1 -0
  112. data/frameit/lib/frameit/device.rb +1 -1
  113. data/frameit/lib/frameit/frame_downloader.rb +2 -0
  114. data/frameit/lib/frameit/runner.rb +3 -2
  115. data/frameit/lib/frameit/screenshot.rb +0 -1
  116. data/gym/lib/gym/generators/build_command_generator.rb +4 -4
  117. data/gym/lib/gym/generators/package_command_generator_xcode7.rb +3 -3
  118. data/gym/lib/gym/options.rb +5 -0
  119. data/gym/lib/gym/runner.rb +1 -1
  120. data/internal/README.md +1 -1
  121. data/match/lib/match/encryption/openssl.rb +6 -2
  122. data/match/lib/match/generator.rb +1 -0
  123. data/match/lib/match/nuke.rb +2 -2
  124. data/match/lib/match/options.rb +13 -5
  125. data/match/lib/match/runner.rb +30 -3
  126. data/match/lib/match/storage/git_storage.rb +44 -11
  127. data/match/lib/match/storage/gitlab/secure_file.rb +2 -1
  128. data/match/lib/match/storage/google_cloud_storage.rb +6 -1
  129. data/match/lib/match/storage/interface.rb +8 -5
  130. data/pem/lib/pem/manager.rb +5 -1
  131. data/pem/lib/pem/module.rb +0 -4
  132. data/pem/lib/pem/options.rb +6 -0
  133. data/pilot/lib/pilot/build_manager.rb +32 -0
  134. data/pilot/lib/pilot/options.rb +8 -0
  135. data/precheck/lib/precheck/rule_processor.rb +1 -0
  136. data/produce/lib/produce/developer_center.rb +49 -2
  137. data/produce/lib/produce/itunes_connect.rb +1 -1
  138. data/produce/lib/produce/module.rb +21 -0
  139. data/produce/lib/produce/options.rb +17 -0
  140. data/produce/lib/produce/service.rb +3 -5
  141. data/produce/lib/produce.rb +0 -1
  142. data/scan/lib/scan/options.rb +12 -0
  143. data/scan/lib/scan/runner.rb +1 -1
  144. data/scan/lib/scan/test_command_generator.rb +12 -9
  145. data/scan/lib/scan/test_result_parser.rb +1 -0
  146. data/scan/lib/scan/xcpretty_reporter_options_generator.rb +2 -2
  147. data/screengrab/lib/screengrab/page.html.erb +12 -7
  148. data/screengrab/lib/screengrab/reports_generator.rb +1 -1
  149. data/sigh/lib/assets/resign.sh +38 -9
  150. data/sigh/lib/sigh/local_manage.rb +1 -1
  151. data/sigh/lib/sigh/options.rb +5 -0
  152. data/sigh/lib/sigh/resign.rb +3 -3
  153. data/sigh/lib/sigh/runner.rb +6 -1
  154. data/snapshot/lib/snapshot/options.rb +5 -0
  155. data/snapshot/lib/snapshot/page.html.erb +17 -12
  156. data/snapshot/lib/snapshot/reports_generator.rb +1 -1
  157. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +1 -1
  158. data/snapshot/lib/snapshot.rb +0 -2
  159. data/spaceship/README.md +2 -3
  160. data/spaceship/lib/spaceship/base.rb +3 -1
  161. data/spaceship/lib/spaceship/client.rb +159 -19
  162. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +16 -0
  163. data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +13 -2
  164. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +6 -0
  165. data/spaceship/lib/spaceship/connect_api/models/profile.rb +7 -5
  166. data/spaceship/lib/spaceship/connect_api/models/routing_app_coverage.rb +75 -0
  167. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +25 -0
  168. data/spaceship/lib/spaceship/connect_api/token.rb +6 -1
  169. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +45 -0
  170. data/spaceship/lib/spaceship/connect_api.rb +1 -0
  171. data/spaceship/lib/spaceship/du/upload_file.rb +4 -3
  172. data/spaceship/lib/spaceship/errors.rb +7 -1
  173. data/spaceship/lib/spaceship/globals.rb +2 -2
  174. data/spaceship/lib/spaceship/portal/merchant.rb +127 -2
  175. data/spaceship/lib/spaceship/portal/portal_client.rb +58 -0
  176. data/spaceship/lib/spaceship/portal/ui/select_team.rb +0 -2
  177. data/spaceship/lib/spaceship/portal/website_push.rb +8 -2
  178. data/spaceship/lib/spaceship/test_flight/client.rb +0 -22
  179. data/spaceship/lib/spaceship/test_flight.rb +0 -1
  180. data/spaceship/lib/spaceship/two_step_or_factor_client.rb +11 -0
  181. data/supply/lib/supply/client.rb +6 -0
  182. data/supply/lib/supply/options.rb +1 -0
  183. data/supply/lib/supply/reader.rb +15 -0
  184. data/supply/lib/supply.rb +0 -1
  185. data/trainer/lib/trainer/xcresult/helper.rb +27 -13
  186. metadata +80 -64
  187. data/produce/lib/produce/available_default_languages.rb +0 -62
  188. data/snapshot/lib/snapshot/screenshot_flatten.rb +0 -20
  189. data/snapshot/lib/snapshot/screenshot_rotate.rb +0 -36
  190. data/spaceship/lib/spaceship/test_flight/app_test_info.rb +0 -40
  191. data/supply/lib/supply/apk_listing.rb +0 -14
  192. /data/fastlane/lib/assets/{custom_action_template.rb → custom_action_template.rb.template} +0 -0
@@ -357,6 +357,7 @@ module Deliver
357
357
  review_information(version)
358
358
  app_clip_review_information(version)
359
359
  review_attachment_file(version)
360
+ routing_app_coverage_file(version)
360
361
  app_rating(app_info)
361
362
  end
362
363
 
@@ -534,16 +535,14 @@ module Deliver
534
535
  if locales_to_enable.count > 0
535
536
  lng_text = "language"
536
537
  lng_text += "s" if locales_to_enable.count != 1
537
- Helper.show_loading_indicator("Activating info #{lng_text} #{locales_to_enable.join(', ')}...")
538
-
539
- locales_to_enable.each do |locale|
540
- app_info.create_app_info_localization(attributes: {
541
- locale: locale
542
- })
538
+ Helper.with_loading_indicator("Activating info #{lng_text} #{locales_to_enable.join(', ')}...") do
539
+ locales_to_enable.each do |locale|
540
+ app_info.create_app_info_localization(attributes: {
541
+ locale: locale
542
+ })
543
+ end
543
544
  end
544
545
 
545
- Helper.hide_loading_indicator
546
-
547
546
  # Refresh version localizations
548
547
  localizations = app_info.get_app_info_localizations
549
548
  end
@@ -569,16 +568,14 @@ module Deliver
569
568
  if locales_to_enable.count > 0
570
569
  lng_text = "language"
571
570
  lng_text += "s" if locales_to_enable.count != 1
572
- Helper.show_loading_indicator("Activating version #{lng_text} #{locales_to_enable.join(', ')}...")
573
-
574
- locales_to_enable.each do |locale|
575
- version.create_app_store_version_localization(attributes: {
576
- locale: locale
577
- })
571
+ Helper.with_loading_indicator("Activating version #{lng_text} #{locales_to_enable.join(', ')}...") do
572
+ locales_to_enable.each do |locale|
573
+ version.create_app_store_version_localization(attributes: {
574
+ locale: locale
575
+ })
576
+ end
578
577
  end
579
578
 
580
- Helper.hide_loading_indicator
581
-
582
579
  # Refresh version localizations
583
580
  localizations = version.get_app_store_version_localizations
584
581
  end
@@ -766,6 +763,27 @@ module Deliver
766
763
  end
767
764
  end
768
765
 
766
+ def routing_app_coverage_file(version)
767
+ # Skip logic entirely if no coverage file passed. So status-quo stays the same.
768
+ return unless options[:routing_app_coverage_file]
769
+
770
+ routing_app_coverage =
771
+ begin
772
+ version.fetch_routing_app_coverage
773
+ rescue => error
774
+ UI.error("Error fetching routing app coverage - #{error.message}")
775
+ nil
776
+ end
777
+
778
+ if routing_app_coverage
779
+ UI.message("Removing previous routing app coverage file from App Store Connect")
780
+ routing_app_coverage.delete!
781
+ end
782
+
783
+ UI.message("Uploading routing app coverage file to App Store Connect")
784
+ version.upload_routing_app_coverage(path: options[:routing_app_coverage_file])
785
+ end
786
+
769
787
  def app_rating(app_info)
770
788
  return unless options[:app_rating_config_path]
771
789
 
@@ -41,25 +41,23 @@ module Deliver
41
41
  if locales_to_enable.count > 0
42
42
  lng_text = "language"
43
43
  lng_text += "s" if locales_to_enable.count != 1
44
- Helper.show_loading_indicator("Activating #{lng_text} #{locales_to_enable.join(', ')}...")
45
-
46
- locales_to_enable.each do |locale|
47
- version.create_app_store_version_localization(attributes: {
48
- locale: locale
49
- })
44
+ Helper.with_loading_indicator("Activating #{lng_text} #{locales_to_enable.join(', ')}...") do
45
+ locales_to_enable.each do |locale|
46
+ version.create_app_store_version_localization(attributes: {
47
+ locale: locale
48
+ })
49
+ end
50
50
  end
51
51
 
52
- Helper.hide_loading_indicator
53
-
54
52
  # Refresh version localizations
55
53
  localizations = version.get_app_store_version_localizations
56
54
  end
57
55
 
58
56
  upload_screenshots(localizations, screenshots_per_language, options[:screenshot_processing_timeout])
59
57
 
60
- Helper.show_loading_indicator("Sorting screenshots uploaded...")
61
- sort_screenshots(localizations)
62
- Helper.hide_loading_indicator
58
+ Helper.with_loading_indicator("Sorting screenshots uploaded...") do
59
+ sort_screenshots(localizations)
60
+ end
63
61
 
64
62
  UI.success("Successfully uploaded screenshots to App Store Connect")
65
63
  end
@@ -159,9 +157,9 @@ module Deliver
159
157
 
160
158
  UI.verbose('Uploading jobs are completed')
161
159
 
162
- Helper.show_loading_indicator("Waiting for all the screenshots to finish being processed...")
163
- states = wait_for_complete(iterator, timeout_seconds)
164
- Helper.hide_loading_indicator
160
+ states = Helper.with_loading_indicator("Waiting for all the screenshots to finish being processed...") do
161
+ wait_for_complete(iterator, timeout_seconds)
162
+ end
165
163
  retry_upload_screenshots_if_needed(iterator, states, total_number_of_screenshots, tries, timeout_seconds, localizations, screenshots_per_language)
166
164
 
167
165
  UI.message("Successfully uploaded all screenshots")
@@ -171,13 +169,17 @@ module Deliver
171
169
  def wait_for_complete(iterator, timeout_seconds)
172
170
  start_time = Time.now
173
171
  loop do
172
+ # App Store Connect publishes a screenshot's `sourceFileChecksum` asynchronously,
173
+ # shortly after its state becomes COMPLETE. (#30094)
174
+ number_of_screenshots_missing_checksum = 0
174
175
  states = iterator.each_app_screenshot.map { |_, _, app_screenshot| app_screenshot }.each_with_object({}) do |app_screenshot, hash|
175
176
  state = app_screenshot.asset_delivery_state['state']
176
177
  hash[state] ||= 0
177
178
  hash[state] += 1
179
+ number_of_screenshots_missing_checksum += 1 if state == 'COMPLETE' && app_screenshot.source_file_checksum.nil?
178
180
  end
179
181
 
180
- is_processing = states.fetch('UPLOAD_COMPLETE', 0) > 0
182
+ is_processing = states.fetch('UPLOAD_COMPLETE', 0) > 0 || number_of_screenshots_missing_checksum > 0
181
183
  return states unless is_processing
182
184
 
183
185
  if Time.now - start_time > timeout_seconds
@@ -185,7 +187,11 @@ module Deliver
185
187
  return states
186
188
  end
187
189
 
188
- UI.verbose("There are still incomplete screenshots - #{states}")
190
+ if number_of_screenshots_missing_checksum > 0
191
+ UI.verbose("There are still incomplete screenshots - #{states}, missing checksum: #{number_of_screenshots_missing_checksum}")
192
+ else
193
+ UI.verbose("There are still incomplete screenshots - #{states}")
194
+ end
189
195
  sleep(5)
190
196
  end
191
197
  end
@@ -205,9 +211,9 @@ module Deliver
205
211
  UI.user_error!("Failed verification of all screenshots uploaded... #{incomplete_screenshot_count} incomplete screenshot(s) still exist")
206
212
  else
207
213
  UI.error("Failed to upload all screenshots... Tries remaining: #{tries}")
208
- # Delete bad entries before retry
214
+ # Delete bad entries before retry (not complete OR missing checksum)
209
215
  iterator.each_app_screenshot do |_, _, app_screenshot|
210
- app_screenshot.delete! unless app_screenshot.complete?
216
+ app_screenshot.delete! unless app_screenshot.complete? && !app_screenshot.source_file_checksum.nil?
211
217
  end
212
218
  upload_screenshots(localizations, screenshots_per_language, timeout_seconds, tries: tries)
213
219
  end
data/docs/README.md ADDED
@@ -0,0 +1,25 @@
1
+ <h3 align="center">
2
+ <a href="https://github.com/fastlane/fastlane/blob/master/fastlane/assets/fastlane_text.png">
3
+ <img src="https://github.com/fastlane/fastlane/blob/master/fastlane/assets/fastlane_text.png?raw=true" alt="fastlane Logo" width="500">
4
+ </a>
5
+ </h3>
6
+
7
+ # _fastlane_ Documentation
8
+
9
+ ## Contributing
10
+
11
+ - [Contributing to _fastlane_](CONTRIBUTING.md)
12
+ - [Designing _fastlane_ code](Design.md)
13
+ - [Tooling and Debugging](ToolsAndDebugging.md)
14
+
15
+ ## Testing
16
+
17
+ - [Testing _fastlane_](Testing.md)
18
+ - [When a spec passes alone and fails in the split](ParallelTesting.md)
19
+
20
+ ## Project
21
+
22
+ - [_fastlane_'s Philosophy](VISION.md)
23
+ - [Maintaining _fastlane_](Maintaining.md)
24
+ - [Code of Conduct](CODE_OF_CONDUCT.md)
25
+ - [Security Policy](SECURITY.md)
@@ -0,0 +1,28 @@
1
+ <table id='team'>
2
+ <%- team.each_slice(5) do |row| -%>
3
+ <tr>
4
+ <%- row.each do |github_user, user| -%>
5
+ <td id='<%= ERB::Util.h(user['name'].downcase.tr(' ', '-')) %>'>
6
+ <a href='https://github.com/<%= github_user %>'>
7
+ <img src='https://github.com/<%= github_user %>.png?size=200' width='140'>
8
+ </a>
9
+ <%- if user['twitter'] -%>
10
+ <h4 align='center'><a href='https://twitter.com/<%= user['twitter'] %>'><%= ERB::Util.h(user['name']) %></a></h4>
11
+ <%- else -%>
12
+ <h4 align='center'><%= ERB::Util.h(user['name']) %></h4>
13
+ <%- end -%>
14
+ </td>
15
+ <%- end -%>
16
+ </tr>
17
+ <%- end -%>
18
+ </table>
19
+ <%- unless alumni.empty? -%>
20
+
21
+ ### _fastlane_ alumni
22
+
23
+ _fastlane_ wouldn't be what it is today without the countless hours these former team members have dedicated to the project ❤️
24
+
25
+ <p id='alumni'>
26
+ <%= alumni.map { |github_user, user| "<a href='https://github.com/#{github_user}'>#{ERB::Util.h(user['name'])}</a>" }.join(",\n") %>
27
+ </p>
28
+ <%- end -%>
@@ -33,7 +33,8 @@ module Fastlane
33
33
  path = json_res['path']
34
34
  uri = URI.parse(Base64.decode64(s3_sign))
35
35
  File.open(file, 'rb') do |f|
36
- http = Net::HTTP.new(uri.host)
36
+ http = Net::HTTP.new(uri.host, uri.port)
37
+ http.use_ssl = (uri.scheme == 'https')
37
38
  put = Net::HTTP::Put.new(uri.request_uri)
38
39
  put.body = f.read
39
40
  put['content-type'] = ''
@@ -37,7 +37,7 @@ module Fastlane
37
37
 
38
38
  def self.invoke_appium_server(params)
39
39
  appium = detect_appium(params)
40
- Process.spawn("#{appium} -a #{params[:host]} -p #{params[:port]}")
40
+ Process.spawn(appium, "-a", params[:host].to_s, "-p", params[:port].to_s)
41
41
  end
42
42
 
43
43
  def self.detect_appium(params)
@@ -99,7 +99,14 @@ module Fastlane
99
99
  end
100
100
 
101
101
  def self.category
102
- :beta
102
+ :deprecated
103
+ end
104
+
105
+ def self.deprecated_notes
106
+ [
107
+ "VMware stopped selling Apteligent to new customers on February 4, 2019, and announced moving its capabilities to VMware Workspace ONE Intelligence.",
108
+ "See [Apteligent moving to Workspace ONE Intelligence](https://vcdx181.com/2019/01/20/apteligent-moving-to-workspace-one-intelligence/)."
109
+ ].join("\n")
103
110
  end
104
111
  end
105
112
  end
@@ -1,8 +1,10 @@
1
+ require 'tmpdir'
2
+
1
3
  module Fastlane
2
4
  module Actions
3
5
  class BuildAndUploadToAppetizeAction < Action
4
6
  def self.run(params)
5
- tmp_path = "/tmp/fastlane_build"
7
+ tmp_path = Dir.mktmpdir("fastlane_build-")
6
8
 
7
9
  xcodebuild_configs = params[:xcodebuild]
8
10
  xcodebuild_configs[:sdk] = "iphonesimulator"
@@ -37,9 +37,9 @@ module Fastlane
37
37
 
38
38
  Dir.chdir(params[:path]) do
39
39
  if params[:commits_count]
40
- changelog = Actions.git_log_last_commits(params[:pretty], params[:commits_count], merge_commit_filtering, params[:date_format], params[:ancestry_path], params[:app_path])
40
+ changelog = Actions.git_log_last_commits(params[:pretty], params[:commits_count], params[:matching_pattern], merge_commit_filtering, params[:date_format], params[:ancestry_path], params[:app_path])
41
41
  else
42
- changelog = Actions.git_log_between(params[:pretty], from, to, merge_commit_filtering, params[:date_format], params[:ancestry_path], params[:app_path])
42
+ changelog = Actions.git_log_between(params[:pretty], from, to, params[:matching_pattern], merge_commit_filtering, params[:date_format], params[:ancestry_path], params[:app_path])
43
43
  end
44
44
 
45
45
  changelog = changelog.gsub("\n\n", "\n") if changelog # as there are duplicate newlines
@@ -104,6 +104,10 @@ module Fastlane
104
104
  description: 'The format applied to each commit while generating the collected value',
105
105
  optional: true,
106
106
  default_value: '%B'),
107
+ FastlaneCore::ConfigItem.new(key: :matching_pattern,
108
+ env_name: 'FL_CHANGELOG_FROM_GIT_COMMITS_MATCHING_PATTERN',
109
+ description: 'A regexp pattern to filter only the commits matching the pattern',
110
+ optional: true),
107
111
  FastlaneCore::ConfigItem.new(key: :date_format,
108
112
  env_name: 'FL_CHANGELOG_FROM_GIT_COMMITS_DATE_FORMAT',
109
113
  description: 'The date format applied to each commit while generating the collected value',
@@ -179,6 +183,7 @@ module Fastlane
179
183
  pretty: "- (%ae) %s", # Optional, lets you provide a custom format to apply to each commit when generating the changelog text
180
184
  date_format: "short", # Optional, lets you provide an additional date format to dates within the pretty-formatted string
181
185
  match_lightweight_tag: false, # Optional, lets you ignore lightweight (non-annotated) tags when searching for the last tag
186
+ matching_pattern: "[.*?].*", # Optional, lets you filter out commits not matching the regex pattern
182
187
  merge_commit_filtering: "exclude_merges" # Optional, lets you filter out merge commits
183
188
  )'
184
189
  ]
@@ -45,6 +45,9 @@ module Fastlane
45
45
  [
46
46
  "This action deletes the files that get created in your repo as a result of running the _gym_ and _sigh_ commands. It doesn't delete the `fastlane/report.xml` though, this is probably more suited for the .gitignore.",
47
47
  "",
48
+ "From _cert_ it only deletes the `.cer` file. The private key (`<certificate id>.p12`, despite its name an unencrypted PEM key) and the `.certSigningRequest` that _cert_ writes to its `output_path` when it creates a certificate are kept: " \
49
+ "_cert_ uses that `.p12` to install the certificate on a machine that doesn't have it, and on systems other than macOS it is the only copy of the key. Keep them out of version control.",
50
+ "",
48
51
  "Useful if you quickly want to send out a test build by dropping down to the command line and typing something like `fastlane beta`, without leaving your repo in a messy state afterwards."
49
52
  ].join("\n")
50
53
  end
@@ -14,15 +14,15 @@ module Fastlane
14
14
  base = params[:base]
15
15
  head = params[:head]
16
16
  pr = params[:pr]
17
- cmd << "--danger_id=#{danger_id}" if danger_id
18
- cmd << "--dangerfile=#{dangerfile}" if dangerfile
17
+ cmd << "--danger_id=#{danger_id.shellescape}" if danger_id
18
+ cmd << "--dangerfile=#{dangerfile.shellescape}" if dangerfile
19
19
  cmd << "--fail-on-errors=true" if params[:fail_on_errors]
20
20
  cmd << "--fail-if-no-pr=true" if params[:fail_if_no_pr]
21
21
  cmd << "--new-comment" if params[:new_comment]
22
22
  cmd << "--remove-previous-comments" if params[:remove_previous_comments]
23
- cmd << "--base=#{base}" if base
24
- cmd << "--head=#{head}" if head
25
- cmd << "pr #{pr}" if pr
23
+ cmd << "--base=#{base.shellescape}" if base
24
+ cmd << "--head=#{head.shellescape}" if head
25
+ cmd << "pr #{pr.shellescape}" if pr
26
26
 
27
27
  ENV['DANGER_GITHUB_API_TOKEN'] = params[:github_api_token] if params[:github_api_token]
28
28
  ENV['DANGER_GITHUB_HOST'] = params[:github_enterprise_host] if params[:github_enterprise_host]
@@ -6,8 +6,7 @@
6
6
 
7
7
  <p align="center">
8
8
  <a href="#whats-gym">Features</a> &bull;
9
- <a href="#usage">Usage</a> &bull;
10
- <a href="#tips">Tips</a>
9
+ <a href="#usage">Usage</a>
11
10
  </p>
12
11
 
13
12
  -------
@@ -10,8 +10,7 @@ _produce_ creates new iOS apps on both the Apple Developer Portal and App Store
10
10
 
11
11
  <p align="center">
12
12
  <a href="#features">Features</a> &bull;
13
- <a href="#usage">Usage</a> &bull;
14
- <a href="#how-does-it-work">How does it work?</a>
13
+ <a href="#usage">Usage</a>
15
14
  </p>
16
15
 
17
16
  -------
@@ -4,9 +4,7 @@
4
4
 
5
5
  -------
6
6
  <p align="center">
7
- <a href="#why">Why?</a> &bull;
8
7
  <a href="#usage">Usage</a> &bull;
9
- <a href="#how-does-it-work">How does it work?</a> &bull;
10
8
  <a href="#tips">Tips</a>
11
9
  </p>
12
10
 
@@ -17,9 +17,7 @@ To automate iOS Provisioning profiles you can use [_match_](https://docs.fastlan
17
17
  <p align="center">
18
18
  <a href="#features">Features</a> &bull;
19
19
  <a href="#usage">Usage</a> &bull;
20
- <a href="#how-does-it-work">How does it work?</a> &bull;
21
- <a href="#tips">Tips</a> &bull;
22
- <a href="#need-help">Need help?</a>
20
+ <a href="#how-does-it-work">How does it work?</a>
23
21
  </p>
24
22
 
25
23
  -------
@@ -74,6 +72,12 @@ If you want to generate a Website Push certificate:
74
72
  fastlane pem --website_push
75
73
  ```
76
74
 
75
+ If you want to generate a VoIP Services certificate (the type PushKit requires):
76
+
77
+ ```no-highlight
78
+ fastlane pem --voip_push
79
+ ```
80
+
77
81
  Set a password for your `p12` file:
78
82
 
79
83
  ```no-highlight
@@ -81,12 +81,15 @@ Use Git Storage to store all code signing identities in a private git repo, owne
81
81
 
82
82
  First, enter the URL to your private (!) Git repo (You can create one for free on e.g. [GitHub](https://github.com/new) or [BitBucket](https://bitbucket.org/repo/create)). The URL you enter can be either a `https://` or a `git` URL. `fastlane match init` won't read or modify your certificates or profiles yet, and also won't validate your git URL.
83
83
 
84
+ You'll then be asked which branch of that repo to use, defaulting to `main` if you leave the answer blank.
85
+
84
86
  This will create a `Matchfile` in your current directory (or in your `./fastlane/` folder).
85
87
 
86
88
  Example content (for more advanced setups check out the [fastlane section](#fastlane)):
87
89
 
88
90
  ```ruby-skip-tests
89
91
  git_url("https://github.com/fastlane/certificates")
92
+ git_branch("main")
90
93
 
91
94
  app_identifier("tools.fastlane.app")
92
95
  username("user@fastlane.tools")
@@ -94,7 +97,7 @@ username("user@fastlane.tools")
94
97
 
95
98
  ##### Git Storage on GitHub
96
99
 
97
- If your machine is currently using SSH to authenticate with GitHub, you'll want to use a `git` URL, otherwise, you may see an authentication error when you attempt to use match. Alternatively, you can set a basic authorization for _match_:
100
+ If your machine is currently using SSH to authenticate with GitHub, you'll want to use a `git` URL, otherwise, you may see an authentication error when you attempt to use match. Alternatively, you can set a basic authorization for _match_ (needs git 2.31 or later):
98
101
 
99
102
  Using parameter:
100
103
 
@@ -138,7 +141,7 @@ You can find more information about GitHub basic authentication and personal tok
138
141
 
139
142
  ##### Git Storage on Azure DevOps
140
143
 
141
- If you're running a pipeline on Azure DevOps and using git storage in a another repository on the same project, you might want to use `bearer` token authentication.
144
+ If you're running a pipeline on Azure DevOps and using git storage in a another repository on the same project, you might want to use `bearer` token authentication (needs git 2.31 or later).
142
145
 
143
146
  Using parameter:
144
147
 
@@ -259,7 +262,7 @@ If you want to use a single developer and/or distribution certificate for multip
259
262
 
260
263
  ```ruby-skip-tests
261
264
  git_url("https://github.com/example/example-repo.git")
262
- git_branch("master")
265
+ git_branch("main")
263
266
  ```
264
267
 
265
268
  _match_ will reuse certificates and will create separate provisioning profiles for each app.
@@ -408,6 +411,13 @@ If you're not using `Fastfile`, you can also use the `force_for_new_devices` opt
408
411
  fastlane match adhoc --force_for_new_devices
409
412
  ```
410
413
 
414
+ ##### Offline profile use
415
+
416
+ If your profile requires the 'Offline support (7 day validity)' setting for use without Internet, use `offline_profile: true` to add this permission to generated profiles.
417
+
418
+ > [!NOTE]
419
+ > Offline profiles can only be created when logging in with an Apple ID. Apple's App Store Connect API (`api_key` / `api_key_path`) does not support this setting, so _match_ will fail with a clear error if both are combined.
420
+
411
421
  ##### Managed capabilities
412
422
 
413
423
  > [!IMPORTANT]
@@ -2,7 +2,7 @@ module Fastlane
2
2
  module Actions
3
3
  class EnsureNoDebugCodeAction < Action
4
4
  def self.run(params)
5
- command = "grep -RE '#{params[:text]}' '#{File.absolute_path(params[:path])}'"
5
+ command = "grep -RE #{params[:text].shellescape} #{File.absolute_path(params[:path]).shellescape}"
6
6
 
7
7
  extensions = []
8
8
  extensions << params[:extension] unless params[:extension].nil?
@@ -20,7 +20,7 @@ module Fastlane
20
20
  command << " --include=\\*.#{extensions.join(',')}"
21
21
  end
22
22
 
23
- command << " --exclude #{params[:exclude]}" if params[:exclude]
23
+ command << " --exclude #{params[:exclude].shellescape}" if params[:exclude]
24
24
 
25
25
  if params[:exclude_dirs]
26
26
  params[:exclude_dirs].each do |dir|
@@ -92,6 +92,7 @@ module Fastlane
92
92
  conflicting_options: [:json_key],
93
93
  optional: true,
94
94
  description: "The raw service account JSON data used to authenticate with Google",
95
+ sensitive: true,
95
96
  code_gen_sensitive: true,
96
97
  default_value: CredentialsManager::AppfileConfig.try_fetch_value(:json_key_data_raw),
97
98
  default_value_dynamic: true,
@@ -250,12 +250,11 @@ module Fastlane
250
250
  def call_endpoint(url, http_method, headers, body, secure)
251
251
  require 'excon'
252
252
 
253
- Excon.defaults[:ssl_verify_peer] = secure
254
253
  middlewares = Excon.defaults[:middlewares] + [Excon::Middleware::RedirectFollower] # allow redirect in case of repo renames
255
254
 
256
255
  UI.verbose("#{http_method} : #{url}")
257
256
 
258
- connection = Excon.new(url)
257
+ connection = Excon.new(url, ssl_verify_peer: secure)
259
258
  connection.request(
260
259
  method: http_method,
261
260
  headers: headers,
@@ -92,7 +92,7 @@ module Fastlane
92
92
  end
93
93
 
94
94
  # create a commit with a message
95
- command = "hg commit -m '#{params[:message]}'"
95
+ command = "hg commit -m #{params[:message].shellescape}"
96
96
  return command if Helper.test?
97
97
  begin
98
98
  Actions.sh(command)
@@ -37,7 +37,7 @@ module Fastlane
37
37
  command = [
38
38
  command_prefix,
39
39
  'agvtool',
40
- params[:build_number] ? "new-version#{mode} #{params[:build_number].to_s.strip}" : "next-version#{mode}",
40
+ params[:build_number] ? "new-version#{mode} #{params[:build_number].to_s.strip.shellescape}" : "next-version#{mode}",
41
41
  command_suffix
42
42
  ].join(' ')
43
43
 
@@ -77,7 +77,7 @@ module Fastlane
77
77
 
78
78
  command = [
79
79
  command_prefix,
80
- "agvtool new-marketing-version #{next_version_number.to_s.strip}"
80
+ "agvtool new-marketing-version #{next_version_number.to_s.strip.shellescape}"
81
81
  ].join(' ')
82
82
 
83
83
  if Helper.test?
@@ -25,11 +25,14 @@ module Fastlane
25
25
  end
26
26
  end
27
27
 
28
- zip_path = File.join(Dir.tmpdir, 'plugin.zip')
29
- Action.sh("curl", "-L", "-s", "-o", zip_path, params[:url])
30
- plugins_path = "#{ENV['HOME']}/Library/Application Support/Developer/Shared/Xcode/Plug-ins"
31
- FileUtils.mkdir_p(plugins_path)
32
- Action.sh("unzip", "-qo", zip_path, "-d", plugins_path)
28
+ Dir.mktmpdir do |dir|
29
+ zip_path = File.join(dir, 'plugin.zip')
30
+ # -f fails on an HTTP error instead of saving the error page; --proto also applies to redirects
31
+ Action.sh("curl", "-f", "-L", "-s", "--proto", "=https", "-o", zip_path, params[:url])
32
+ plugins_path = "#{ENV['HOME']}/Library/Application Support/Developer/Shared/Xcode/Plug-ins"
33
+ FileUtils.mkdir_p(plugins_path)
34
+ Action.sh("unzip", "-qo", zip_path, "-d", plugins_path)
35
+ end
33
36
 
34
37
  UI.success("Plugin #{File.basename(params[:url], '.zip')} installed successfully")
35
38
  UI.message("Please restart Xcode to use the newly installed plugin")
@@ -85,7 +88,14 @@ module Fastlane
85
88
  end
86
89
 
87
90
  def self.category
88
- :misc
91
+ :deprecated
92
+ end
93
+
94
+ def self.deprecated_notes
95
+ [
96
+ "Since Xcode 8, which added runtime library validation and source editor extensions ([New Features in Xcode 8](https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Chapters/xcode_8_0.html)), Xcode only loads plugins once you re-sign it yourself, and Xcode 14 removed its plugin system.",
97
+ "A source editor extension ships inside a macOS app: install the app, then enable the extension in the Extensions section of System Settings."
98
+ ].join("\n")
89
99
  end
90
100
  end
91
101
  end
@@ -1,3 +1,5 @@
1
+ require 'tmpdir'
2
+
1
3
  module Fastlane
2
4
  module Actions
3
5
  class LcovAction < Action
@@ -42,7 +44,7 @@ module Fastlane
42
44
  end
43
45
 
44
46
  def self.gen_cov(options)
45
- tmp_cov_file = "/tmp/coverage.info"
47
+ tmp_cov_file = File.join(Dir.mktmpdir("lcov-"), "coverage.info")
46
48
  output_dir = options[:output_dir]
47
49
  derived_data_path = derived_data_dir(options)
48
50
 
@@ -91,7 +93,14 @@ module Fastlane
91
93
  end
92
94
 
93
95
  def self.category
94
- :testing
96
+ :deprecated
97
+ end
98
+
99
+ def self.deprecated_notes
100
+ [
101
+ "Xcode records coverage as LLVM `.profdata`, not the gcov `.gcda` files that `lcov --capture --directory` reads, and this action looks for them under `Build/Intermediates`, which Xcode now names `Build/Intermediates.noindex`.",
102
+ "Use `slather`, or `xcrun llvm-cov export -format=lcov` to produce an lcov file."
103
+ ].join("\n")
95
104
  end
96
105
  end
97
106
  end
@@ -9,9 +9,24 @@ module Fastlane
9
9
  command += ssl_options(params)
10
10
  command += proxy_options(params)
11
11
  command += upload_options(params)
12
+ command << "--config -"
12
13
  command << upload_url(params)
13
14
 
14
- Fastlane::Actions.sh(command.join(' '), log: params[:verbose])
15
+ Fastlane::Actions.sh(command.join(' '), log: params[:verbose], stdin: curl_config(params))
16
+ end
17
+
18
+ def self.curl_config(params)
19
+ config = "user = #{curl_config_string("#{params[:username]}:#{params[:password]}")}\n"
20
+ if params[:proxy_address] && params[:proxy_port] && params[:proxy_username] && params[:proxy_password]
21
+ config << "proxy-user = #{curl_config_string("#{params[:proxy_username]}:#{params[:proxy_password]}")}\n"
22
+ end
23
+ config
24
+ end
25
+
26
+ # Quotes a value for a curl config file, using the escapes listed under `-K, --config` in `man curl`.
27
+ def self.curl_config_string(value)
28
+ escapes = { "\\" => "\\\\", "\"" => "\\\"", "\t" => "\\t", "\n" => "\\n", "\r" => "\\r", "\v" => "\\v" }
29
+ "\"#{value.gsub(/[\\"\t\n\r\v]/, escapes)}\""
15
30
  end
16
31
 
17
32
  def self.upload_url(params)
@@ -61,8 +76,6 @@ module Fastlane
61
76
  options << "--upload-file #{file_path}"
62
77
  end
63
78
 
64
- options << "-u #{params[:username].shellescape}:#{params[:password].shellescape}"
65
-
66
79
  options
67
80
  end
68
81
 
@@ -79,7 +92,6 @@ module Fastlane
79
92
  options = []
80
93
  if params[:proxy_address] && params[:proxy_port] && params[:proxy_username] && params[:proxy_password]
81
94
  options << "-x #{params[:proxy_address].shellescape}:#{params[:proxy_port].shellescape}"
82
- options << "--proxy-user #{params[:proxy_username].shellescape}:#{params[:proxy_password].shellescape}"
83
95
  end
84
96
 
85
97
  options