fastlane 2.222.0 → 2.223.1

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/README.md +98 -98
  3. data/deliver/lib/deliver/runner.rb +9 -0
  4. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +7 -3
  5. data/fastlane/lib/fastlane/actions/slack.rb +9 -2
  6. data/fastlane/lib/fastlane/actions/testfairy.rb +9 -1
  7. data/fastlane/lib/fastlane/fast_file.rb +5 -1
  8. data/fastlane/lib/fastlane/helper/git_helper.rb +4 -2
  9. data/fastlane/lib/fastlane/notification/slack.rb +3 -2
  10. data/fastlane/lib/fastlane/version.rb +1 -1
  11. data/fastlane/swift/Deliverfile.swift +1 -1
  12. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  13. data/fastlane/swift/Fastlane.swift +78 -18
  14. data/fastlane/swift/Gymfile.swift +1 -1
  15. data/fastlane/swift/GymfileProtocol.swift +5 -1
  16. data/fastlane/swift/Matchfile.swift +1 -1
  17. data/fastlane/swift/MatchfileProtocol.swift +5 -1
  18. data/fastlane/swift/Precheckfile.swift +1 -1
  19. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  20. data/fastlane/swift/Scanfile.swift +1 -1
  21. data/fastlane/swift/ScanfileProtocol.swift +5 -1
  22. data/fastlane/swift/Screengrabfile.swift +1 -1
  23. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  24. data/fastlane/swift/Snapshotfile.swift +1 -1
  25. data/fastlane/swift/SnapshotfileProtocol.swift +5 -1
  26. data/fastlane/swift/formatting/Brewfile.lock.json +23 -18
  27. data/fastlane/swift/formatting/Rakefile +1 -0
  28. data/fastlane_core/lib/fastlane_core/build_watcher.rb +5 -0
  29. data/fastlane_core/lib/fastlane_core/project.rb +1 -0
  30. data/gym/lib/gym/options.rb +10 -1
  31. data/match/lib/match/change_password.rb +2 -1
  32. data/match/lib/match/encryption/encryption.rb +2 -2
  33. data/match/lib/match/encryption/openssl.rb +10 -5
  34. data/match/lib/match/importer.rb +2 -1
  35. data/match/lib/match/nuke.rb +2 -1
  36. data/match/lib/match/options.rb +5 -0
  37. data/match/lib/match/runner.rb +2 -1
  38. data/pilot/lib/pilot/build_manager.rb +9 -0
  39. data/scan/lib/scan/module.rb +1 -1
  40. data/scan/lib/scan/options.rb +10 -1
  41. data/snapshot/lib/snapshot/options.rb +9 -0
  42. metadata +20 -20
@@ -125,6 +125,9 @@ public protocol SnapshotfileProtocol: AnyObject {
125
125
  /// Prevents packages from automatically being resolved to versions other than those recorded in the `Package.resolved` file
126
126
  var disablePackageAutomaticUpdates: Bool { get }
127
127
 
128
+ /// Lets xcodebuild use a specified package authorization provider (keychain|netrc)
129
+ var packageAuthorizationProvider: String? { get }
130
+
128
131
  /// The testplan associated with the scheme that should be used for testing
129
132
  var testplan: String? { get }
130
133
 
@@ -192,6 +195,7 @@ public extension SnapshotfileProtocol {
192
195
  var clonedSourcePackagesPath: String? { return nil }
193
196
  var skipPackageDependenciesResolution: Bool { return false }
194
197
  var disablePackageAutomaticUpdates: Bool { return false }
198
+ var packageAuthorizationProvider: String? { return nil }
195
199
  var testplan: String? { return nil }
196
200
  var onlyTesting: String? { return nil }
197
201
  var skipTesting: String? { return nil }
@@ -204,4 +208,4 @@ public extension SnapshotfileProtocol {
204
208
 
205
209
  // Please don't remove the lines below
206
210
  // They are used to detect outdated files
207
- // FastlaneRunnerAPIVersion [0.9.119]
211
+ // FastlaneRunnerAPIVersion [0.9.121]
@@ -2,45 +2,50 @@
2
2
  "entries": {
3
3
  "brew": {
4
4
  "swiftformat": {
5
- "version": "0.54.2",
5
+ "version": "0.54.5",
6
6
  "bottle": {
7
7
  "rebuild": 0,
8
8
  "root_url": "https://ghcr.io/v2/homebrew/core",
9
9
  "files": {
10
+ "arm64_sequoia": {
11
+ "cellar": ":any_skip_relocation",
12
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:3fc57cb9abcbfd64106a3b16f51c8851c9877327553ec5fd9b21683d42b3c18d",
13
+ "sha256": "3fc57cb9abcbfd64106a3b16f51c8851c9877327553ec5fd9b21683d42b3c18d"
14
+ },
10
15
  "arm64_sonoma": {
11
16
  "cellar": ":any_skip_relocation",
12
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:81df298cd70628b2149823fa370aa3a6799fa3d794e1541f76f3f4a2d7bedac1",
13
- "sha256": "81df298cd70628b2149823fa370aa3a6799fa3d794e1541f76f3f4a2d7bedac1"
17
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:4d1f7565498827bbc53230f01c2fca4a7d082f4ae16d32ae568ba633c090c6ee",
18
+ "sha256": "4d1f7565498827bbc53230f01c2fca4a7d082f4ae16d32ae568ba633c090c6ee"
14
19
  },
15
20
  "arm64_ventura": {
16
21
  "cellar": ":any_skip_relocation",
17
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:c69312fea87da1123deb27e6943e90affe661475571c6ca5967321688b46df8b",
18
- "sha256": "c69312fea87da1123deb27e6943e90affe661475571c6ca5967321688b46df8b"
22
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:416b54dc7938754980f9b2d732254ce7a36c401c2df3b68eba47f54db9bb956c",
23
+ "sha256": "416b54dc7938754980f9b2d732254ce7a36c401c2df3b68eba47f54db9bb956c"
19
24
  },
20
25
  "arm64_monterey": {
21
26
  "cellar": ":any_skip_relocation",
22
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:da2a5c24a8132589cee415f4a0754ccc8b39e67e74e06469a3cb6b45d880877a",
23
- "sha256": "da2a5c24a8132589cee415f4a0754ccc8b39e67e74e06469a3cb6b45d880877a"
27
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:3b14b0bacb0938c650e2d0d30d1f546ea7bac4feac510be16f09a89abd9f95d4",
28
+ "sha256": "3b14b0bacb0938c650e2d0d30d1f546ea7bac4feac510be16f09a89abd9f95d4"
24
29
  },
25
30
  "sonoma": {
26
31
  "cellar": ":any_skip_relocation",
27
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:5d5e97425579868571f6322c7472793ef0e652b0ccb64248a466f5f6a85d8b0c",
28
- "sha256": "5d5e97425579868571f6322c7472793ef0e652b0ccb64248a466f5f6a85d8b0c"
32
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:445a0e38bda1f1dbda7c34dbb75a1b4432c5f0de7f9fa8bd4e03a9220b9bda19",
33
+ "sha256": "445a0e38bda1f1dbda7c34dbb75a1b4432c5f0de7f9fa8bd4e03a9220b9bda19"
29
34
  },
30
35
  "ventura": {
31
36
  "cellar": ":any_skip_relocation",
32
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:402e0e5e117296bee234ef2d657a49ef3397dd898db244a43abe6b02b83b6c48",
33
- "sha256": "402e0e5e117296bee234ef2d657a49ef3397dd898db244a43abe6b02b83b6c48"
37
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:508b2e8000078773c7884e17b8d1ca711f4313ba14ff0000f7a28af68b02e71a",
38
+ "sha256": "508b2e8000078773c7884e17b8d1ca711f4313ba14ff0000f7a28af68b02e71a"
34
39
  },
35
40
  "monterey": {
36
41
  "cellar": ":any_skip_relocation",
37
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:67abaff7e1f041b060e35e8ad1573737c93866c18a9bb4e84c9fd1d85e2064f2",
38
- "sha256": "67abaff7e1f041b060e35e8ad1573737c93866c18a9bb4e84c9fd1d85e2064f2"
42
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:8c367a76ca05ba07ffc38a6bb2f5ee0231d363655ed982284afcb4d685fa524e",
43
+ "sha256": "8c367a76ca05ba07ffc38a6bb2f5ee0231d363655ed982284afcb4d685fa524e"
39
44
  },
40
45
  "x86_64_linux": {
41
46
  "cellar": "/home/linuxbrew/.linuxbrew/Cellar",
42
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:5c6a46f3995ad0b606c0c8a823b9236998ac512ba8895e8b1c3b35730fc2067d",
43
- "sha256": "5c6a46f3995ad0b606c0c8a823b9236998ac512ba8895e8b1c3b35730fc2067d"
47
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:8e8abc969e1b10e7411a92717703c8cd944c7a3f3fd04e2d232918971ae14662",
48
+ "sha256": "8e8abc969e1b10e7411a92717703c8cd944c7a3f3fd04e2d232918971ae14662"
44
49
  }
45
50
  }
46
51
  }
@@ -82,12 +87,12 @@
82
87
  "macOS": "13.6"
83
88
  },
84
89
  "sonoma": {
85
- "HOMEBREW_VERSION": "4.3.10",
90
+ "HOMEBREW_VERSION": "4.3.24",
86
91
  "HOMEBREW_PREFIX": "/opt/homebrew",
87
92
  "Homebrew/homebrew-core": "api",
88
- "CLT": "15.3.0.0.1.1708646388",
93
+ "CLT": "16.0.0.0.1.1724870825",
89
94
  "Xcode": "15.4",
90
- "macOS": "14.5"
95
+ "macOS": "14.6.1"
91
96
  }
92
97
  }
93
98
  }
@@ -8,6 +8,7 @@ task(:brew) do
8
8
  raise '`brew` is required. Please install brew. https://brew.sh/' unless system('which brew')
9
9
 
10
10
  puts('➡️ Brew')
11
+ sh('brew update')
11
12
  sh('brew bundle')
12
13
  end
13
14
 
@@ -116,6 +116,11 @@ module FastlaneCore
116
116
  # Raise error if more than 1 build is returned
117
117
  # This should never happen but need to inform the user if it does
118
118
  matched_builds = version_matches.map(&:builds).flatten
119
+
120
+ # Need to filter out duplicate builds (which could be a result from the double X.Y.0 and X.Y queries)
121
+ # See: https://github.com/fastlane/fastlane/issues/22248
122
+ matched_builds = matched_builds.uniq(&:id)
123
+
119
124
  if matched_builds.size > 1 && !select_latest
120
125
  error_builds = matched_builds.map do |build|
121
126
  "#{build.app_version}(#{build.version}) for #{build.platform} - #{build.processing_state}"
@@ -341,6 +341,7 @@ module FastlaneCore
341
341
  proj << "-derivedDataPath #{options[:derived_data_path].shellescape}" if options[:derived_data_path]
342
342
  proj << "-xcconfig #{options[:xcconfig].shellescape}" if options[:xcconfig]
343
343
  proj << "-scmProvider system" if options[:use_system_scm]
344
+ proj << "-packageAuthorizationProvider #{options[:package_authorization_provider].shellescape}" if options[:package_authorization_provider]
344
345
 
345
346
  xcode_at_least_11 = FastlaneCore::Helper.xcode_at_least?('11.0')
346
347
  if xcode_at_least_11 && options[:cloned_source_packages_path]
@@ -320,7 +320,16 @@ module Gym
320
320
  description: "Lets xcodebuild use system's scm configuration",
321
321
  optional: true,
322
322
  type: Boolean,
323
- default_value: false)
323
+ default_value: false),
324
+ FastlaneCore::ConfigItem.new(key: :package_authorization_provider,
325
+ env_name: "GYM_PACKAGE_AUTHORIZATION_PROVIDER",
326
+ description: "Lets xcodebuild use a specified package authorization provider (keychain|netrc)",
327
+ optional: true,
328
+ type: String,
329
+ verify_block: proc do |value|
330
+ av = %w(netrc keychain)
331
+ UI.user_error!("Unsupported authorization provider '#{value}', must be: #{av}") unless av.include?(value)
332
+ end)
324
333
  ]
325
334
  end
326
335
  end
@@ -26,7 +26,8 @@ module Match
26
26
  git_url: params[:git_url],
27
27
  s3_bucket: params[:s3_bucket],
28
28
  s3_skip_encryption: params[:s3_skip_encryption],
29
- working_directory: storage.working_directory
29
+ working_directory: storage.working_directory,
30
+ force_legacy_encryption: params[:force_legacy_encryption]
30
31
  })
31
32
  encryption.decrypt_files
32
33
 
@@ -134,11 +134,11 @@ module Match
134
134
 
135
135
  # The methods of this class will encrypt or decrypt files in place, by default.
136
136
  class MatchFileEncryption
137
- def encrypt(file_path:, password:, output_path: nil)
137
+ def encrypt(file_path:, password:, output_path: nil, version: 2)
138
138
  output_path = file_path unless output_path
139
139
  data_to_encrypt = File.binread(file_path)
140
140
  e = MatchDataEncryption.new
141
- data = e.encrypt(data: data_to_encrypt, password: password)
141
+ data = e.encrypt(data: data_to_encrypt, password: password, version: version)
142
142
  File.write(output_path, data)
143
143
  end
144
144
 
@@ -14,18 +14,23 @@ module Match
14
14
 
15
15
  attr_accessor :working_directory
16
16
 
17
+ attr_accessor :force_legacy_encryption
18
+
17
19
  def self.configure(params)
18
20
  return self.new(
19
21
  keychain_name: params[:keychain_name],
20
- working_directory: params[:working_directory]
22
+ working_directory: params[:working_directory],
23
+ force_legacy_encryption: params[:force_legacy_encryption]
21
24
  )
22
25
  end
23
26
 
24
27
  # @param keychain_name: The identifier used to store the passphrase in the Keychain
25
28
  # @param working_directory: The path to where the certificates are stored
26
- def initialize(keychain_name: nil, working_directory: nil)
29
+ # @param force_legacy_encryption: Force use of legacy EncryptionV1 algorithm
30
+ def initialize(keychain_name: nil, working_directory: nil, force_legacy_encryption: false)
27
31
  self.keychain_name = keychain_name
28
32
  self.working_directory = working_directory
33
+ self.force_legacy_encryption = force_legacy_encryption
29
34
  end
30
35
 
31
36
  def encrypt_files(password: nil)
@@ -33,7 +38,7 @@ module Match
33
38
  password ||= fetch_password!
34
39
  iterate(self.working_directory) do |current|
35
40
  files << current
36
- encrypt_specific_file(path: current, password: password)
41
+ encrypt_specific_file(path: current, password: password, version: force_legacy_encryption ? 1 : 2)
37
42
  UI.success("🔒 Encrypted '#{File.basename(current)}'") if FastlaneCore::Globals.verbose?
38
43
  end
39
44
  UI.success("🔒 Successfully encrypted certificates repo")
@@ -109,10 +114,10 @@ module Match
109
114
  return password
110
115
  end
111
116
 
112
- def encrypt_specific_file(path: nil, password: nil)
117
+ def encrypt_specific_file(path: nil, password: nil, version: nil)
113
118
  UI.user_error!("No password supplied") if password.to_s.strip.length == 0
114
119
  e = MatchFileEncryption.new
115
- e.encrypt(file_path: path, password: password)
120
+ e.encrypt(file_path: path, password: password, version: version)
116
121
  rescue FastlaneCore::Interface::FastlaneError
117
122
  raise
118
123
  rescue => error
@@ -23,7 +23,8 @@ module Match
23
23
  git_url: params[:git_url],
24
24
  s3_bucket: params[:s3_bucket],
25
25
  s3_skip_encryption: params[:s3_skip_encryption],
26
- working_directory: storage.working_directory
26
+ working_directory: storage.working_directory,
27
+ force_legacy_encryption: params[:force_legacy_encryption]
27
28
  })
28
29
  encryption.decrypt_files if encryption
29
30
  UI.success("Repo is at: '#{storage.working_directory}'")
@@ -42,7 +42,8 @@ module Match
42
42
  git_url: params[:git_url],
43
43
  s3_bucket: params[:s3_bucket],
44
44
  s3_skip_encryption: params[:s3_skip_encryption],
45
- working_directory: storage.working_directory
45
+ working_directory: storage.working_directory,
46
+ force_legacy_encryption: params[:force_legacy_encryption]
46
47
  })
47
48
  self.encryption.decrypt_files if self.encryption
48
49
 
@@ -355,6 +355,11 @@ module Match
355
355
  description: "Skips setting the partition list (which can sometimes take a long time). Setting the partition list is usually needed to prevent Xcode from prompting to allow a cert to be used for signing",
356
356
  type: Boolean,
357
357
  default_value: false),
358
+ FastlaneCore::ConfigItem.new(key: :force_legacy_encryption,
359
+ env_name: "MATCH_FORCE_LEGACY_ENCRYPTION",
360
+ description: "Force encryption to use legacy cbc algorithm for backwards compatibility with older match versions",
361
+ type: Boolean,
362
+ default_value: false),
358
363
 
359
364
  # other
360
365
  FastlaneCore::ConfigItem.new(key: :verbose,
@@ -49,7 +49,8 @@ module Match
49
49
  git_url: params[:git_url],
50
50
  s3_bucket: params[:s3_bucket],
51
51
  s3_skip_encryption: params[:s3_skip_encryption],
52
- working_directory: storage.working_directory
52
+ working_directory: storage.working_directory,
53
+ force_legacy_encryption: params[:force_legacy_encryption]
53
54
  })
54
55
  encryption.decrypt_files if encryption
55
56
 
@@ -391,6 +391,7 @@ module Pilot
391
391
  end
392
392
 
393
393
  # If App Store Connect API token, use token.
394
+ # If api_key is specified and it is an Individual API Key, don't use token but use username.
394
395
  # If itc_provider was explicitly specified, use it.
395
396
  # If there are multiple teams, infer the provider from the selected team name.
396
397
  # If there are fewer than two teams, don't infer the provider.
@@ -407,6 +408,14 @@ module Pilot
407
408
  api_key
408
409
  end
409
410
 
411
+ # Currently no kind of transporters accept an Individual API Key. Use username and app-specific password instead.
412
+ # See https://github.com/fastlane/fastlane/issues/22115
413
+ is_individual_key = !api_key.nil? && api_key[:issuer_id].nil?
414
+ if is_individual_key
415
+ api_key = nil
416
+ api_token = nil
417
+ end
418
+
410
419
  unless api_token.nil?
411
420
  api_token.refresh! if api_token.expired?
412
421
  return FastlaneCore::ItunesTransporter.new(nil, nil, false, nil, api_token.text, altool_compatible_command: true, api_key: api_key)
@@ -24,7 +24,7 @@ module Scan
24
24
 
25
25
  def building_mac_catalyst_for_mac?
26
26
  return false unless Scan.project
27
- Scan.project.supports_mac_catalyst? && Scan.config[:catalyst_platform] == "macos"
27
+ Scan.config[:catalyst_platform] == "macos" && Scan.project.supports_mac_catalyst?
28
28
  end
29
29
  end
30
30
 
@@ -537,7 +537,16 @@ module Scan
537
537
  env_name: "SCAN_FAIL_BUILD",
538
538
  description: "Should this step stop the build if the tests fail? Set this to false if you're using trainer",
539
539
  type: Boolean,
540
- default_value: true)
540
+ default_value: true),
541
+ FastlaneCore::ConfigItem.new(key: :package_authorization_provider,
542
+ env_name: "SCAN_PACKAGE_AUTHORIZATION_PROVIDER",
543
+ description: "Lets xcodebuild use a specified package authorization provider (keychain|netrc)",
544
+ optional: true,
545
+ type: String,
546
+ verify_block: proc do |value|
547
+ av = %w(netrc keychain)
548
+ UI.user_error!("Unsupported authorization provider '#{value}', must be: #{av}") unless av.include?(value)
549
+ end)
541
550
 
542
551
  ]
543
552
  end
@@ -267,6 +267,15 @@ module Snapshot
267
267
  description: "Prevents packages from automatically being resolved to versions other than those recorded in the `Package.resolved` file",
268
268
  type: Boolean,
269
269
  default_value: false),
270
+ FastlaneCore::ConfigItem.new(key: :package_authorization_provider,
271
+ env_name: "SNAPSHOT_PACKAGE_AUTHORIZATION_PROVIDER",
272
+ description: "Lets xcodebuild use a specified package authorization provider (keychain|netrc)",
273
+ optional: true,
274
+ type: String,
275
+ verify_block: proc do |value|
276
+ av = %w(netrc keychain)
277
+ UI.user_error!("Unsupported authorization provider '#{value}', must be: #{av}") unless av.include?(value)
278
+ end),
270
279
  FastlaneCore::ConfigItem.new(key: :testplan,
271
280
  env_name: "SNAPSHOT_TESTPLAN",
272
281
  description: "The testplan associated with the scheme that should be used for testing",
metadata CHANGED
@@ -1,39 +1,39 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.222.0
4
+ version: 2.223.1
5
5
  platform: ruby
6
6
  authors:
7
- - Olivier Halligon
7
+ - Satoshi Namai
8
8
  - Manu Wallner
9
+ - Felix Krause
10
+ - Kohki Miki
9
11
  - Max Ott
10
- - Luka Mirosevic
11
- - Joshua Liebowitz
12
- - Iulian Onofrei
13
- - Łukasz Grabowski
14
- - Manish Rathi
15
- - Jimmy Dee
16
- - Jan Piotrowski
17
- - Aaron Brager
18
- - Matthew Ellis
19
- - Jérôme Lacoste
20
- - Satoshi Namai
21
12
  - Jorge Revuelta H
22
- - Andrew McBurney
13
+ - Jérôme Lacoste
14
+ - Aaron Brager
15
+ - Olivier Halligon
16
+ - Jimmy Dee
17
+ - Manish Rathi
18
+ - Iulian Onofrei
19
+ - Stefan Natchev
23
20
  - Maksym Grebenets
21
+ - Roger Oba
24
22
  - Fumiya Nakamura
23
+ - Matthew Ellis
24
+ - Łukasz Grabowski
25
25
  - Danielle Tomlinson
26
- - Felix Krause
27
- - Kohki Miki
28
- - Stefan Natchev
29
26
  - Josh Holtz
30
- - Helmut Januschka
31
- - Roger Oba
32
27
  - Daniel Jankowski
28
+ - Andrew McBurney
29
+ - Joshua Liebowitz
30
+ - Jan Piotrowski
31
+ - Helmut Januschka
32
+ - Luka Mirosevic
33
33
  autorequire:
34
34
  bindir: bin
35
35
  cert_chain: []
36
- date: 2024-07-26 00:00:00.000000000 Z
36
+ date: 2024-09-27 00:00:00.000000000 Z
37
37
  dependencies:
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: addressable