fastlane 2.229.1 → 2.230.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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +102 -96
  3. data/deliver/lib/assets/summary.html.erb +3 -3
  4. data/deliver/lib/deliver/app_screenshot.rb +215 -347
  5. data/deliver/lib/deliver/app_screenshot_iterator.rb +4 -1
  6. data/deliver/lib/deliver/app_screenshot_validator.rb +5 -21
  7. data/deliver/lib/deliver/loader.rb +2 -9
  8. data/deliver/lib/deliver/upload_metadata.rb +5 -0
  9. data/deliver/lib/deliver/upload_screenshots.rb +4 -2
  10. data/fastlane/lib/fastlane/actions/docs/create_app_online.md +2 -1
  11. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +3 -1
  12. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +34 -6
  13. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +2 -0
  14. data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +3 -2
  15. data/fastlane/lib/fastlane/actions/modify_services.rb +1 -0
  16. data/fastlane/lib/fastlane/actions/notarize.rb +1 -1
  17. data/fastlane/lib/fastlane/actions/xcov.rb +1 -7
  18. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +4 -4
  19. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +20 -20
  20. data/fastlane/lib/fastlane/version.rb +1 -1
  21. data/fastlane/swift/Deliverfile.swift +1 -1
  22. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  23. data/fastlane/swift/Fastlane.swift +85 -13
  24. data/fastlane/swift/Gymfile.swift +1 -1
  25. data/fastlane/swift/GymfileProtocol.swift +9 -1
  26. data/fastlane/swift/Matchfile.swift +1 -1
  27. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  28. data/fastlane/swift/Precheckfile.swift +1 -1
  29. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  30. data/fastlane/swift/Scanfile.swift +1 -1
  31. data/fastlane/swift/ScanfileProtocol.swift +5 -1
  32. data/fastlane/swift/Screengrabfile.swift +1 -1
  33. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  34. data/fastlane/swift/Snapshotfile.swift +1 -1
  35. data/fastlane/swift/SnapshotfileProtocol.swift +5 -1
  36. data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +5 -1
  37. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +14 -0
  38. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +38 -8
  39. data/fastlane_core/lib/fastlane_core/project.rb +4 -0
  40. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +7 -1
  41. data/frameit/lib/frameit/device.rb +2 -2
  42. data/frameit/lib/frameit/device_types.rb +108 -70
  43. data/frameit/lib/frameit/template_finder.rb +1 -1
  44. data/gym/lib/gym/module.rb +9 -4
  45. data/gym/lib/gym/options.rb +14 -1
  46. data/gym/lib/gym/runner.rb +38 -3
  47. data/produce/lib/produce/developer_center.rb +1 -0
  48. data/produce/lib/produce/service.rb +6 -1
  49. data/scan/lib/scan/options.rb +5 -0
  50. data/scan/lib/scan/test_command_generator.rb +8 -0
  51. data/sigh/lib/sigh/local_manage.rb +6 -4
  52. data/sigh/lib/sigh/runner.rb +18 -1
  53. data/snapshot/lib/snapshot/options.rb +5 -0
  54. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +62 -8
  55. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +4 -4
  56. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +7 -1
  57. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +16 -16
  58. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +2 -0
  59. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +0 -6
  60. data/spaceship/lib/spaceship/errors.rb +8 -6
  61. data/supply/lib/supply/client.rb +18 -1
  62. metadata +43 -25
  63. data/fastlane/lib/fastlane/core_ext/bundler_monkey_patch.rb +0 -14
  64. data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +0 -43
  65. data/fastlane/lib/fastlane/plugins/template/.travis.yml +0 -4
@@ -3,25 +3,22 @@ require 'fastimage'
3
3
  module Deliver
4
4
  class AppScreenshotValidator
5
5
  # A simple structure that holds error information as well as formatted error messages consistently
6
- # Set `to_skip` to `true` when just needing to skip uploading rather than causing a crash.
7
6
  class ValidationError
8
7
  # Constants that can be given to `type` param
9
8
  INVALID_SCREEN_SIZE = 'Invalid screen size'.freeze
10
- UNACCEPTABLE_DEVICE = 'Not an accepted App Store Connect device'.freeze
11
9
  INVALID_FILE_EXTENSION = 'Invalid file extension'.freeze
12
10
  FILE_EXTENSION_MISMATCH = 'File extension mismatches its image format'.freeze
13
11
 
14
- attr_reader :type, :path, :debug_info, :to_skip
12
+ attr_reader :type, :path, :debug_info
15
13
 
16
- def initialize(type: nil, path: nil, debug_info: nil, to_skip: false)
14
+ def initialize(type: nil, path: nil, debug_info: nil)
17
15
  @type = type
18
16
  @path = path
19
17
  @debug_info = debug_info
20
- @to_skip = to_skip
21
18
  end
22
19
 
23
20
  def to_s
24
- "#{to_skip ? '🏃 Skipping' : '🚫 Error'}: #{path} - #{type} (#{debug_info})"
21
+ "🚫 Error: #{path} - #{type} (#{debug_info})"
25
22
  end
26
23
 
27
24
  def inspect
@@ -46,7 +43,6 @@ module Deliver
46
43
  errors_found = []
47
44
 
48
45
  validate_screen_size(screenshot, errors_found)
49
- validate_device_type(screenshot, errors_found)
50
46
  validate_file_extension_and_format(screenshot, errors_found)
51
47
 
52
48
  # Merge errors found into given errors array
@@ -55,22 +51,10 @@ module Deliver
55
51
  end
56
52
 
57
53
  def self.validate_screen_size(screenshot, errors_found)
58
- if screenshot.screen_size.nil?
54
+ if screenshot.display_type.nil?
59
55
  errors_found << ValidationError.new(type: ValidationError::INVALID_SCREEN_SIZE,
60
56
  path: screenshot.path,
61
- debug_info: "Actual size is #{get_formatted_size(screenshot)}. See the specifications to fix #{APP_SCREENSHOT_SPEC_URL}")
62
- end
63
- end
64
-
65
- # Checking if the device type exists in spaceship
66
- # Ex: iPhone 6.1 inch isn't supported in App Store Connect but need
67
- # to have it in there for frameit support
68
- def self.validate_device_type(screenshot, errors_found)
69
- if !screenshot.screen_size.nil? && screenshot.device_type.nil?
70
- errors_found << ValidationError.new(type: ValidationError::UNACCEPTABLE_DEVICE,
71
- path: screenshot.path,
72
- debug_info: "Screen size #{screenshot.screen_size} is not accepted. See the specifications to fix #{APP_SCREENSHOT_SPEC_URL}",
73
- to_skip: true)
57
+ debug_info: "Screenshot size is not supported. Actual size is #{get_formatted_size(screenshot)}. See the specifications to fix #{APP_SCREENSHOT_SPEC_URL}")
74
58
  end
75
59
  end
76
60
 
@@ -100,16 +100,9 @@ module Deliver
100
100
  errors = []
101
101
  valid_screenshots = screenshots.select { |screenshot| Deliver::AppScreenshotValidator.validate(screenshot, errors) }
102
102
 
103
- errors_to_skip, errors_to_crash = errors.partition(&:to_skip)
104
-
105
- unless errors_to_skip.empty?
106
- UI.important("🏃 Screenshots to be skipped are detected!")
107
- errors_to_skip.each { |error| UI.message(error) }
108
- end
109
-
110
- unless errors_to_crash.empty?
103
+ unless errors.empty?
111
104
  UI.important("🚫 Invalid screenshots were detected! Here are the reasons:")
112
- errors_to_crash.each { |error| UI.error(error) }
105
+ errors.each { |error| UI.error(error) }
113
106
  UI.user_error!("Canceled uploading screenshots. Please check the error messages above and fix the screenshots.")
114
107
  end
115
108
 
@@ -705,6 +705,11 @@ module Deliver
705
705
  def app_rating(app_info)
706
706
  return unless options[:app_rating_config_path]
707
707
 
708
+ unless app_info
709
+ UI.important("Skipping age rating update because app info could not be fetched.")
710
+ return
711
+ end
712
+
708
713
  require 'json'
709
714
  begin
710
715
  json = JSON.parse(File.read(options[:app_rating_config_path]))
@@ -93,7 +93,9 @@ module Deliver
93
93
 
94
94
  # Verify all screenshots have been deleted
95
95
  # Sometimes API requests will fail but screenshots will still be deleted
96
- count = iterator.each_app_screenshot_set.map { |_, app_screenshot_set| app_screenshot_set }
96
+ count = iterator.each_app_screenshot_set
97
+ .select { |localization, _| screenshots_per_language.keys.include?(localization.locale) }
98
+ .map { |_, app_screenshot_set| app_screenshot_set }
97
99
  .reduce(0) { |sum, app_screenshot_set| sum + app_screenshot_set.app_screenshots.size }
98
100
 
99
101
  UI.important("Number of screenshots not deleted: #{count}")
@@ -134,7 +136,7 @@ module Deliver
134
136
  number_of_screenshots_per_set[app_screenshot_set] ||= (app_screenshot_set.app_screenshots || []).count
135
137
 
136
138
  if number_of_screenshots_per_set[app_screenshot_set] >= 10
137
- UI.error("Too many screenshots found for device '#{screenshot.device_type}' in '#{screenshot.language}', skipping this one (#{screenshot.path})")
139
+ UI.error("Too many screenshots found for device '#{screenshot.display_type}' in '#{screenshot.language}', skipping this one (#{screenshot.path})")
138
140
  next
139
141
  end
140
142
 
@@ -302,7 +302,7 @@ lane :release do
302
302
  app_version: '1.0',
303
303
  sku: '123',
304
304
  team_name: 'SunApps GmbH', # only necessary when in multiple teams
305
-
305
+
306
306
  # Optional
307
307
  # App services can be enabled during app creation
308
308
  enable_services: {
@@ -317,6 +317,7 @@ lane :release do
317
317
  car_play_navigation_app: "on", # Valid values: "on", "off"
318
318
  car_play_voip_calling_app: "on", # Valid values: "on", "off"
319
319
  class_kit: "on", # Valid values: "on", "off"
320
+ declared_age_range: "on", # Valid values: "on", "off"
320
321
  icloud: "xcode5_compatible", # Valid values: "xcode5_compatible", "xcode6_compatible", "off"
321
322
  critical_alerts: "on", # Valid values: "on", "off"
322
323
  custom_network_protocol: "on", # Valid values: "on", "off"
@@ -215,7 +215,9 @@ fastlane match development
215
215
  This will create a new certificate and provisioning profile (if required) and store them in your selected storage.
216
216
  If you previously ran _match_ with the configured storage it will automatically install the existing profiles from your storage.
217
217
 
218
- The provisioning profiles are installed in `~/Library/MobileDevice/Provisioning Profiles` while the certificates and private keys are installed in your Keychain.
218
+ The provisioning profiles are installed in `~/Library/Developer/Xcode/UserData/Provisioning Profiles` (`~/Library/MobileDevice/Provisioning Profiles` for Xcode versions prior to 16.0) while the certificates and private keys are installed in your Keychain.
219
+
220
+ > fastlane relies on the system's default Xcode version to determine the current version. The path where provisioning profiles are stored changed in Xcode 16. If you use the `xcode_select` or `xcodes` actions and you have Xcode 15 and 16 installed in your system, please make sure to execute them before invoking the `sync_code_signing` action.
219
221
 
220
222
  To get a more detailed output of what _match_ is doing use
221
223
 
@@ -597,7 +597,9 @@ Key | Editable While Live | Directory | Filename | Deprecated Filename
597
597
  - 2: Frequent/Intense (Legacy value, use `FREQUENT_OR_INTENSE`instead)
598
598
 
599
599
  - `NONE`
600
+ - `INFREQUENT`
600
601
  - `INFREQUENT_OR_MILD`
602
+ - `FREQUENT`
601
603
  - `FREQUENT_OR_INTENSE`
602
604
 
603
605
  **Keys**
@@ -605,19 +607,33 @@ Key | Editable While Live | Directory | Filename | Deprecated Filename
605
607
  - `alcoholTobaccoOrDrugUseOrReferences`
606
608
  - `contests`
607
609
  - `gamblingSimulated`
608
- - `medicalOrTreatmentInformation`
609
- - `profanityOrCrudeHumor`
610
-
610
+ - `gunsOrOtherWeapons`
611
611
  - `horrorOrFearThemes`
612
- - `kidsAgeBand`
613
612
  - `matureOrSuggestiveThemes`
613
+ - `medicalOrTreatmentInformation`
614
+ - `profanityOrCrudeHumor`
614
615
  - `sexualContentGraphicAndNudity`
615
616
  - `sexualContentOrNudity`
616
617
  - `violenceCartoonOrFantasy`
617
618
  - `violenceRealistic`
618
619
  - `violenceRealisticProlongedGraphicOrSadistic`
619
620
 
620
- #### Fifteen Plus or Nineteen Plus
621
+ #### Age Rating
622
+
623
+ **Values**
624
+
625
+ - `NONE`
626
+ - `NINE_PLUS`
627
+ - `THIRTEEN_PLUS`
628
+ - `SIXTEEN_PLUS`
629
+ - `EIGHTEEN_PLUS`
630
+ - `UNRATED`
631
+
632
+ **Keys**
633
+
634
+ - `ageRatingOverrideV2`
635
+
636
+ #### Korea Age Rating
621
637
 
622
638
  **Values**
623
639
 
@@ -629,13 +645,25 @@ Key | Editable While Live | Directory | Filename | Deprecated Filename
629
645
 
630
646
  - `koreaAgeRatingOverride`
631
647
 
648
+ #### URL
649
+
650
+ **Keys**
651
+
652
+ - `developerAgeRatingInfoUrl`
653
+
632
654
  #### Boolean
633
655
 
634
656
  **Keys**
635
657
 
658
+ - `advertising`
659
+ - `ageAssurance`
636
660
  - `gambling`
637
- - `unrestrictedWebAccess`
661
+ - `healthOrWellnessTopics`
638
662
  - `lootBox`
663
+ - `messagingAndChat`
664
+ - `parentalControls`
665
+ - `unrestrictedWebAccess`
666
+ - `userGeneratedContent`
639
667
 
640
668
  #### Kids Age
641
669
 
@@ -82,6 +82,8 @@ _pilot_ uses [_spaceship_](https://spaceship.airforce) to submit the build metad
82
82
  ### Upload from Linux
83
83
 
84
84
  To upload binaries from Linux:
85
+
86
+ - have the package file and the `AppStoreInfo.plist` file in the same location on disk (_check [fastlane gym](https://docs.fastlane.tools/actions/gym/) on how to make them_)
85
87
  - make sure you have [Transporter on Linux](https://help.apple.com/itc/transporteruserguide/en.lproj/static.html) installed
86
88
  - set the following environment variables:
87
89
  - `FASTLANE_ITUNES_TRANSPORTER_USE_SHELL_SCRIPT=true`
@@ -3,6 +3,7 @@ module Fastlane
3
3
  class InstallXcodePluginAction < Action
4
4
  def self.run(params)
5
5
  require 'fileutils'
6
+ require 'tmpdir'
6
7
 
7
8
  if params[:github]
8
9
  base_api_url = params[:github].sub('https://github.com', 'https://api.github.com/repos')
@@ -25,10 +26,10 @@ module Fastlane
25
26
  end
26
27
 
27
28
  zip_path = File.join(Dir.tmpdir, 'plugin.zip')
28
- sh("curl -Lso #{zip_path} #{params[:url]}")
29
+ Action.sh("curl", "-L", "-s", "-o", zip_path, params[:url])
29
30
  plugins_path = "#{ENV['HOME']}/Library/Application Support/Developer/Shared/Xcode/Plug-ins"
30
31
  FileUtils.mkdir_p(plugins_path)
31
- Action.sh("unzip -qo '#{zip_path}' -d '#{plugins_path}'")
32
+ Action.sh("unzip", "-qo", zip_path, "-d", plugins_path)
32
33
 
33
34
  UI.success("Plugin #{File.basename(params[:url], '.zip')} installed successfully")
34
35
  UI.message("Please restart Xcode to use the newly installed plugin")
@@ -49,6 +49,7 @@ module Fastlane
49
49
  associated_domains: 'associated_domains',
50
50
  auto_fill_credential: 'auto_fill_credential',
51
51
  class_kit: 'class_kit',
52
+ declared_age_range: 'declared_age_range',
52
53
  icloud: 'icloud',
53
54
  custom_network_protocol: 'custom_network_protocol',
54
55
  data_protection: 'data_protection',
@@ -74,7 +74,7 @@ module Fastlane
74
74
  ] + auth_parts
75
75
 
76
76
  if verbose
77
- submit_command << "--verbose"
77
+ submit_parts << "--verbose"
78
78
  end
79
79
 
80
80
  submit_command = submit_parts.join(' ')
@@ -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
@@ -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")
@@ -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
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.229.1'.freeze
2
+ VERSION = '2.230.0'.freeze
3
3
  SUMMARY = "The easiest way to build and release mobile apps.".freeze
4
4
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
5
5
  MINIMUM_XCODE_RELEASE = "7.0".freeze
@@ -17,4 +17,4 @@ public class Deliverfile: DeliverfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.229.1
20
+ // Generated with fastlane 2.230.0
@@ -272,4 +272,4 @@ public extension DeliverfileProtocol {
272
272
 
273
273
  // Please don't remove the lines below
274
274
  // They are used to detect outdated files
275
- // FastlaneRunnerAPIVersion [0.9.138]
275
+ // FastlaneRunnerAPIVersion [0.9.139]