fastlane 2.224.0 → 2.232.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.
- checksums.yaml +4 -4
- data/README.md +98 -92
- data/bin/fastlane +2 -2
- data/cert/lib/cert/options.rb +7 -2
- data/cert/lib/cert/runner.rb +23 -11
- data/deliver/lib/assets/summary.html.erb +3 -3
- data/deliver/lib/deliver/app_screenshot.rb +215 -347
- data/deliver/lib/deliver/app_screenshot_iterator.rb +4 -1
- data/deliver/lib/deliver/app_screenshot_validator.rb +5 -21
- data/deliver/lib/deliver/loader.rb +2 -9
- data/deliver/lib/deliver/options.rb +1 -1
- data/deliver/lib/deliver/runner.rb +1 -1
- data/deliver/lib/deliver/upload_metadata.rb +5 -0
- data/deliver/lib/deliver/upload_screenshots.rb +4 -2
- data/fastlane/lib/assets/completions/completion.bash +1 -1
- data/fastlane/lib/assets/completions/completion.sh +2 -2
- data/fastlane/lib/fastlane/actions/app_store_build_number.rb +16 -15
- data/fastlane/lib/fastlane/actions/appium.rb +1 -1
- data/fastlane/lib/fastlane/actions/docs/create_app_online.md +6 -3
- data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +12 -8
- data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +56 -17
- data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +13 -1
- data/fastlane/lib/fastlane/actions/get_version_number.rb +1 -1
- data/fastlane/lib/fastlane/actions/import_certificate.rb +9 -1
- data/fastlane/lib/fastlane/actions/import_from_git.rb +11 -4
- data/fastlane/lib/fastlane/actions/increment_build_number.rb +1 -1
- data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +3 -2
- data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +2 -2
- data/fastlane/lib/fastlane/actions/modify_services.rb +1 -0
- data/fastlane/lib/fastlane/actions/notarize.rb +4 -0
- data/fastlane/lib/fastlane/actions/onesignal.rb +1 -1
- data/fastlane/lib/fastlane/actions/register_device.rb +1 -1
- data/fastlane/lib/fastlane/actions/register_devices.rb +1 -1
- data/fastlane/lib/fastlane/actions/setup_ci.rb +14 -4
- data/fastlane/lib/fastlane/actions/testfairy.rb +41 -4
- data/fastlane/lib/fastlane/actions/unlock_keychain.rb +6 -1
- data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +1 -1
- data/fastlane/lib/fastlane/actions/xcov.rb +1 -7
- data/fastlane/lib/fastlane/cli_tools_distributor.rb +9 -0
- data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +4 -4
- data/fastlane/lib/fastlane/erb_template_helper.rb +1 -7
- data/fastlane/lib/fastlane/fast_file.rb +9 -6
- data/fastlane/lib/fastlane/helper/s3_client_helper.rb +4 -0
- data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
- data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +20 -20
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +1 -1
- data/fastlane/lib/fastlane/version.rb +2 -1
- data/fastlane/swift/Actions.swift +1 -1
- data/fastlane/swift/Appfile.swift +13 -5
- data/fastlane/swift/ArgumentProcessor.swift +1 -1
- data/fastlane/swift/Atomic.swift +1 -1
- data/fastlane/swift/ControlCommand.swift +5 -4
- data/fastlane/swift/Deliverfile.swift +2 -2
- data/fastlane/swift/DeliverfileProtocol.swift +265 -68
- data/fastlane/swift/Fastlane.swift +187 -168
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +3 -1
- data/fastlane/swift/Gymfile.swift +2 -2
- data/fastlane/swift/GymfileProtocol.swift +227 -54
- data/fastlane/swift/LaneFileProtocol.swift +7 -5
- data/fastlane/swift/MainProcess.swift +1 -1
- data/fastlane/swift/Matchfile.swift +2 -2
- data/fastlane/swift/MatchfileProtocol.swift +226 -59
- data/fastlane/swift/OptionalConfigValue.swift +1 -1
- data/fastlane/swift/Plugins.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +2 -2
- data/fastlane/swift/PrecheckfileProtocol.swift +45 -13
- data/fastlane/swift/RubyCommand.swift +6 -7
- data/fastlane/swift/RubyCommandable.swift +1 -1
- data/fastlane/swift/Runner.swift +3 -3
- data/fastlane/swift/RunnerArgument.swift +1 -1
- data/fastlane/swift/Scanfile.swift +2 -2
- data/fastlane/swift/ScanfileProtocol.swift +334 -84
- data/fastlane/swift/Screengrabfile.swift +2 -2
- data/fastlane/swift/ScreengrabfileProtocol.swift +89 -24
- data/fastlane/swift/Snapshotfile.swift +2 -2
- data/fastlane/swift/SnapshotfileProtocol.swift +216 -53
- data/fastlane/swift/SocketClient.swift +7 -7
- data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
- data/fastlane/swift/SocketResponse.swift +1 -1
- data/fastlane/swift/formatting/Brewfile.lock.json +15 -25
- data/fastlane/swift/formatting/Rakefile +1 -2
- data/fastlane/swift/main.swift +1 -1
- data/fastlane_core/lib/assets/XMLTemplate.xml.erb +5 -1
- data/fastlane_core/lib/fastlane_core/cert_checker.rb +10 -0
- data/fastlane_core/lib/fastlane_core/command_executor.rb +3 -1
- data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +5 -1
- data/fastlane_core/lib/fastlane_core/helper.rb +6 -1
- data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +4 -14
- data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +19 -2
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +143 -106
- data/fastlane_core/lib/fastlane_core/keychain_importer.rb +3 -1
- data/fastlane_core/lib/fastlane_core/project.rb +8 -0
- data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +7 -1
- data/frameit/lib/frameit/device.rb +2 -2
- data/frameit/lib/frameit/device_types.rb +108 -70
- data/frameit/lib/frameit/template_finder.rb +1 -1
- data/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh +1 -0
- data/gym/lib/gym/module.rb +9 -4
- data/gym/lib/gym/options.rb +20 -2
- data/gym/lib/gym/runner.rb +38 -3
- data/match/lib/assets/READMETemplate.md +2 -2
- data/match/lib/match/generator.rb +2 -2
- data/match/lib/match/options.rb +1 -0
- data/match/lib/match/runner.rb +1 -1
- data/match/lib/match/storage/s3_storage.rb +4 -7
- data/pilot/lib/pilot/build_manager.rb +7 -1
- data/precheck/lib/precheck/options.rb +1 -1
- data/produce/lib/produce/commands_generator.rb +2 -0
- data/produce/lib/produce/developer_center.rb +1 -0
- data/produce/lib/produce/options.rb +1 -1
- data/produce/lib/produce/service.rb +6 -1
- data/scan/lib/scan/error_handler.rb +5 -0
- data/scan/lib/scan/options.rb +13 -3
- data/scan/lib/scan/test_command_generator.rb +10 -2
- data/sigh/lib/assets/resign.sh +7 -5
- data/sigh/lib/sigh/local_manage.rb +6 -4
- data/sigh/lib/sigh/options.rb +1 -0
- data/sigh/lib/sigh/runner.rb +23 -3
- data/snapshot/lib/snapshot/detect_values.rb +1 -1
- data/snapshot/lib/snapshot/options.rb +13 -1
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +4 -2
- data/spaceship/lib/spaceship/client.rb +153 -22
- data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +65 -9
- data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +4 -4
- data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +7 -1
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +16 -16
- data/spaceship/lib/spaceship/connect_api/models/build_upload.rb +42 -0
- data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +2 -0
- data/spaceship/lib/spaceship/connect_api/models/certificate.rb +33 -2
- data/spaceship/lib/spaceship/connect_api/models/device.rb +1 -2
- data/spaceship/lib/spaceship/connect_api/models/profile.rb +2 -3
- data/spaceship/lib/spaceship/connect_api/models/webhook.rb +62 -0
- data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +0 -6
- data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +9 -0
- data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +38 -0
- data/spaceship/lib/spaceship/connect_api.rb +2 -0
- data/spaceship/lib/spaceship/errors.rb +23 -6
- data/spaceship/lib/spaceship/portal/key.rb +22 -3
- data/spaceship/lib/spaceship/portal/portal_client.rb +29 -2
- data/spaceship/lib/spaceship/spaceauth_runner.rb +5 -15
- data/supply/lib/supply/client.rb +18 -1
- data/supply/lib/supply/uploader.rb +22 -11
- data/trainer/lib/trainer/legacy_xcresult.rb +586 -0
- data/trainer/lib/trainer/options.rb +5 -0
- data/trainer/lib/trainer/plist_test_summary_parser.rb +84 -0
- data/trainer/lib/trainer/test_parser.rb +12 -293
- data/trainer/lib/trainer/xcresult/helper.rb +63 -0
- data/trainer/lib/trainer/xcresult/repetition.rb +39 -0
- data/trainer/lib/trainer/xcresult/test_case.rb +221 -0
- data/trainer/lib/trainer/xcresult/test_case_attributes.rb +49 -0
- data/trainer/lib/trainer/xcresult/test_plan.rb +91 -0
- data/trainer/lib/trainer/xcresult/test_suite.rb +134 -0
- data/trainer/lib/trainer/xcresult.rb +31 -388
- data/trainer/lib/trainer.rb +3 -1
- metadata +172 -33
- data/fastlane/lib/fastlane/actions/hipchat.rb +0 -200
- data/fastlane/lib/fastlane/core_ext/bundler_monkey_patch.rb +0 -14
- data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +0 -43
- 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
|
|
12
|
+
attr_reader :type, :path, :debug_info
|
|
15
13
|
|
|
16
|
-
def initialize(type: nil, path: nil, debug_info: nil
|
|
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
|
-
"
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
|
@@ -99,7 +99,7 @@ module Deliver
|
|
|
99
99
|
optional: true,
|
|
100
100
|
default_value: "ios",
|
|
101
101
|
verify_block: proc do |value|
|
|
102
|
-
UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %(
|
|
102
|
+
UI.user_error!("The platform can only be ios, appletvos/tvos, xros or osx") unless %w(ios appletvos tvos xros osx).include?(value)
|
|
103
103
|
end),
|
|
104
104
|
|
|
105
105
|
# live version
|
|
@@ -107,7 +107,7 @@ module Deliver
|
|
|
107
107
|
begin
|
|
108
108
|
precheck_success = Precheck::Runner.new.run
|
|
109
109
|
rescue => ex
|
|
110
|
-
UI.error("fastlane precheck just tried to inspect your app's metadata for App Store guideline violations and ran into a problem. We're not sure what the problem was, but precheck failed to
|
|
110
|
+
UI.error("fastlane precheck just tried to inspect your app's metadata for App Store guideline violations and ran into a problem. We're not sure what the problem was, but precheck failed to finish. You can run it in verbose mode if you want to see the whole error. We'll have a fix out soon 🚀")
|
|
111
111
|
UI.verbose(ex.inspect)
|
|
112
112
|
UI.verbose(ex.backtrace.join("\n"))
|
|
113
113
|
end
|
|
@@ -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
|
|
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.
|
|
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
|
|
|
@@ -21,6 +21,6 @@ _fastlane_complete() {
|
|
|
21
21
|
completions="$(sed -En 's/^[ ]*lane +:([^ ]+).*$/\1/p' "$file")"
|
|
22
22
|
completions="$completions update_fastlane"
|
|
23
23
|
|
|
24
|
-
COMPREPLY
|
|
24
|
+
mapfile -t COMPREPLY < <(compgen -W "$completions" -- "$word")
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
# shellcheck disable=SC2039
|
|
5
5
|
|
|
6
6
|
if [ -n "$BASH_VERSION" ]; then
|
|
7
|
-
|
|
7
|
+
. ~/.fastlane/completions/completion.bash
|
|
8
8
|
elif [ -n "$ZSH_VERSION" ]; then
|
|
9
|
-
|
|
9
|
+
. ~/.fastlane/completions/completion.zsh
|
|
10
10
|
fi
|
|
11
11
|
|
|
12
12
|
# Do not remove v0.0.1
|
|
@@ -66,17 +66,17 @@ module Fastlane
|
|
|
66
66
|
version_number = params[:version]
|
|
67
67
|
platform = params[:platform]
|
|
68
68
|
|
|
69
|
-
# Create filter for
|
|
70
|
-
filter = {
|
|
69
|
+
# Create filter for get_build_uploads with optional version number
|
|
70
|
+
filter = {}
|
|
71
71
|
if version_number
|
|
72
|
-
filter["
|
|
72
|
+
filter["cfBundleShortVersionString"] = version_number
|
|
73
73
|
version_number_message = "version #{version_number}"
|
|
74
74
|
else
|
|
75
75
|
version_number_message = "any version"
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
if platform
|
|
79
|
-
filter["
|
|
79
|
+
filter["platform"] = Spaceship::ConnectAPI::Platform.map(platform)
|
|
80
80
|
platform_message = "#{platform} platform"
|
|
81
81
|
else
|
|
82
82
|
platform_message = "any platform"
|
|
@@ -84,19 +84,20 @@ module Fastlane
|
|
|
84
84
|
|
|
85
85
|
UI.message("Fetching the latest build number for #{version_number_message}")
|
|
86
86
|
|
|
87
|
-
# Get latest build for optional version number and return build number if found
|
|
88
|
-
|
|
89
|
-
if
|
|
90
|
-
build_nr =
|
|
91
|
-
|
|
92
|
-
|
|
87
|
+
# Get latest build upload for optional version number and return build number if found
|
|
88
|
+
build_upload = Spaceship::ConnectAPI.get_build_uploads(app_id: app.id, filter: filter, sort: "-cfBundleVersion", limit: 1).first
|
|
89
|
+
if build_upload
|
|
90
|
+
build_nr = build_upload.cf_build_version
|
|
91
|
+
build_v = build_upload.cf_build_short_version_string
|
|
92
|
+
UI.message("Latest upload for version #{build_v} on #{platform_message} is build: #{build_nr}")
|
|
93
|
+
return OpenStruct.new({ build_nr: build_nr, build_v: build_v })
|
|
93
94
|
end
|
|
94
95
|
|
|
95
|
-
# Let user know that build couldn't be found
|
|
96
|
-
UI.important("Could not find a build for #{version_number_message} on #{platform_message} on App Store Connect")
|
|
96
|
+
# Let user know that build upload couldn't be found
|
|
97
|
+
UI.important("Could not find a build upload for #{version_number_message} on #{platform_message} on App Store Connect")
|
|
97
98
|
|
|
98
99
|
if params[:initial_build_number].nil?
|
|
99
|
-
UI.user_error!("Could not find a build on App Store Connect - and 'initial_build_number' option is not set")
|
|
100
|
+
UI.user_error!("Could not find a build upload on App Store Connect - and 'initial_build_number' option is not set")
|
|
100
101
|
else
|
|
101
102
|
build_nr = params[:initial_build_number]
|
|
102
103
|
UI.message("Using initial build number of #{build_nr}")
|
|
@@ -140,7 +141,7 @@ module Fastlane
|
|
|
140
141
|
conflicting_options: [:api_key_path]),
|
|
141
142
|
FastlaneCore::ConfigItem.new(key: :initial_build_number,
|
|
142
143
|
env_name: "INITIAL_BUILD_NUMBER",
|
|
143
|
-
description: "sets the build number to given value if no build is in current train",
|
|
144
|
+
description: "sets the build number to given value if no build (upload) is in current train",
|
|
144
145
|
skip_type_validation: true), # as we also allow integers, which we convert to strings anyway
|
|
145
146
|
FastlaneCore::ConfigItem.new(key: :app_identifier,
|
|
146
147
|
short_option: "-a",
|
|
@@ -186,7 +187,7 @@ module Fastlane
|
|
|
186
187
|
optional: true,
|
|
187
188
|
default_value: "ios",
|
|
188
189
|
verify_block: proc do |value|
|
|
189
|
-
UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %(
|
|
190
|
+
UI.user_error!("The platform can only be ios, appletvos/tvos, xros or osx") unless %w(ios appletvos tvos xros osx).include?(value)
|
|
190
191
|
end),
|
|
191
192
|
FastlaneCore::ConfigItem.new(key: :team_name,
|
|
192
193
|
short_option: "-e",
|
|
@@ -138,10 +138,11 @@ fastlane produce enable_services --help
|
|
|
138
138
|
--associated-domains Enable Associated Domains
|
|
139
139
|
--auto-fill-credential Enable Auto Fill Credential
|
|
140
140
|
--class-kit Enable Class Kit
|
|
141
|
-
--icloud STRING
|
|
141
|
+
--icloud STRING Enable iCloud, suitable values are "xcode5_compatible" and "xcode6_compatible"
|
|
142
142
|
--custom-network-protocol Enable Custom Network Protocol
|
|
143
143
|
--data-protection STRING Enable Data Protection, suitable values are "complete", "unlessopen" and "untilfirstauth"
|
|
144
144
|
--extended-virtual-address-space Enable Extended Virtual Address Space
|
|
145
|
+
--declared-age-range Enable Declared Age Range capability
|
|
145
146
|
--game-center STRING Enable Game Center, suitable values are "ios" and "macos
|
|
146
147
|
--health-kit Enable Health Kit
|
|
147
148
|
--hls-interstitial-preview Enable Hls Interstitial Preview
|
|
@@ -201,10 +202,11 @@ fastlane produce disable_services --help
|
|
|
201
202
|
--associated-domains Disable Associated Domains
|
|
202
203
|
--auto-fill-credential Disable Auto Fill Credential
|
|
203
204
|
--class-kit Disable Class Kit
|
|
204
|
-
--icloud STRING
|
|
205
|
+
--icloud STRING Disable iCloud
|
|
205
206
|
--custom-network-protocol Disable Custom Network Protocol
|
|
206
207
|
--data-protection STRING Disable Data Protection
|
|
207
208
|
--extended-virtual-address-space Disable Extended Virtual Address Space
|
|
209
|
+
--declared-age-range Disable Declared Age Range capability
|
|
208
210
|
--game-center STRING Disable Game Center
|
|
209
211
|
--health-kit Disable Health Kit
|
|
210
212
|
--hls-interstitial-preview Disable Hls Interstitial Preview
|
|
@@ -302,7 +304,7 @@ lane :release do
|
|
|
302
304
|
app_version: '1.0',
|
|
303
305
|
sku: '123',
|
|
304
306
|
team_name: 'SunApps GmbH', # only necessary when in multiple teams
|
|
305
|
-
|
|
307
|
+
|
|
306
308
|
# Optional
|
|
307
309
|
# App services can be enabled during app creation
|
|
308
310
|
enable_services: {
|
|
@@ -317,6 +319,7 @@ lane :release do
|
|
|
317
319
|
car_play_navigation_app: "on", # Valid values: "on", "off"
|
|
318
320
|
car_play_voip_calling_app: "on", # Valid values: "on", "off"
|
|
319
321
|
class_kit: "on", # Valid values: "on", "off"
|
|
322
|
+
declared_age_range: "on", # Valid values: "on", "off"
|
|
320
323
|
icloud: "xcode5_compatible", # Valid values: "xcode5_compatible", "xcode6_compatible", "off"
|
|
321
324
|
critical_alerts: "on", # Valid values: "on", "off"
|
|
322
325
|
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
|
|
|
@@ -406,14 +408,16 @@ If you're not using `Fastfile`, you can also use the `force_for_new_devices` opt
|
|
|
406
408
|
fastlane match adhoc --force_for_new_devices
|
|
407
409
|
```
|
|
408
410
|
|
|
409
|
-
#####
|
|
411
|
+
##### Managed capabilities
|
|
410
412
|
|
|
411
|
-
|
|
413
|
+
> [!IMPORTANT]
|
|
414
|
+
> This feature has been deprecated since May 2025, until Apple provides a new solution. We will update this documentation once we have more information on how to handle managed capabilities in the future.
|
|
412
415
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
416
|
+
Managed capabilities — formerly known as "additional entitlements" or "custom entitlements", enabled via "templates" — are additional capabilities that require Apple's review and approval before they can be distributed.
|
|
417
|
+
|
|
418
|
+
These capabilities used to be enabled by passing a `template_name` parameter to the _match_ action, which would then generate a provisioning profile with the entitlements specified by the given template. However, this feature was never officially supported by Apple's API (undocumented), and they eventually removed it in May 2025 ([see issue #29498](https://github.com/fastlane/fastlane/issues/29498)). Apple still hasn't provided a replacement for this functionality.
|
|
419
|
+
|
|
420
|
+
As a result, the `template_name` parameter was deprecated in the _match_ action, and it will not generate provisioning profiles with custom entitlements.
|
|
417
421
|
|
|
418
422
|
### Setup Xcode project
|
|
419
423
|
|
|
@@ -564,7 +568,7 @@ What's the worst that could happen for each of the profile types?
|
|
|
564
568
|
|
|
565
569
|
#### App Store Profiles
|
|
566
570
|
|
|
567
|
-
An App Store profile can't be used for anything as long as it's not re-signed by Apple. The only way to get an app resigned is to submit an app for review which could take anywhere from 24 hours to a few days
|
|
571
|
+
An App Store profile can't be used for anything as long as it's not re-signed by Apple. The only way to get an app resigned is to submit an app for review which could take anywhere from 24 hours to a few days. Attackers could only submit an app for review, if they also got access to your App Store Connect credentials (which are not stored in git, but in your local keychain). Additionally you get an email notification every time a build gets uploaded to cancel the submission even before your app gets into the review stage.
|
|
568
572
|
|
|
569
573
|
#### Development and Ad Hoc Profiles
|
|
570
574
|
|
|
@@ -588,7 +588,7 @@ Key | Editable While Live | Directory | Filename | Deprecated Filename
|
|
|
588
588
|
|
|
589
589
|
### Available age rating groups
|
|
590
590
|
|
|
591
|
-
####
|
|
591
|
+
#### Infrequent/Mild or Frequent/Intense
|
|
592
592
|
|
|
593
593
|
**Values**
|
|
594
594
|
|
|
@@ -597,34 +597,73 @@ 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**
|
|
604
606
|
|
|
605
|
-
-
|
|
606
|
-
-
|
|
607
|
-
-
|
|
608
|
-
-
|
|
609
|
-
-
|
|
610
|
-
|
|
611
|
-
-
|
|
612
|
-
-
|
|
613
|
-
-
|
|
614
|
-
-
|
|
615
|
-
-
|
|
616
|
-
-
|
|
617
|
-
-
|
|
618
|
-
|
|
619
|
-
|
|
607
|
+
- `alcoholTobaccoOrDrugUseOrReferences`
|
|
608
|
+
- `contests`
|
|
609
|
+
- `gamblingSimulated`
|
|
610
|
+
- `gunsOrOtherWeapons`
|
|
611
|
+
- `horrorOrFearThemes`
|
|
612
|
+
- `matureOrSuggestiveThemes`
|
|
613
|
+
- `medicalOrTreatmentInformation`
|
|
614
|
+
- `profanityOrCrudeHumor`
|
|
615
|
+
- `sexualContentGraphicAndNudity`
|
|
616
|
+
- `sexualContentOrNudity`
|
|
617
|
+
- `violenceCartoonOrFantasy`
|
|
618
|
+
- `violenceRealistic`
|
|
619
|
+
- `violenceRealisticProlongedGraphicOrSadistic`
|
|
620
|
+
|
|
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
|
|
637
|
+
|
|
638
|
+
**Values**
|
|
639
|
+
|
|
640
|
+
- `NONE`
|
|
641
|
+
- `FIFTEEN_PLUS`
|
|
642
|
+
- `NINETEEN_PLUS`
|
|
643
|
+
|
|
644
|
+
**Keys**
|
|
645
|
+
|
|
646
|
+
- `koreaAgeRatingOverride`
|
|
647
|
+
|
|
648
|
+
#### URL
|
|
649
|
+
|
|
650
|
+
**Keys**
|
|
651
|
+
|
|
652
|
+
- `developerAgeRatingInfoUrl`
|
|
620
653
|
|
|
621
654
|
#### Boolean
|
|
622
655
|
|
|
623
656
|
**Keys**
|
|
624
657
|
|
|
658
|
+
- `advertising`
|
|
659
|
+
- `ageAssurance`
|
|
625
660
|
- `gambling`
|
|
626
|
-
-
|
|
661
|
+
- `healthOrWellnessTopics`
|
|
662
|
+
- `lootBox`
|
|
663
|
+
- `messagingAndChat`
|
|
664
|
+
- `parentalControls`
|
|
627
665
|
- `unrestrictedWebAccess`
|
|
666
|
+
- `userGeneratedContent`
|
|
628
667
|
|
|
629
668
|
#### Kids Age
|
|
630
669
|
|
|
@@ -77,7 +77,19 @@ _pilot_ does all kinds of magic for you:
|
|
|
77
77
|
- Automatically detects the bundle identifier from your `ipa` file
|
|
78
78
|
- Automatically fetch the AppID of your app based on the bundle identifier
|
|
79
79
|
|
|
80
|
-
_pilot_ uses [_spaceship_](https://spaceship.airforce) to submit the build metadata and the iTunes Transporter to upload the binary.
|
|
80
|
+
_pilot_ uses [_spaceship_](https://spaceship.airforce) to submit the build metadata and the iTunes Transporter to upload the binary.
|
|
81
|
+
|
|
82
|
+
### Upload from Linux
|
|
83
|
+
|
|
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_)
|
|
87
|
+
- make sure you have [Transporter on Linux](https://help.apple.com/itc/transporteruserguide/en.lproj/static.html) installed
|
|
88
|
+
- set the following environment variables:
|
|
89
|
+
- `FASTLANE_ITUNES_TRANSPORTER_USE_SHELL_SCRIPT=true`
|
|
90
|
+
- `FASTLANE_ITUNES_TRANSPORTER_PATH=/usr/local/itms` (_or the path where Transporter is installed_)
|
|
91
|
+
|
|
92
|
+
_Note: fastlane will temporarily save the upload credentials in `$HOME/.appstoreconnect/private_keys/`. Any other files in that directory will be deleted upon upload completion._
|
|
81
93
|
|
|
82
94
|
## List builds
|
|
83
95
|
|
|
@@ -6,7 +6,7 @@ module Fastlane
|
|
|
6
6
|
def self.run(params)
|
|
7
7
|
keychain_path = params[:keychain_path] || FastlaneCore::Helper.keychain_path(params[:keychain_name])
|
|
8
8
|
|
|
9
|
-
FastlaneCore::KeychainImporter.import_file(params[:certificate_path], keychain_path, keychain_password: params[:keychain_password], certificate_password: params[:certificate_password], output: params[:log_output])
|
|
9
|
+
FastlaneCore::KeychainImporter.import_file(params[:certificate_path], keychain_path, keychain_password: params[:keychain_password], certificate_password: params[:certificate_password], certificate_format: params[:certificate_format], output: params[:log_output])
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def self.description
|
|
@@ -23,6 +23,9 @@ module Fastlane
|
|
|
23
23
|
sensitive: true,
|
|
24
24
|
default_value: "",
|
|
25
25
|
optional: true),
|
|
26
|
+
FastlaneCore::ConfigItem.new(key: :certificate_format,
|
|
27
|
+
description: "Format of the certificate. Check the '-f' switch from 'security import --help' command",
|
|
28
|
+
optional: true),
|
|
26
29
|
FastlaneCore::ConfigItem.new(key: :keychain_name,
|
|
27
30
|
env_name: "KEYCHAIN_NAME",
|
|
28
31
|
description: "Keychain the items should be imported to",
|
|
@@ -65,6 +68,11 @@ module Fastlane
|
|
|
65
68
|
)',
|
|
66
69
|
'import_certificate(
|
|
67
70
|
certificate_path: "certs/development.cer"
|
|
71
|
+
)',
|
|
72
|
+
'import_certificate(
|
|
73
|
+
certificate_path: "certs/dist.p12",
|
|
74
|
+
certificate_password: ENV["CERTIFICATE_PASSWORD"] || "default",
|
|
75
|
+
certificate_format: "pkcs12"
|
|
68
76
|
)'
|
|
69
77
|
]
|
|
70
78
|
end
|
|
@@ -30,9 +30,10 @@ module Fastlane
|
|
|
30
30
|
default_value: 'HEAD',
|
|
31
31
|
optional: true),
|
|
32
32
|
FastlaneCore::ConfigItem.new(key: :dependencies,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
description: "The array of additional Fastfiles in the repository",
|
|
34
|
+
default_value: [],
|
|
35
|
+
type: Array,
|
|
36
|
+
optional: true),
|
|
36
37
|
FastlaneCore::ConfigItem.new(key: :path,
|
|
37
38
|
description: "The path of the Fastfile in the repository",
|
|
38
39
|
default_value: 'fastlane/Fastfile',
|
|
@@ -43,6 +44,11 @@ module Fastlane
|
|
|
43
44
|
optional: true),
|
|
44
45
|
FastlaneCore::ConfigItem.new(key: :cache_path,
|
|
45
46
|
description: "The path to a directory where the repository should be cloned into. Defaults to `nil`, which causes the repository to be cloned on every call, to a temporary directory",
|
|
47
|
+
optional: true),
|
|
48
|
+
FastlaneCore::ConfigItem.new(key: :git_extra_headers,
|
|
49
|
+
description: "An optional list of custom HTTP headers to access the git repo (`Authorization: Basic <YOUR BASE64 KEY>`, `Cache-Control: no-cache`, etc.)",
|
|
50
|
+
default_value: [],
|
|
51
|
+
type: Array,
|
|
46
52
|
optional: true)
|
|
47
53
|
]
|
|
48
54
|
end
|
|
@@ -68,7 +74,8 @@ module Fastlane
|
|
|
68
74
|
branch: "HEAD", # The branch to checkout on the repository.
|
|
69
75
|
path: "fastlane/Fastfile", # The path of the Fastfile in the repository.
|
|
70
76
|
version: [">= 1.1.0", "< 2.0.0"], # The version to checkout on the repository. Multiple conditions can be used to select the latest version within constraints.
|
|
71
|
-
cache_path: "~/.cache/fastlane/imported" # A directory in which the repository will be added, which means that it will not be cloned again on subsequent calls.
|
|
77
|
+
cache_path: "~/.cache/fastlane/imported", # A directory in which the repository will be added, which means that it will not be cloned again on subsequent calls.
|
|
78
|
+
git_extra_headers: ["Authorization: Basic <YOUR BASE64 KEY>", "Cache-Control: no-cache"]
|
|
72
79
|
)'
|
|
73
80
|
]
|
|
74
81
|
end
|
|
@@ -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 -
|
|
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
|
|
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")
|
|
@@ -83,11 +83,11 @@ module Fastlane
|
|
|
83
83
|
optional: true,
|
|
84
84
|
default_value: "ios",
|
|
85
85
|
verify_block: proc do |value|
|
|
86
|
-
UI.user_error!("The platform can only be ios, osx, xros or appletvos") unless %(
|
|
86
|
+
UI.user_error!("The platform can only be ios, osx, xros or appletvos/tvos") unless %w(ios osx xros appletvos tvos).include?(value)
|
|
87
87
|
end),
|
|
88
88
|
FastlaneCore::ConfigItem.new(key: :initial_build_number,
|
|
89
89
|
env_name: "INITIAL_BUILD_NUMBER",
|
|
90
|
-
description: "sets the build number to given value if no build is in current train",
|
|
90
|
+
description: "sets the build number to given value if no build (upload) is in current train",
|
|
91
91
|
default_value: 1,
|
|
92
92
|
skip_type_validation: true), # allow Integer, String
|
|
93
93
|
FastlaneCore::ConfigItem.new(key: :team_id,
|
|
@@ -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',
|
|
@@ -53,7 +53,7 @@ module Fastlane
|
|
|
53
53
|
payload["organization_id"] = organization_id unless organization_id.nil?
|
|
54
54
|
|
|
55
55
|
# here's the actual lifting - POST or PUT to OneSignal
|
|
56
|
-
json_headers = { 'Content-Type' => 'application/json', 'Authorization' => "
|
|
56
|
+
json_headers = { 'Content-Type' => 'application/json', 'Authorization' => "Key #{auth_token}" }
|
|
57
57
|
url = +'https://api.onesignal.com/apps'
|
|
58
58
|
url << '/' + app_id if is_update
|
|
59
59
|
uri = URI.parse(url)
|
|
@@ -58,7 +58,7 @@ module Fastlane
|
|
|
58
58
|
optional: true,
|
|
59
59
|
default_value: platform.empty? ? "ios" : platform,
|
|
60
60
|
verify_block: proc do |value|
|
|
61
|
-
UI.user_error!("The platform can only be ios or mac") unless %(
|
|
61
|
+
UI.user_error!("The platform can only be ios or mac") unless %w(ios mac).include?(value)
|
|
62
62
|
end),
|
|
63
63
|
FastlaneCore::ConfigItem.new(key: :udid,
|
|
64
64
|
env_name: "FL_REGISTER_DEVICE_UDID",
|
|
@@ -160,7 +160,7 @@ module Fastlane
|
|
|
160
160
|
optional: true,
|
|
161
161
|
default_value: platform.empty? ? "ios" : platform,
|
|
162
162
|
verify_block: proc do |value|
|
|
163
|
-
UI.user_error!("The platform can only be ios or mac") unless %(
|
|
163
|
+
UI.user_error!("The platform can only be ios or mac") unless %w(ios mac).include?(value)
|
|
164
164
|
end)
|
|
165
165
|
]
|
|
166
166
|
end
|