fastlane 2.173.0 → 2.178.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +82 -82
  3. data/cert/lib/cert/options.rb +2 -2
  4. data/cert/lib/cert/runner.rb +1 -1
  5. data/deliver/lib/deliver/app_screenshot.rb +6 -2
  6. data/deliver/lib/deliver/options.rb +2 -2
  7. data/deliver/lib/deliver/runner.rb +8 -4
  8. data/deliver/lib/deliver/upload_metadata.rb +3 -3
  9. data/deliver/lib/deliver/upload_screenshots.rb +12 -11
  10. data/fastlane/lib/fastlane/actions/adb.rb +1 -1
  11. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +3 -3
  12. data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +6 -2
  13. data/fastlane/lib/fastlane/actions/appaloosa.rb +7 -2
  14. data/fastlane/lib/fastlane/actions/appetize.rb +13 -1
  15. data/fastlane/lib/fastlane/actions/backup_file.rb +1 -1
  16. data/fastlane/lib/fastlane/actions/build_and_upload_to_appetize.rb +10 -2
  17. data/fastlane/lib/fastlane/actions/carthage.rb +22 -0
  18. data/fastlane/lib/fastlane/actions/cocoapods.rb +15 -1
  19. data/fastlane/lib/fastlane/actions/commit_github_file.rb +11 -1
  20. data/fastlane/lib/fastlane/actions/create_xcframework.rb +5 -0
  21. data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +1 -1
  22. data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +1 -1
  23. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +8 -2
  24. data/fastlane/lib/fastlane/actions/download_dsyms.rb +5 -15
  25. data/fastlane/lib/fastlane/actions/get_github_release.rb +11 -1
  26. data/fastlane/lib/fastlane/actions/git_commit.rb +1 -1
  27. data/fastlane/lib/fastlane/actions/github_api.rb +2 -1
  28. data/fastlane/lib/fastlane/actions/increment_build_number.rb +8 -1
  29. data/fastlane/lib/fastlane/actions/jazzy.rb +10 -1
  30. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +2 -2
  31. data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +1 -2
  32. data/fastlane/lib/fastlane/actions/register_device.rb +3 -3
  33. data/fastlane/lib/fastlane/actions/register_devices.rb +3 -3
  34. data/fastlane/lib/fastlane/actions/restore_file.rb +1 -1
  35. data/fastlane/lib/fastlane/actions/set_changelog.rb +3 -3
  36. data/fastlane/lib/fastlane/actions/swiftlint.rb +1 -1
  37. data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +1 -1
  38. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +4 -5
  39. data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +5 -1
  40. data/fastlane/lib/fastlane/documentation/actions_list.rb +2 -2
  41. data/fastlane/lib/fastlane/erb_template_helper.rb +7 -1
  42. data/fastlane/lib/fastlane/fast_file.rb +9 -5
  43. data/fastlane/lib/fastlane/helper/adb_helper.rb +1 -1
  44. data/fastlane/lib/fastlane/helper/gem_helper.rb +2 -2
  45. data/fastlane/lib/fastlane/version.rb +1 -1
  46. data/fastlane/swift/Actions.swift +1 -1
  47. data/fastlane/swift/Appfile.swift +1 -1
  48. data/fastlane/swift/ArgumentProcessor.swift +1 -1
  49. data/fastlane/swift/ControlCommand.swift +1 -1
  50. data/fastlane/swift/Deliverfile.swift +1 -1
  51. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  52. data/fastlane/swift/Fastlane.swift +71 -27
  53. data/fastlane/swift/Gymfile.swift +1 -1
  54. data/fastlane/swift/GymfileProtocol.swift +1 -1
  55. data/fastlane/swift/LaneFileProtocol.swift +1 -1
  56. data/fastlane/swift/MainProcess.swift +1 -1
  57. data/fastlane/swift/Matchfile.swift +1 -1
  58. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  59. data/fastlane/swift/Plugins.swift +1 -1
  60. data/fastlane/swift/Precheckfile.swift +1 -1
  61. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  62. data/fastlane/swift/RubyCommand.swift +1 -1
  63. data/fastlane/swift/RubyCommandable.swift +1 -1
  64. data/fastlane/swift/Runner.swift +2 -2
  65. data/fastlane/swift/RunnerArgument.swift +1 -1
  66. data/fastlane/swift/Scanfile.swift +1 -1
  67. data/fastlane/swift/ScanfileProtocol.swift +9 -1
  68. data/fastlane/swift/Screengrabfile.swift +1 -1
  69. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  70. data/fastlane/swift/Snapshotfile.swift +1 -1
  71. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  72. data/fastlane/swift/SocketClient.swift +1 -1
  73. data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
  74. data/fastlane/swift/SocketResponse.swift +1 -1
  75. data/fastlane/swift/formatting/Brewfile.lock.json +20 -14
  76. data/fastlane/swift/main.swift +1 -1
  77. data/fastlane_core/lib/fastlane_core.rb +1 -0
  78. data/fastlane_core/lib/fastlane_core/command_executor.rb +3 -9
  79. data/fastlane_core/lib/fastlane_core/configuration/commander_generator.rb +1 -1
  80. data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +23 -0
  81. data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +9 -5
  82. data/fastlane_core/lib/fastlane_core/helper.rb +26 -5
  83. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +3 -2
  84. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +14 -8
  85. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +1 -1
  86. data/fastlane_core/lib/fastlane_core/pkg_upload_package_builder.rb +3 -2
  87. data/fastlane_core/lib/fastlane_core/project.rb +23 -20
  88. data/{deliver/lib/deliver → fastlane_core/lib/fastlane_core}/queue_worker.rb +2 -2
  89. data/fastlane_core/lib/fastlane_core/ui/interface.rb +1 -1
  90. data/fastlane_core/lib/fastlane_core/update_checker/update_checker.rb +2 -2
  91. data/gym/lib/gym/.runner.rb.swp +0 -0
  92. data/gym/lib/gym/generators/.package_command_generator_xcode7.rb.swp +0 -0
  93. data/match/lib/match/importer.rb +1 -1
  94. data/match/lib/match/migrate.rb +1 -1
  95. data/match/lib/match/nuke.rb +6 -1
  96. data/match/lib/match/options.rb +2 -2
  97. data/match/lib/match/runner.rb +1 -1
  98. data/match/lib/match/storage/google_cloud_storage.rb +1 -1
  99. data/match/lib/match/storage/s3_storage.rb +1 -1
  100. data/pilot/lib/pilot/build_manager.rb +25 -8
  101. data/pilot/lib/pilot/manager.rb +1 -1
  102. data/pilot/lib/pilot/options.rb +5 -5
  103. data/precheck/lib/precheck/options.rb +2 -2
  104. data/precheck/lib/precheck/runner.rb +2 -2
  105. data/scan/lib/scan/detect_values.rb +4 -1
  106. data/scan/lib/scan/options.rb +10 -0
  107. data/scan/lib/scan/runner.rb +27 -0
  108. data/screengrab/lib/screengrab/android_environment.rb +2 -2
  109. data/screengrab/lib/screengrab/runner.rb +1 -2
  110. data/sigh/lib/sigh/download_all.rb +1 -1
  111. data/sigh/lib/sigh/options.rb +2 -2
  112. data/sigh/lib/sigh/runner.rb +1 -1
  113. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +2 -1
  114. data/spaceship/README.md +2 -2
  115. data/spaceship/lib/spaceship/client.rb +18 -17
  116. data/spaceship/lib/spaceship/connect_api/api_client.rb +40 -7
  117. data/spaceship/lib/spaceship/connect_api/models/app.rb +1 -1
  118. data/spaceship/lib/spaceship/connect_api/models/app_preview_set.rb +5 -0
  119. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +5 -0
  120. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +6 -0
  121. data/spaceship/lib/spaceship/connect_api/models/beta_group.rb +5 -0
  122. data/spaceship/lib/spaceship/connect_api/models/build.rb +5 -0
  123. data/spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb +4 -0
  124. data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +24 -0
  125. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +26 -4
  126. data/spaceship/lib/spaceship/connect_api/models/user_invitation.rb +13 -0
  127. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +53 -0
  128. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +13 -0
  129. data/spaceship/lib/spaceship/connect_api/token.rb +2 -2
  130. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +15 -0
  131. data/spaceship/lib/spaceship/playground.rb +2 -2
  132. data/spaceship/lib/spaceship/tunes/tunes_client.rb +2 -2
  133. data/spaceship/lib/spaceship/two_step_or_factor_client.rb +42 -29
  134. metadata +38 -22
@@ -1,4 +1,5 @@
1
1
  require "digest/md5"
2
+ require 'securerandom'
2
3
 
3
4
  require_relative 'globals'
4
5
  require_relative 'ui/ui'
@@ -12,7 +13,7 @@ module FastlaneCore
12
13
  attr_accessor :package_path
13
14
 
14
15
  def generate(app_id: nil, ipa_path: nil, package_path: nil, platform: nil)
15
- self.package_path = File.join(package_path, "#{app_id}.itmsp")
16
+ self.package_path = File.join(package_path, "#{app_id}-#{SecureRandom.uuid}.itmsp")
16
17
  FileUtils.rm_rf(self.package_path) if File.directory?(self.package_path)
17
18
  FileUtils.mkdir_p(self.package_path)
18
19
 
@@ -32,7 +33,7 @@ module FastlaneCore
32
33
  File.write(File.join(self.package_path, METADATA_FILE_NAME), xml)
33
34
  UI.success("Wrote XML data to '#{self.package_path}'") if FastlaneCore::Globals.verbose?
34
35
 
35
- return package_path
36
+ return self.package_path
36
37
  end
37
38
 
38
39
  def unique_ipa_path(ipa_path)
@@ -94,6 +94,10 @@ module FastlaneCore
94
94
  return exit_status.zero?
95
95
  end
96
96
 
97
+ def displayable_errors
98
+ @errors.map { |error| "[Transporter Error Output]: #{error}" }.join("\n").gsub!(/"/, "")
99
+ end
100
+
97
101
  private
98
102
 
99
103
  def parse_line(line, hide_output)
@@ -107,7 +111,6 @@ module FastlaneCore
107
111
 
108
112
  elsif line =~ ERROR_REGEX
109
113
  @errors << $1
110
- UI.error("[Transporter Error Output]: #{$1}")
111
114
 
112
115
  # Check if it's a login error
113
116
  if $1.include?("Your Apple ID or password was entered incorrectly") ||
@@ -117,9 +120,6 @@ module FastlaneCore
117
120
  CredentialsManager::AccountManager.new(user: @user).invalid_credentials
118
121
  UI.error("Please run this tool again to apply the new password")
119
122
  end
120
- elsif $1.include?("Redundant Binary Upload. There already exists a binary upload with build")
121
- UI.error($1)
122
- UI.error("You have to change the build number of your app to upload your ipa file")
123
123
  end
124
124
 
125
125
  output_done = true
@@ -471,11 +471,13 @@ module FastlaneCore
471
471
  # Uploads the modified package back to App Store Connect
472
472
  # @param app_id [Integer] The unique App ID
473
473
  # @param dir [String] the path in which the package file is located
474
+ # @param package_path [String] the path to the package file (used instead of app_id and dir)
474
475
  # @return (Bool) True if everything worked fine
475
476
  # @raise [Deliver::TransporterTransferError] when something went wrong
476
477
  # when transferring
477
- def upload(app_id, dir)
478
- actual_dir = File.join(dir, "#{app_id}.itmsp")
478
+ def upload(app_id = nil, dir = nil, package_path: nil)
479
+ raise "app_id and dir are required or package_path is required" if (app_id.nil? || dir.nil?) && package_path.nil?
480
+ actual_dir = package_path || File.join(dir, "#{app_id}.itmsp")
479
481
 
480
482
  UI.message("Going to upload updated app to App Store Connect")
481
483
  UI.success("This might take a few minutes. Please don't interrupt the script.")
@@ -490,7 +492,7 @@ module FastlaneCore
490
492
  result = @transporter_executor.execute(command, ItunesTransporter.hide_transporter_output?)
491
493
  rescue TransporterRequiresApplicationSpecificPasswordError => ex
492
494
  handle_two_step_failure(ex)
493
- return upload(app_id, dir)
495
+ return upload(app_id, dir, package_path: package_path)
494
496
  end
495
497
 
496
498
  if result
@@ -501,7 +503,11 @@ module FastlaneCore
501
503
  handle_error(@password)
502
504
  end
503
505
 
504
- result
506
+ return result
507
+ end
508
+
509
+ def displayable_errors
510
+ @transporter_executor.displayable_errors
505
511
  end
506
512
 
507
513
  def provider_ids
@@ -99,7 +99,7 @@ module FastlaneCore
99
99
  UI.important("Enter the password for #{keychain_path}")
100
100
  UI.important("This passphrase will be stored in your local keychain with the name #{server} and used in future runs")
101
101
  UI.important("This prompt can be avoided by specifying the 'keychain_password' option or 'MATCH_KEYCHAIN_PASSWORD' environment variable")
102
- keychain_password = FastlaneCore::Helper.ask_password(message: "Password for #{keychain_name} keychain: ", confirm: true)
102
+ keychain_password = FastlaneCore::Helper.ask_password(message: "Password for #{keychain_name} keychain: ", confirm: true, confirmation_message: "Type password for #{keychain_name} keychain again: ")
103
103
  Security::InternetPassword.add(server, "", keychain_password)
104
104
  else
105
105
  UI.important("Keychain password for #{keychain_path} was not specified and not found in your keychain. Specify the 'keychain_password' option to prevent the UI permission popup when code signing")
@@ -1,4 +1,5 @@
1
1
  require 'digest/md5'
2
+ require 'securerandom'
2
3
 
3
4
  require_relative 'globals'
4
5
  require_relative 'ui/ui'
@@ -12,7 +13,7 @@ module FastlaneCore
12
13
  attr_accessor :package_path
13
14
 
14
15
  def generate(app_id: nil, pkg_path: nil, package_path: nil, platform: "osx")
15
- self.package_path = File.join(package_path, "#{app_id}.itmsp")
16
+ self.package_path = File.join(package_path, "#{app_id}-#{SecureRandom.uuid}.itmsp")
16
17
  FileUtils.rm_rf(self.package_path) if File.directory?(self.package_path)
17
18
  FileUtils.mkdir_p(self.package_path)
18
19
 
@@ -32,7 +33,7 @@ module FastlaneCore
32
33
  File.write(File.join(self.package_path, METADATA_FILE_NAME), xml)
33
34
  UI.success("Wrote XML data to '#{self.package_path}'") if FastlaneCore::Globals.verbose?
34
35
 
35
- package_path
36
+ return self.package_path
36
37
  end
37
38
 
38
39
  private
@@ -1,5 +1,6 @@
1
1
  require_relative 'helper'
2
2
  require 'xcodeproj'
3
+ require_relative './configuration/configuration'
3
4
  require 'fastlane_core/command_executor'
4
5
 
5
6
  module FastlaneCore
@@ -67,28 +68,32 @@ module FastlaneCore
67
68
  # Is this project a workspace?
68
69
  attr_accessor :is_workspace
69
70
 
70
- # The config object containing the scheme, configuration, etc.
71
- attr_accessor :options
72
-
73
- # Should the output of xcodebuild commands be silenced?
74
- attr_accessor :xcodebuild_list_silent
75
-
76
- # Should we redirect stderr to /dev/null for xcodebuild commands?
77
- # Gets rid of annoying plugin info warnings.
78
- attr_accessor :xcodebuild_suppress_stderr
79
-
80
- def initialize(options, xcodebuild_list_silent: false, xcodebuild_suppress_stderr: false)
81
- self.options = options
82
- self.path = File.expand_path(options[:workspace] || options[:project])
83
- self.is_workspace = (options[:workspace].to_s.length > 0)
84
- self.xcodebuild_list_silent = xcodebuild_list_silent
85
- self.xcodebuild_suppress_stderr = xcodebuild_suppress_stderr
71
+ # @param options [FastlaneCore::Configuration|Hash] a set of configuration to run xcodebuild to work out build settings
72
+ # @param xcodebuild_list_silent [Boolean] a flag to silent xcodebuild command's output
73
+ # @param xcodebuild_suppress_stderr [Boolean] a flag to supress output to stderr from xcodebuild
74
+ def initialize(options)
75
+ @options = options
76
+ @path = File.expand_path(self.options[:workspace] || self.options[:project])
77
+ @is_workspace = (self.options[:workspace].to_s.length > 0)
86
78
 
87
79
  if !path || !File.directory?(path)
88
80
  UI.user_error!("Could not find project at path '#{path}'")
89
81
  end
90
82
  end
91
83
 
84
+ # @return [Hash] a hash object containing project, workspace, scheme, any configuration related to xcodebuild, or etc...
85
+ def options
86
+ # To keep compatibility with actions using this class from outside of `fastlane` gem; i.e. `xcov`,
87
+ # converts `options` to a plain Hash. Otherwise, it might crash when a new option's key is added
88
+ # due to `FastlaneCore::Configuration` to validate valid keys defined.
89
+ @options.kind_of?(FastlaneCore::Configuration) ? @options.values : @options
90
+ end
91
+
92
+ def options=(new_value)
93
+ UI.deprecated('Update `options` is not worth doing since it can change behavior of this object entirely. Consider re-creating FastlaneCore::Project.')
94
+ @options = new_value
95
+ end
96
+
92
97
  def workspace?
93
98
  self.is_workspace
94
99
  end
@@ -351,14 +356,12 @@ module FastlaneCore
351
356
  else
352
357
  command = "xcodebuild clean -showBuildSettings #{xcodebuild_parameters.join(' ')}"
353
358
  end
354
- command += " 2> /dev/null" if xcodebuild_suppress_stderr
355
359
  command
356
360
  end
357
361
 
358
362
  def build_xcodebuild_resolvepackagedependencies_command
359
363
  return nil if options[:skip_package_dependencies_resolution]
360
364
  command = "xcodebuild -resolvePackageDependencies #{xcodebuild_parameters.join(' ')}"
361
- command += " 2> /dev/null" if xcodebuild_suppress_stderr
362
365
  command
363
366
  end
364
367
 
@@ -381,7 +384,7 @@ module FastlaneCore
381
384
  FastlaneCore::CommandExecutor.execute(
382
385
  command: command,
383
386
  print_all: true,
384
- print_command: !self.xcodebuild_list_silent
387
+ print_command: true
385
388
  )
386
389
  else
387
390
  UI.important("Skipped Swift Package Manager dependencies resolution.")
@@ -394,7 +397,7 @@ module FastlaneCore
394
397
  begin
395
398
  timeout = FastlaneCore::Project.xcode_build_settings_timeout
396
399
  retries = FastlaneCore::Project.xcode_build_settings_retries
397
- @build_settings = FastlaneCore::Project.run_command(command, timeout: timeout, retries: retries, print: !self.xcodebuild_list_silent)
400
+ @build_settings = FastlaneCore::Project.run_command(command, timeout: timeout, retries: retries, print: true)
398
401
  if @build_settings.empty?
399
402
  UI.error("Could not read build settings. Make sure that the scheme \"#{options[:scheme]}\" is configured for running by going to Product → Scheme → Edit Scheme…, selecting the \"Build\" section, checking the \"Run\" checkbox and closing the scheme window.")
400
403
  end
@@ -1,12 +1,12 @@
1
1
  require 'thread'
2
2
 
3
- module Deliver
3
+ module FastlaneCore
4
4
  # This dispatches jobs to worker threads and make it work in parallel.
5
5
  # It's suitable for I/O bounds works and not for CPU bounds works.
6
6
  # Use this when you have all the items that you'll process in advance.
7
7
  # Simply enqueue them to this and call `QueueWorker#start`.
8
8
  class QueueWorker
9
- NUMBER_OF_THREADS = Helper.test? ? 1 : [ENV.fetch("DELIVER_NUMBER_OF_THREADS", 10).to_i, 10].min
9
+ NUMBER_OF_THREADS = FastlaneCore::Helper.test? ? 1 : [(ENV["DELIVER_NUMBER_OF_THREADS"] || ENV.fetch("FL_NUMBER_OF_THREADS", 10)).to_i, 10].min
10
10
 
11
11
  # @param concurrency (Numeric) - A number of threads to be created
12
12
  # @param block (Proc) - A task you want to execute with enqueued items
@@ -138,7 +138,7 @@ module FastlaneCore
138
138
  # Basically this should be used when you actively catch the error
139
139
  # and want to show a nice error message to the user
140
140
  def user_error!(error_message, options = {})
141
- raise FastlaneError.new(options), error_message.to_s
141
+ raise FastlaneError.new(show_github_issues: options[:show_github_issues], error_info: options[:error_info]), error_message.to_s
142
142
  end
143
143
 
144
144
  # Use this method to exit the program because of a shell command
@@ -63,7 +63,7 @@ module FastlaneCore
63
63
  if !Helper.bundler? && !Helper.contained_fastlane? && Random.rand(5) == 1
64
64
  # We want to show this message from time to time, if the user doesn't use bundler, nor bundled fastlane
65
65
  puts('#######################################################################')
66
- puts("# Run `sudo gem cleanup` from time to time to speed up fastlane")
66
+ puts("# Run `gem cleanup` from time to time to speed up fastlane")
67
67
  end
68
68
  puts('#######################################################################')
69
69
  Changelog.show_changes(gem_name, current_version, update_gem_command: UpdateChecker.update_command(gem_name: gem_name)) unless FastlaneCore::Env.truthy?("FASTLANE_HIDE_CHANGELOG")
@@ -80,7 +80,7 @@ module FastlaneCore
80
80
  elsif Helper.mac_app?
81
81
  "the Fabric app. Launch the app and navigate to the fastlane tab to get the most recent version."
82
82
  else
83
- "sudo gem install #{gem_name.downcase}"
83
+ "gem install #{gem_name.downcase}"
84
84
  end
85
85
  end
86
86
 
Binary file
@@ -149,7 +149,7 @@ module Match
149
149
  end
150
150
 
151
151
  def api_token(params)
152
- @api_token ||= Spaceship::ConnectAPI::Token.create(params[:api_key]) if params[:api_key]
152
+ @api_token ||= Spaceship::ConnectAPI::Token.create(**params[:api_key]) if params[:api_key]
153
153
  @api_token ||= Spaceship::ConnectAPI::Token.from_json_file(params[:api_key_path]) if params[:api_key_path]
154
154
  return @api_token
155
155
  end
@@ -91,7 +91,7 @@ module Match
91
91
  end
92
92
 
93
93
  def api_token(params)
94
- @api_token ||= Spaceship::ConnectAPI::Token.create(params[:api_key]) if params[:api_key]
94
+ @api_token ||= Spaceship::ConnectAPI::Token.create(**params[:api_key]) if params[:api_key]
95
95
  @api_token ||= Spaceship::ConnectAPI::Token.from_json_file(params[:api_key_path]) if params[:api_key_path]
96
96
  return @api_token
97
97
  end
@@ -36,6 +36,11 @@ module Match
36
36
  git_branch: params[:git_branch],
37
37
  git_full_name: params[:git_full_name],
38
38
  git_user_email: params[:git_user_email],
39
+
40
+ git_private_key: params[:git_private_key],
41
+ git_basic_authorization: params[:git_basic_authorization],
42
+ git_bearer_authorization: params[:git_bearer_authorization],
43
+
39
44
  clone_branch_directly: params[:clone_branch_directly],
40
45
  google_cloud_bucket_name: params[:google_cloud_bucket_name].to_s,
41
46
  google_cloud_keys_file: params[:google_cloud_keys_file].to_s,
@@ -116,7 +121,7 @@ module Match
116
121
  end
117
122
 
118
123
  def api_token
119
- @api_token ||= Spaceship::ConnectAPI::Token.create(params[:api_key]) if params[:api_key]
124
+ @api_token ||= Spaceship::ConnectAPI::Token.create(**params[:api_key]) if params[:api_key]
120
125
  @api_token ||= Spaceship::ConnectAPI::Token.from_json_file(params[:api_key_path]) if params[:api_key_path]
121
126
  return @api_token
122
127
  end
@@ -74,7 +74,7 @@ module Match
74
74
 
75
75
  # App Store Connect API
76
76
  FastlaneCore::ConfigItem.new(key: :api_key_path,
77
- env_name: "SIGH_API_KEY_PATH",
77
+ env_names: ["SIGH_API_KEY_PATH", "APP_STORE_CONNECT_API_KEY_PATH"],
78
78
  description: "Path to your App Store Connect API Key JSON file (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-json-file)",
79
79
  optional: true,
80
80
  conflicting_options: [:api_key],
@@ -82,7 +82,7 @@ module Match
82
82
  UI.user_error!("Couldn't find API key JSON file at path '#{value}'") unless File.exist?(value)
83
83
  end),
84
84
  FastlaneCore::ConfigItem.new(key: :api_key,
85
- env_name: "SIGH_API_KEY",
85
+ env_names: ["SIGH_API_KEY", "APP_STORE_CONNECT_API_KEY"],
86
86
  description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)",
87
87
  type: Hash,
88
88
  optional: true,
@@ -139,7 +139,7 @@ module Match
139
139
  # rubocop:enable Metrics/PerceivedComplexity
140
140
 
141
141
  def api_token(params)
142
- @api_token ||= Spaceship::ConnectAPI::Token.create(params[:api_key]) if params[:api_key]
142
+ @api_token ||= Spaceship::ConnectAPI::Token.create(**params[:api_key]) if params[:api_key]
143
143
  @api_token ||= Spaceship::ConnectAPI::Token.from_json_file(params[:api_key_path]) if params[:api_key_path]
144
144
  return @api_token
145
145
  end
@@ -123,7 +123,7 @@ module Match
123
123
  end
124
124
 
125
125
  def api_token
126
- api_token ||= Spaceship::ConnectAPI::Token.create(self.api_key) if self.api_key
126
+ api_token ||= Spaceship::ConnectAPI::Token.create(**self.api_key) if self.api_key
127
127
  api_token ||= Spaceship::ConnectAPI::Token.from_json_file(self.api_key_path) if self.api_key_path
128
128
  return api_token
129
129
  end
@@ -196,7 +196,7 @@ module Match
196
196
  end
197
197
 
198
198
  def api_token
199
- api_token ||= Spaceship::ConnectAPI::Token.create(self.api_key) if self.api_key
199
+ api_token ||= Spaceship::ConnectAPI::Token.create(**self.api_key) if self.api_key
200
200
  api_token ||= Spaceship::ConnectAPI::Token.from_json_file(self.api_key_path) if self.api_key_path
201
201
  return api_token
202
202
  end
@@ -31,10 +31,11 @@ module Pilot
31
31
  platform: platform)
32
32
 
33
33
  transporter = transporter_for_selected_team(options)
34
- result = transporter.upload(fetch_app_id, package_path)
34
+ result = transporter.upload(package_path: package_path)
35
35
 
36
36
  unless result
37
- UI.user_error!("Error uploading ipa file, for more information see above")
37
+ transporter_errors = transporter.displayable_errors
38
+ UI.user_error!("Error uploading ipa file: \n #{transporter_errors}")
38
39
  end
39
40
 
40
41
  UI.success("Successfully uploaded the new binary to App Store Connect")
@@ -90,8 +91,13 @@ module Pilot
90
91
 
91
92
  def wait_for_build_processing_to_be_complete(return_when_build_appears = false)
92
93
  platform = fetch_app_platform
93
- app_version = FastlaneCore::IpaFileAnalyser.fetch_app_version(config[:ipa])
94
- app_build = FastlaneCore::IpaFileAnalyser.fetch_app_build(config[:ipa])
94
+ if config[:ipa]
95
+ app_version = FastlaneCore::IpaFileAnalyser.fetch_app_version(config[:ipa])
96
+ app_build = FastlaneCore::IpaFileAnalyser.fetch_app_build(config[:ipa])
97
+ else
98
+ app_version = config[:app_version]
99
+ app_build = config[:build_number]
100
+ end
95
101
 
96
102
  latest_build = FastlaneCore::BuildWatcher.wait_for_build_processing_to_be_complete(
97
103
  app_id: app.id,
@@ -248,9 +254,13 @@ module Pilot
248
254
  end
249
255
  end
250
256
 
251
- update_build_beta_details(build, {
252
- auto_notify_enabled: options[:notify_external_testers]
253
- })
257
+ if options[:notify_external_testers].nil?
258
+ UI.important("Using App Store Connect's default for notifying external testers (which is true) - set `notify_external_testers` for full control")
259
+ else
260
+ update_build_beta_details(build, {
261
+ auto_notify_enabled: options[:notify_external_testers]
262
+ })
263
+ end
254
264
  end
255
265
 
256
266
  def self.truncate_changelog(changelog)
@@ -423,7 +433,14 @@ module Pilot
423
433
 
424
434
  UI.important("Export compliance has been set to '#{uses_non_exempt_encryption}'. Need to wait for build to finishing processing again...")
425
435
  UI.important("Set 'ITSAppUsesNonExemptEncryption' in the 'Info.plist' to skip this step and speed up the submission")
426
- return wait_for_build_processing_to_be_complete
436
+
437
+ loop do
438
+ build = Spaceship::ConnectAPI::Build.get(build_id: uploaded_build.id)
439
+ return build unless build.missing_export_compliance?
440
+
441
+ UI.message("Waiting for build #{uploaded_build.id} to process export compliance")
442
+ sleep(5)
443
+ end
427
444
  else
428
445
  return uploaded_build
429
446
  end
@@ -30,7 +30,7 @@ module Pilot
30
30
  end
31
31
 
32
32
  def api_token
33
- @api_token ||= Spaceship::ConnectAPI::Token.create(config[:api_key]) if config[:api_key]
33
+ @api_token ||= Spaceship::ConnectAPI::Token.create(**config[:api_key]) if config[:api_key]
34
34
  @api_token ||= Spaceship::ConnectAPI::Token.from_json_file(config[:api_key_path]) if config[:api_key_path]
35
35
  return @api_token
36
36
  end
@@ -11,7 +11,7 @@ module Pilot
11
11
 
12
12
  [
13
13
  FastlaneCore::ConfigItem.new(key: :api_key_path,
14
- env_name: "PILOT_API_KEY_PATH",
14
+ env_names: ["PILOT_API_KEY_PATH", "APP_STORE_CONNECT_API_KEY_PATH"],
15
15
  description: "Path to your App Store Connect API Key JSON file (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-json-file)",
16
16
  optional: true,
17
17
  conflicting_options: [:username],
@@ -19,7 +19,7 @@ module Pilot
19
19
  UI.user_error!("Couldn't find API key JSON file at path '#{value}'") unless File.exist?(value)
20
20
  end),
21
21
  FastlaneCore::ConfigItem.new(key: :api_key,
22
- env_name: "PILOT_API_KEY",
22
+ env_names: ["PILOT_API_KEY", "APP_STORE_CONNECT_API_KEY"],
23
23
  description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)",
24
24
  type: Hash,
25
25
  optional: true,
@@ -88,7 +88,7 @@ module Pilot
88
88
  type: Boolean,
89
89
  env_name: "DEMO_ACCOUNT_REQUIRED",
90
90
  description: "Do you need a demo account when Apple does review?",
91
- default_value: false),
91
+ optional: true),
92
92
  FastlaneCore::ConfigItem.new(key: :beta_app_review_info,
93
93
  type: Hash,
94
94
  env_name: "PILOT_BETA_APP_REVIEW_INFO",
@@ -182,8 +182,8 @@ module Pilot
182
182
  FastlaneCore::ConfigItem.new(key: :notify_external_testers,
183
183
  is_string: false,
184
184
  env_name: "PILOT_NOTIFY_EXTERNAL_TESTERS",
185
- description: "Should notify external testers?",
186
- default_value: true),
185
+ description: "Should notify external testers? (Not setting a value will use App Store Connect's default which is to notify)",
186
+ optional: true),
187
187
  FastlaneCore::ConfigItem.new(key: :app_version,
188
188
  env_name: "PILOT_APP_VERSION",
189
189
  description: "The version number of the application build to distribute. If the version number is not specified, then the most recent build uploaded to TestFlight will be distributed. If specified, the most recent build for the version number will be distributed",