fastlane 2.227.1 → 2.228.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +84 -84
  3. data/deliver/lib/deliver/runner.rb +1 -1
  4. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +8 -6
  5. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +11 -1
  6. data/fastlane/lib/fastlane/version.rb +1 -1
  7. data/fastlane/swift/Deliverfile.swift +1 -1
  8. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  9. data/fastlane/swift/Fastlane.swift +10 -69
  10. data/fastlane/swift/Gymfile.swift +1 -1
  11. data/fastlane/swift/GymfileProtocol.swift +1 -1
  12. data/fastlane/swift/Matchfile.swift +1 -1
  13. data/fastlane/swift/MatchfileProtocol.swift +2 -2
  14. data/fastlane/swift/Precheckfile.swift +1 -1
  15. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  16. data/fastlane/swift/Scanfile.swift +1 -1
  17. data/fastlane/swift/ScanfileProtocol.swift +3 -3
  18. data/fastlane/swift/Screengrabfile.swift +1 -1
  19. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  20. data/fastlane/swift/Snapshotfile.swift +1 -1
  21. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  22. data/fastlane_core/lib/assets/XMLTemplate.xml.erb +5 -1
  23. data/fastlane_core/lib/fastlane_core/command_executor.rb +3 -1
  24. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +4 -14
  25. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +5 -2
  26. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +105 -98
  27. data/match/lib/match/options.rb +1 -0
  28. data/pilot/lib/pilot/build_manager.rb +7 -1
  29. data/scan/lib/scan/options.rb +2 -2
  30. data/sigh/lib/sigh/options.rb +1 -0
  31. data/sigh/lib/sigh/runner.rb +5 -2
  32. data/spaceship/lib/spaceship/connect_api/models/profile.rb +2 -3
  33. metadata +18 -19
  34. data/fastlane/lib/fastlane/actions/hipchat.rb +0 -200
@@ -77,8 +77,10 @@ module FastlaneCore
77
77
 
78
78
  # Exit status for build command, should be 0 if build succeeded
79
79
  if status != 0
80
+ is_output_already_printed = print_all && !suppress_output
80
81
  o = output.join("\n")
81
- puts(o) unless suppress_output # the user has the right to see the raw output
82
+ puts(o) unless is_output_already_printed
83
+
82
84
  UI.error("Exit status: #{status}")
83
85
  if error
84
86
  error.call(o, status)
@@ -1,4 +1,5 @@
1
1
  require 'open3'
2
+ require 'stringio'
2
3
  require 'zip'
3
4
 
4
5
  require_relative 'core_ext/cfpropertylist'
@@ -46,21 +47,10 @@ module FastlaneCore
46
47
  end
47
48
  return nil if plist_data.nil?
48
49
 
49
- # Creates a temporary directory with a unique name tagged with 'fastlane'
50
- # The directory is deleted automatically at the end of the block
51
- Dir.mktmpdir("fastlane") do |tmp|
52
- # The XML file has to be properly unpacked first
53
- tmp_path = File.join(tmp, "Info.plist")
54
- File.open(tmp_path, 'wb') do |output|
55
- output.write(plist_data)
56
- end
57
- result = CFPropertyList.native_types(CFPropertyList::List.new(file: tmp_path).value)
58
-
59
- if result['CFBundleIdentifier'] || result['CFBundleVersion']
60
- return result
61
- end
50
+ result = CFPropertyList.native_types(CFPropertyList::List.new(data: plist_data).value)
51
+ if result['CFBundleIdentifier'] || result['CFBundleVersion']
52
+ return result
62
53
  end
63
-
64
54
  return nil
65
55
  end
66
56
 
@@ -12,7 +12,7 @@ module FastlaneCore
12
12
 
13
13
  attr_accessor :package_path
14
14
 
15
- def generate(app_id: nil, ipa_path: nil, package_path: nil, platform: nil)
15
+ def generate(app_id: nil, ipa_path: nil, package_path: nil, platform: nil, app_identifier: nil, short_version: nil, bundle_version: nil)
16
16
  self.package_path = File.join(package_path, "#{app_id}-#{SecureRandom.uuid}.itmsp")
17
17
  FileUtils.rm_rf(self.package_path) if File.directory?(self.package_path)
18
18
  FileUtils.mkdir_p(self.package_path)
@@ -24,7 +24,10 @@ module FastlaneCore
24
24
  ipa_path: File.basename(ipa_path), # this is only the base name as the ipa is inside the package
25
25
  md5: Digest::MD5.file(ipa_path).hexdigest,
26
26
  archive_type: "bundle",
27
- platform: (platform || "ios") # pass "appletvos" for Apple TV's IPA
27
+ platform: (platform || "ios"), # pass "appletvos" for Apple TV's IPA
28
+ app_identifier: app_identifier,
29
+ short_version: short_version,
30
+ bundle_version: bundle_version
28
31
  }
29
32
 
30
33
  xml_path = File.join(FastlaneCore::ROOT, "lib/assets/XMLTemplate.xml.erb")
@@ -51,6 +51,45 @@ module FastlaneCore
51
51
  not_implemented(__method__)
52
52
  end
53
53
 
54
+ # Builds a string array of credentials parameters based on the provided authentication details.
55
+ #
56
+ # @param username [String, nil] The username for authentication (optional).
57
+ # @param password [String, nil] The password for authentication (optional).
58
+ # @param jwt [String, nil] A JSON Web Token for token-based authentication (optional).
59
+ # @param api_key [Hash, nil] An API key for authentication (optional).
60
+ #
61
+ # @return [String] A string containing the appropriate credentials for authentication.
62
+ def build_credential_params(username = nil, password = nil, jwt = nil, api_key = nil)
63
+ not_implemented(__method__)
64
+ end
65
+
66
+ # Runs preparations before executing any command from the executor.
67
+ #
68
+ # @param original_api_key [Hash] api key containing the issuer id and private key
69
+ # @return [Hash] copy of `api_key` which includes an extra `key_dir` with the location of the .p8 file on disk
70
+ def prepare(original_api_key:)
71
+ return if original_api_key.nil?
72
+ # Create .p8 file from api_key and provide api key info which contains .p8 file path
73
+ api_key = original_api_key.dup
74
+ if self.kind_of?(ShellScriptTransporterExecutor)
75
+ # as of Transporter v3.3.0, the app is unable to detect the private keys under the 'private_keys' folder in current directory
76
+ # so we must rely on the other search paths in the Home dir:
77
+ # https://help.apple.com/itc/transporteruserguide/en.lproj/static.html#itc803b7be80
78
+ private_keys_dir = File.join(Dir.home, ".appstoreconnect/private_keys")
79
+ unless Dir.exist?(private_keys_dir)
80
+ FileUtils.mkdir_p(private_keys_dir)
81
+ end
82
+ api_key[:key_dir] = private_keys_dir
83
+ else
84
+ api_key[:key_dir] = Dir.mktmpdir("deliver-")
85
+ end
86
+ # Specified p8 needs to be generated to call altool or iTMSTransporter
87
+ File.open(File.join(api_key[:key_dir], "AuthKey_#{api_key[:key_id]}.p8"), "wb") do |p8|
88
+ p8.write(api_key[:key])
89
+ end
90
+ api_key
91
+ end
92
+
54
93
  def execute(command, hide_output)
55
94
  if Helper.test?
56
95
  yield(nil) if block_given?
@@ -249,21 +288,7 @@ module FastlaneCore
249
288
  @errors << "-1 indicates altool exited abnormally; try retrying (see https://github.com/fastlane/fastlane/issues/21535)" if exit_status == -1
250
289
 
251
290
  unless @errors.empty? || @all_lines.empty?
252
- # Print the last lines that appear after the last error from the logs
253
- # If error text is not detected, it will be 20 lines
254
- # This is key for non-verbose mode
255
-
256
- # The format of altool's result with error is like below
257
- # > *** Error: Error uploading '...'.
258
- # > *** Error: ...
259
- # > {
260
- # > NSLocalizedDescription = "...",
261
- # > ...
262
- # > }
263
- # So this line tries to find the line which has "*** Error:" prefix from bottom of log
264
- error_line_index = @all_lines.rindex { |line| ERROR_REGEX.match?(line) }
265
-
266
- @all_lines[(error_line_index || -20)..-1].each do |line|
291
+ @all_lines.each do |line|
267
292
  UI.important("[altool] #{line}")
268
293
  end
269
294
  UI.message("Application Loader output above ^")
@@ -274,16 +299,21 @@ module FastlaneCore
274
299
  exit_status.zero?
275
300
  end
276
301
 
302
+ def build_credential_params(username = nil, password = nil, jwt = nil, api_key = nil)
303
+ if !username.nil? && !password.nil? && api_key.nil?
304
+ "-u #{username.shellescape} -p #{password.shellescape}"
305
+ elsif !api_key.nil?
306
+ "--apiKey #{api_key[:key_id]} --apiIssuer #{api_key[:issuer_id]}"
307
+ end
308
+ end
309
+
277
310
  def build_upload_command(username, password, source = "/tmp", provider_short_name = "", jwt = nil, platform = nil, api_key = nil)
278
311
  use_api_key = !api_key.nil?
279
312
  [
280
313
  ("API_PRIVATE_KEYS_DIR=#{api_key[:key_dir]}" if use_api_key),
281
314
  "xcrun altool",
282
315
  "--upload-app",
283
- ("-u #{username.shellescape}" unless use_api_key),
284
- ("-p #{password.shellescape}" unless use_api_key),
285
- ("--apiKey #{api_key[:key_id]}" if use_api_key),
286
- ("--apiIssuer #{api_key[:issuer_id]}" if use_api_key),
316
+ build_credential_params(username, password, jwt, api_key),
287
317
  ("--asc-provider #{provider_short_name}" unless use_api_key || provider_short_name.to_s.empty?),
288
318
  platform_option(platform),
289
319
  file_upload_option(source),
@@ -298,10 +328,7 @@ module FastlaneCore
298
328
  ("API_PRIVATE_KEYS_DIR=#{api_key[:key_dir]}" if use_api_key),
299
329
  "xcrun altool",
300
330
  "--list-providers",
301
- ("-u #{username.shellescape}" unless use_api_key),
302
- ("-p #{password.shellescape}" unless use_api_key),
303
- ("--apiKey #{api_key[:key_id]}" if use_api_key),
304
- ("--apiIssuer #{api_key[:issuer_id]}" if use_api_key),
331
+ build_credential_params(username, password, jwt, api_key),
305
332
  "--output-format json"
306
333
  ].compact.join(' ')
307
334
  end
@@ -318,10 +345,7 @@ module FastlaneCore
318
345
  ("API_PRIVATE_KEYS_DIR=#{api_key[:key_dir]}" if use_api_key),
319
346
  "xcrun altool",
320
347
  "--validate-app",
321
- ("-u #{username.shellescape}" unless use_api_key),
322
- ("-p #{password.shellescape}" unless use_api_key),
323
- ("--apiKey #{api_key[:key_id]}" if use_api_key),
324
- ("--apiIssuer #{api_key[:issuer_id]}" if use_api_key),
348
+ build_credential_params(username, password, nil, api_key),
325
349
  ("--asc-provider #{provider_short_name}" unless use_api_key || provider_short_name.to_s.empty?),
326
350
  platform_option(platform),
327
351
  file_upload_option(source)
@@ -385,14 +409,21 @@ module FastlaneCore
385
409
 
386
410
  # Generates commands and executes the iTMSTransporter through the shell script it provides by the same name
387
411
  class ShellScriptTransporterExecutor < TransporterExecutor
412
+ def build_credential_params(username = nil, password = nil, jwt = nil, api_key = nil)
413
+ if !(username.nil? || password.nil?) && (jwt.nil? && api_key.nil?)
414
+ "-u #{username.shellescape} -p #{shell_escaped_password(password)}"
415
+ elsif !jwt.nil? && api_key.nil?
416
+ "-jwt #{jwt}"
417
+ elsif !api_key.nil?
418
+ "-apiIssuer #{api_key[:issuer_id]} -apiKey #{api_key[:key_id]}"
419
+ end
420
+ end
421
+
388
422
  def build_upload_command(username, password, source = "/tmp", provider_short_name = "", jwt = nil, platform = nil, api_key = nil)
389
- use_jwt = !jwt.to_s.empty?
390
423
  [
391
424
  '"' + Helper.transporter_path + '"',
392
425
  "-m upload",
393
- ("-u #{username.shellescape}" unless use_jwt),
394
- ("-p #{shell_escaped_password(password)}" unless use_jwt),
395
- ("-jwt #{jwt}" if use_jwt),
426
+ build_credential_params(username, password, jwt, api_key),
396
427
  file_upload_option(source),
397
428
  additional_upload_parameters, # that's here, because the user might overwrite the -t option
398
429
  "-k 100000",
@@ -402,13 +433,10 @@ module FastlaneCore
402
433
  end
403
434
 
404
435
  def build_download_command(username, password, apple_id, destination = "/tmp", provider_short_name = "", jwt = nil)
405
- use_jwt = !jwt.to_s.empty?
406
436
  [
407
437
  '"' + Helper.transporter_path + '"',
408
438
  "-m lookupMetadata",
409
- ("-u #{username.shellescape}" unless use_jwt),
410
- ("-p #{shell_escaped_password(password)}" unless use_jwt),
411
- ("-jwt #{jwt}" if use_jwt),
439
+ build_credential_params(username, password, jwt),
412
440
  "-apple_id #{apple_id}",
413
441
  "-destination '#{destination}'",
414
442
  ("-itc_provider #{provider_short_name}" if jwt.nil? && !provider_short_name.to_s.empty?)
@@ -416,25 +444,19 @@ module FastlaneCore
416
444
  end
417
445
 
418
446
  def build_provider_ids_command(username, password, jwt = nil, api_key = nil)
419
- use_jwt = !jwt.to_s.empty?
420
447
  [
421
448
  '"' + Helper.transporter_path + '"',
422
449
  '-m provider',
423
- ("-u \"#{username.shellescape}\"" unless use_jwt),
424
- ("-p #{shell_escaped_password(password)}" unless use_jwt),
425
- ("-jwt #{jwt}" if use_jwt)
450
+ build_credential_params(username, password, jwt, api_key)
426
451
  ].compact.join(' ')
427
452
  end
428
453
 
429
454
  def build_verify_command(username, password, source = "/tmp", provider_short_name = "", **kwargs)
430
455
  jwt = kwargs[:jwt]
431
- use_jwt = !jwt.to_s.empty?
432
456
  [
433
457
  '"' + Helper.transporter_path + '"',
434
458
  '-m verify',
435
- ("-u #{username.shellescape}" unless use_jwt),
436
- ("-p #{shell_escaped_password(password)}" unless use_jwt),
437
- ("-jwt #{jwt}" if use_jwt),
459
+ build_credential_params(username, password, jwt),
438
460
  "-f #{source.shellescape}",
439
461
  ("-WONoPause true" if Helper.windows?), # Windows only: process instantly returns instead of waiting for key press
440
462
  ("-itc_provider #{provider_short_name}" if jwt.nil? && !provider_short_name.to_s.empty?)
@@ -482,16 +504,26 @@ module FastlaneCore
482
504
  # Generates commands and executes the iTMSTransporter by invoking its Java app directly, to avoid the crazy parameter
483
505
  # escaping problems in its accompanying shell script.
484
506
  class JavaTransporterExecutor < TransporterExecutor
507
+ def build_credential_params(username = nil, password = nil, jwt = nil, api_key = nil, is_password_from_env = false)
508
+ if !username.nil? && jwt.to_s.empty?
509
+ if is_password_from_env
510
+ "-u #{username.shellescape} -p @env:ITMS_TRANSPORTER_PASSWORD"
511
+ elsif !password.nil?
512
+ "-u #{username.shellescape} -p #{password.shellescape}"
513
+ end
514
+ elsif !jwt.to_s.empty?
515
+ "-jwt #{jwt}"
516
+ end
517
+ end
518
+
485
519
  def build_upload_command(username, password, source = "/tmp", provider_short_name = "", jwt = nil, platform = nil, api_key = nil)
486
- use_jwt = !jwt.to_s.empty?
487
- if !Helper.user_defined_itms_path? && Helper.mac? && Helper.xcode_at_least?(11)
520
+ credential_params = build_credential_params(username, password, jwt, api_key, is_default_itms_on_xcode_11?)
521
+ if is_default_itms_on_xcode_11?
488
522
  [
489
- ("ITMS_TRANSPORTER_PASSWORD=#{password.shellescape}" unless use_jwt),
523
+ ("ITMS_TRANSPORTER_PASSWORD=#{password.shellescape}" if jwt.to_s.empty?),
490
524
  'xcrun iTMSTransporter',
491
525
  '-m upload',
492
- ("-u #{username.shellescape}" unless use_jwt),
493
- ("-p @env:ITMS_TRANSPORTER_PASSWORD" unless use_jwt),
494
- ("-jwt #{jwt}" if use_jwt),
526
+ credential_params,
495
527
  file_upload_option(source),
496
528
  additional_upload_parameters, # that's here, because the user might overwrite the -t option
497
529
  '-k 100000',
@@ -510,9 +542,7 @@ module FastlaneCore
510
542
  '-Dsun.net.http.retryPost=false',
511
543
  java_code_option,
512
544
  '-m upload',
513
- ("-u #{username.shellescape}" unless use_jwt),
514
- ("-p #{password.shellescape}" unless use_jwt),
515
- ("-jwt #{jwt}" if use_jwt),
545
+ credential_params,
516
546
  file_upload_option(source),
517
547
  additional_upload_parameters, # that's here, because the user might overwrite the -t option
518
548
  '-k 100000',
@@ -524,15 +554,13 @@ module FastlaneCore
524
554
 
525
555
  def build_verify_command(username, password, source = "/tmp", provider_short_name = "", **kwargs)
526
556
  jwt = kwargs[:jwt]
527
- use_jwt = !jwt.to_s.empty?
528
- if !Helper.user_defined_itms_path? && Helper.mac? && Helper.xcode_at_least?(11)
557
+ credential_params = build_credential_params(username, password, jwt, nil, is_default_itms_on_xcode_11?)
558
+ if is_default_itms_on_xcode_11?
529
559
  [
530
- ("ITMS_TRANSPORTER_PASSWORD=#{password.shellescape}" unless use_jwt),
560
+ ("ITMS_TRANSPORTER_PASSWORD=#{password.shellescape}" if jwt.to_s.empty?),
531
561
  'xcrun iTMSTransporter',
532
562
  '-m verify',
533
- ("-u #{username.shellescape}" unless use_jwt),
534
- ("-p @env:ITMS_TRANSPORTER_PASSWORD" unless use_jwt),
535
- ("-jwt #{jwt}" if use_jwt),
563
+ credential_params,
536
564
  "-f #{source.shellescape}",
537
565
  ("-itc_provider #{provider_short_name}" if jwt.nil? && !provider_short_name.to_s.empty?),
538
566
  '2>&1' # cause stderr to be written to stdout
@@ -549,9 +577,7 @@ module FastlaneCore
549
577
  '-Dsun.net.http.retryPost=false',
550
578
  java_code_option,
551
579
  '-m verify',
552
- ("-u #{username.shellescape}" unless use_jwt),
553
- ("-p #{password.shellescape}" unless use_jwt),
554
- ("-jwt #{jwt}" if use_jwt),
580
+ credential_params,
555
581
  "-f #{source.shellescape}",
556
582
  ("-itc_provider #{provider_short_name}" if jwt.nil? && !provider_short_name.to_s.empty?),
557
583
  '2>&1' # cause stderr to be written to stdout
@@ -560,15 +586,13 @@ module FastlaneCore
560
586
  end
561
587
 
562
588
  def build_download_command(username, password, apple_id, destination = "/tmp", provider_short_name = "", jwt = nil)
563
- use_jwt = !jwt.to_s.empty?
564
- if !Helper.user_defined_itms_path? && Helper.mac? && Helper.xcode_at_least?(11)
589
+ credential_params = build_credential_params(username, password, jwt, nil, is_default_itms_on_xcode_11?)
590
+ if is_default_itms_on_xcode_11?
565
591
  [
566
- ("ITMS_TRANSPORTER_PASSWORD=#{password.shellescape}" unless use_jwt),
592
+ ("ITMS_TRANSPORTER_PASSWORD=#{password.shellescape}" if jwt.to_s.empty?),
567
593
  'xcrun iTMSTransporter',
568
594
  '-m lookupMetadata',
569
- ("-u #{username.shellescape}" unless use_jwt),
570
- ("-p @env:ITMS_TRANSPORTER_PASSWORD" unless use_jwt),
571
- ("-jwt #{jwt}" if use_jwt),
595
+ credential_params,
572
596
  "-apple_id #{apple_id.shellescape}",
573
597
  "-destination #{destination.shellescape}",
574
598
  ("-itc_provider #{provider_short_name}" if jwt.nil? && !provider_short_name.to_s.empty?),
@@ -586,9 +610,7 @@ module FastlaneCore
586
610
  '-Dsun.net.http.retryPost=false',
587
611
  java_code_option,
588
612
  '-m lookupMetadata',
589
- ("-u #{username.shellescape}" unless use_jwt),
590
- ("-p #{password.shellescape}" unless use_jwt),
591
- ("-jwt #{jwt}" if use_jwt),
613
+ credential_params,
592
614
  "-apple_id #{apple_id.shellescape}",
593
615
  "-destination #{destination.shellescape}",
594
616
  ("-itc_provider #{provider_short_name}" if jwt.nil? && !provider_short_name.to_s.empty?),
@@ -598,15 +620,13 @@ module FastlaneCore
598
620
  end
599
621
 
600
622
  def build_provider_ids_command(username, password, jwt = nil, api_key = nil)
601
- use_jwt = !jwt.to_s.empty?
602
- if !Helper.user_defined_itms_path? && Helper.mac? && Helper.xcode_at_least?(11)
623
+ credential_params = build_credential_params(username, password, jwt, api_key, is_default_itms_on_xcode_11?)
624
+ if is_default_itms_on_xcode_11?
603
625
  [
604
- ("ITMS_TRANSPORTER_PASSWORD=#{password.shellescape}" unless use_jwt),
626
+ ("ITMS_TRANSPORTER_PASSWORD=#{password.shellescape}" if jwt.to_s.empty?),
605
627
  'xcrun iTMSTransporter',
606
628
  '-m provider',
607
- ("-u #{username.shellescape}" unless use_jwt),
608
- ("-p @env:ITMS_TRANSPORTER_PASSWORD" unless use_jwt),
609
- ("-jwt #{jwt}" if use_jwt),
629
+ credential_params,
610
630
  '2>&1' # cause stderr to be written to stdout
611
631
  ].compact.join(' ')
612
632
  else
@@ -621,14 +641,16 @@ module FastlaneCore
621
641
  '-Dsun.net.http.retryPost=false',
622
642
  java_code_option,
623
643
  '-m provider',
624
- ("-u #{username.shellescape}" unless use_jwt),
625
- ("-p #{password.shellescape}" unless use_jwt),
626
- ("-jwt #{jwt}" if use_jwt),
644
+ credential_params,
627
645
  '2>&1' # cause stderr to be written to stdout
628
646
  ].compact.join(' ')
629
647
  end
630
648
  end
631
649
 
650
+ def is_default_itms_on_xcode_11?
651
+ !Helper.user_defined_itms_path? && Helper.mac? && Helper.xcode_at_least?(11)
652
+ end
653
+
632
654
  def java_code_option
633
655
  if Helper.mac? && Helper.xcode_at_least?(9)
634
656
  return "-jar #{Helper.transporter_java_jar_path.shellescape}"
@@ -686,7 +708,7 @@ module FastlaneCore
686
708
  use_shell_script ||= Helper.windows?
687
709
  use_shell_script ||= Feature.enabled?('FASTLANE_ITUNES_TRANSPORTER_USE_SHELL_SCRIPT')
688
710
 
689
- if jwt.to_s.empty?
711
+ if jwt.to_s.empty? && api_key.nil?
690
712
  @user = user
691
713
  @password = password || load_password_for_transporter
692
714
  end
@@ -783,9 +805,7 @@ module FastlaneCore
783
805
  # Handle AppStore Connect API
784
806
  use_api_key = !@api_key.nil?
785
807
  api_key_placeholder = use_api_key ? { key_id: "YourKeyID", issuer_id: "YourIssuerID", key_dir: "YourTmpP8KeyDir" } : nil
786
-
787
- api_key = nil
788
- api_key = api_key_with_p8_file_path(@api_key) if use_api_key
808
+ api_key = @transporter_executor.prepare(original_api_key: @api_key)
789
809
 
790
810
  command = @transporter_executor.build_upload_command(@user, @password, actual_dir, @provider_short_name, @jwt, platform, api_key)
791
811
  UI.verbose(@transporter_executor.build_upload_command(@user, password_placeholder, actual_dir, @provider_short_name, jwt_placeholder, platform, api_key_placeholder))
@@ -846,8 +866,7 @@ module FastlaneCore
846
866
 
847
867
  # Masking credentials for verbose outputs
848
868
  api_key_placeholder = use_api_key ? { key_id: "YourKeyID", issuer_id: "YourIssuerID", key_dir: "YourTmpP8KeyDir" } : nil
849
-
850
- api_key = api_key_with_p8_file_path(@api_key) if use_api_key
869
+ api_key = @transporter_executor.prepare(original_api_key: @api_key)
851
870
 
852
871
  command = @transporter_executor.build_verify_command(@user, @password, actual_dir, @provider_short_name, jwt: @jwt, platform: platform, api_key: api_key)
853
872
  UI.verbose(@transporter_executor.build_verify_command(@user, password_placeholder, actual_dir, @provider_short_name, jwt: jwt_placeholder, platform: platform, api_key: api_key_placeholder))
@@ -882,8 +901,7 @@ module FastlaneCore
882
901
  use_api_key = !@api_key.nil?
883
902
  api_key_placeholder = use_api_key ? { key_id: "YourKeyID", issuer_id: "YourIssuerID", key_dir: "YourTmpP8KeyDir" } : nil
884
903
 
885
- api_key = nil
886
- api_key = api_key_with_p8_file_path(@api_key) if use_api_key
904
+ api_key = @transporter_executor.prepare(original_api_key: @api_key)
887
905
 
888
906
  command = @transporter_executor.build_provider_ids_command(@user, @password, @jwt, api_key)
889
907
  UI.verbose(@transporter_executor.build_provider_ids_command(@user, password_placeholder, jwt_placeholder, api_key_placeholder))
@@ -908,17 +926,6 @@ module FastlaneCore
908
926
 
909
927
  TWO_FACTOR_ENV_VARIABLE = "FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD"
910
928
 
911
- # Create .p8 file from api_key and provide api key info which contains .p8 file path
912
- def api_key_with_p8_file_path(original_api_key)
913
- api_key = original_api_key.dup
914
- api_key[:key_dir] = Dir.mktmpdir("deliver-")
915
- # Specified p8 needs to be generated to call altool
916
- File.open(File.join(api_key[:key_dir], "AuthKey_#{api_key[:key_id]}.p8"), "wb") do |p8|
917
- p8.write(api_key[:key])
918
- end
919
- api_key
920
- end
921
-
922
929
  # Returns whether altool should be used or ItunesTransporter should be used
923
930
  def should_use_altool?(altool_compatible_command, use_shell_script)
924
931
  # Xcode 14 no longer supports iTMSTransporter. Use altool instead
@@ -327,6 +327,7 @@ module Match
327
327
  env_name: "MATCH_PROVISIONING_PROFILE_TEMPLATE_NAME",
328
328
  description: "The name of provisioning profile template. If the developer account has provisioning profile templates (aka: custom entitlements), the template name can be found by inspecting the Entitlements drop-down while creating/editing a provisioning profile (e.g. \"Apple Pay Pass Suppression Development\")",
329
329
  optional: true,
330
+ deprecated: "Removed since May 2025 on App Store Connect API OpenAPI v3.8.0 - Learn more: https://docs.fastlane.tools/actions/match/#managed-capabilities",
330
331
  default_value: nil),
331
332
  FastlaneCore::ConfigItem.new(key: :profile_name,
332
333
  env_name: "MATCH_PROVISIONING_PROFILE_NAME",
@@ -33,10 +33,16 @@ module Pilot
33
33
  ipa_path = options[:ipa]
34
34
  if ipa_path && platform != 'osx'
35
35
  asset_path = ipa_path
36
+ app_identifier = config[:app_identifier] || fetch_app_identifier
37
+ short_version = config[:app_version] || FastlaneCore::IpaFileAnalyser.fetch_app_version(ipa_path)
38
+ bundle_version = config[:build_number] || FastlaneCore::IpaFileAnalyser.fetch_app_build(ipa_path)
36
39
  package_path = FastlaneCore::IpaUploadPackageBuilder.new.generate(app_id: fetch_app_id,
37
40
  ipa_path: ipa_path,
38
41
  package_path: dir,
39
- platform: platform)
42
+ platform: platform,
43
+ app_identifier: app_identifier,
44
+ short_version: short_version,
45
+ bundle_version: bundle_version)
40
46
  else
41
47
  pkg_path = options[:pkg]
42
48
  asset_path = pkg_path
@@ -125,7 +125,7 @@ module Scan
125
125
  # tests to run
126
126
  FastlaneCore::ConfigItem.new(key: :only_testing,
127
127
  env_name: "SCAN_ONLY_TESTING",
128
- description: "Array of strings matching Test Bundle/Test Suite/Test Cases to run",
128
+ description: "Array of test identifiers to run. Expected format: TestTarget[/TestSuite[/TestCase]]",
129
129
  optional: true,
130
130
  is_string: false,
131
131
  verify_block: proc do |value|
@@ -133,7 +133,7 @@ module Scan
133
133
  end),
134
134
  FastlaneCore::ConfigItem.new(key: :skip_testing,
135
135
  env_name: "SCAN_SKIP_TESTING",
136
- description: "Array of strings matching Test Bundle/Test Suite/Test Cases to skip",
136
+ description: "Array of test identifiers to skip. Expected format: TestTarget[/TestSuite[/TestCase]]",
137
137
  optional: true,
138
138
  is_string: false,
139
139
  verify_block: proc do |value|
@@ -190,6 +190,7 @@ module Sigh
190
190
  env_name: "SIGH_PROVISIONING_PROFILE_TEMPLATE_NAME",
191
191
  description: "The name of provisioning profile template. If the developer account has provisioning profile templates (aka: custom entitlements), the template name can be found by inspecting the Entitlements drop-down while creating/editing a provisioning profile (e.g. \"Apple Pay Pass Suppression Development\")",
192
192
  optional: true,
193
+ deprecated: "Removed since May 2025 on App Store Connect API OpenAPI v3.8.0 - Learn more: https://docs.fastlane.tools/actions/match/#managed-capabilities",
193
194
  default_value: nil),
194
195
  FastlaneCore::ConfigItem.new(key: :fail_on_name_taken,
195
196
  env_name: "SIGH_FAIL_ON_NAME_TAKEN",
@@ -174,13 +174,16 @@ module Sigh
174
174
 
175
175
  UI.important("Creating new provisioning profile for '#{Sigh.config[:app_identifier]}' with name '#{name}' for '#{Sigh.config[:platform]}' platform")
176
176
 
177
+ unless Sigh.config[:template_name].nil?
178
+ UI.important("Template name is set to '#{Sigh.config[:template_name]}', however, this is not supported by the App Store Connect API anymore, since May 2025. The template name will be ignored. For more information: https://docs.fastlane.tools/actions/match/#managed-capabilities")
179
+ end
180
+
177
181
  profile = Spaceship::ConnectAPI::Profile.create(
178
182
  name: name,
179
183
  profile_type: profile_type,
180
184
  bundle_id_id: bundle_id.id,
181
185
  certificate_ids: certificates_to_use.map(&:id),
182
- device_ids: devices_to_use.map(&:id),
183
- template_name: Sigh.config[:template_name]
186
+ device_ids: devices_to_use.map(&:id)
184
187
  )
185
188
 
186
189
  profile
@@ -84,7 +84,7 @@ module Spaceship
84
84
  return resps.flat_map(&:to_models)
85
85
  end
86
86
 
87
- def self.create(client: nil, name: nil, profile_type: nil, bundle_id_id: nil, certificate_ids: nil, device_ids: nil, template_name: nil)
87
+ def self.create(client: nil, name: nil, profile_type: nil, bundle_id_id: nil, certificate_ids: nil, device_ids: nil)
88
88
  client ||= Spaceship::ConnectAPI
89
89
  resp = client.post_profiles(
90
90
  bundle_id_id: bundle_id_id,
@@ -92,8 +92,7 @@ module Spaceship
92
92
  devices: device_ids,
93
93
  attributes: {
94
94
  name: name,
95
- profileType: profile_type,
96
- templateName: template_name
95
+ profileType: profile_type
97
96
  }
98
97
  )
99
98
  return resp.to_models.first
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.227.1
4
+ version: 2.228.0
5
5
  platform: ruby
6
6
  authors:
7
- - Danielle Tomlinson
8
- - Łukasz Grabowski
9
7
  - Maksym Grebenets
8
+ - Jérôme Lacoste
10
9
  - Jorge Revuelta H
11
- - Manish Rathi
12
- - Roger Oba
10
+ - Andrew McBurney
13
11
  - Fumiya Nakamura
12
+ - Satoshi Namai
13
+ - Jan Piotrowski
14
14
  - Kohki Miki
15
15
  - Luka Mirosevic
16
- - Satoshi Namai
17
- - Max Ott
18
- - Daniel Jankowski
19
- - Josh Holtz
20
- - Olivier Halligon
21
- - Jérôme Lacoste
22
16
  - Joshua Liebowitz
23
- - Stefan Natchev
17
+ - Josh Holtz
18
+ - Daniel Jankowski
19
+ - Felix Krause
20
+ - Danielle Tomlinson
24
21
  - Aaron Brager
22
+ - Jimmy Dee
25
23
  - Helmut Januschka
26
- - Felix Krause
24
+ - Manish Rathi
25
+ - Manu Wallner
26
+ - Łukasz Grabowski
27
+ - Olivier Halligon
28
+ - Stefan Natchev
29
+ - Max Ott
27
30
  - Iulian Onofrei
28
31
  - Matthew Ellis
29
- - Jimmy Dee
30
- - Manu Wallner
31
- - Jan Piotrowski
32
- - Andrew McBurney
32
+ - Roger Oba
33
33
  autorequire:
34
34
  bindir: bin
35
35
  cert_chain: []
36
- date: 2025-04-09 00:00:00.000000000 Z
36
+ date: 2025-06-10 00:00:00.000000000 Z
37
37
  dependencies:
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: addressable
@@ -928,7 +928,6 @@ files:
928
928
  - fastlane/lib/fastlane/actions/hg_commit_version_bump.rb
929
929
  - fastlane/lib/fastlane/actions/hg_ensure_clean_status.rb
930
930
  - fastlane/lib/fastlane/actions/hg_push.rb
931
- - fastlane/lib/fastlane/actions/hipchat.rb
932
931
  - fastlane/lib/fastlane/actions/hockey.rb
933
932
  - fastlane/lib/fastlane/actions/ifttt.rb
934
933
  - fastlane/lib/fastlane/actions/import.rb