fastlane 2.142.0 → 2.146.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +80 -80
- data/credentials_manager/lib/credentials_manager/appfile_config.rb +4 -0
- data/deliver/lib/deliver/app_screenshot.rb +1 -0
- data/deliver/lib/deliver/options.rb +30 -1
- data/deliver/lib/deliver/setup.rb +4 -4
- data/fastlane/lib/fastlane/actions/automatic_code_signing.rb +7 -1
- data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +3 -0
- data/fastlane/lib/fastlane/actions/crashlytics.rb +14 -2
- data/fastlane/lib/fastlane/actions/create_pull_request.rb +7 -1
- data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +10 -4
- data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +22 -6
- data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +23 -7
- data/fastlane/lib/fastlane/actions/frame_screenshots.rb +2 -1
- data/fastlane/lib/fastlane/actions/get_version_number.rb +1 -1
- data/fastlane/lib/fastlane/actions/pod_lib_lint.rb +7 -1
- data/fastlane/lib/fastlane/actions/s3.rb +3 -289
- data/fastlane/lib/fastlane/actions/setup_ci.rb +1 -1
- data/fastlane/lib/fastlane/actions/setup_jenkins.rb +11 -2
- data/fastlane/lib/fastlane/actions/slather.rb +1 -1
- data/fastlane/lib/fastlane/actions/swiftlint.rb +28 -7
- data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +203 -0
- data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +1 -1
- data/fastlane/lib/fastlane/actions/verify_build.rb +1 -1
- data/fastlane/lib/fastlane/helper/s3_client_helper.rb +61 -0
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/Fastlane.swift +147 -8
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +17 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +5 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +9 -0
- data/fastlane_core/lib/fastlane_core/device_manager.rb +3 -3
- data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +1 -0
- data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +15 -2
- data/frameit/lib/frameit/commands_generator.rb +25 -0
- data/frameit/lib/frameit/config_parser.rb +31 -9
- data/frameit/lib/frameit/device.rb +90 -0
- data/frameit/lib/frameit/device_types.rb +121 -5
- data/frameit/lib/frameit/editor.rb +29 -41
- data/frameit/lib/frameit/offsets.rb +8 -1
- data/frameit/lib/frameit/options.rb +81 -54
- data/frameit/lib/frameit/runner.rb +17 -7
- data/frameit/lib/frameit/screenshot.rb +39 -47
- data/frameit/lib/frameit/template_finder.rb +15 -12
- data/gym/lib/gym/generators/package_command_generator.rb +4 -0
- data/gym/lib/gym/generators/package_command_generator_xcode7.rb +5 -0
- data/gym/lib/gym/runner.rb +14 -0
- data/match/lib/match/change_password.rb +1 -1
- data/match/lib/match/encryption.rb +4 -0
- data/match/lib/match/importer.rb +37 -20
- data/match/lib/match/module.rb +1 -1
- data/match/lib/match/nuke.rb +5 -1
- data/match/lib/match/options.rb +18 -0
- data/match/lib/match/runner.rb +4 -0
- data/match/lib/match/setup.rb +1 -1
- data/match/lib/match/storage.rb +4 -0
- data/match/lib/match/storage/s3_storage.rb +167 -0
- data/pilot/lib/pilot/build_manager.rb +15 -4
- data/pilot/lib/pilot/options.rb +8 -0
- data/produce/lib/produce/developer_center.rb +11 -2
- data/produce/lib/produce/itunes_connect.rb +11 -3
- data/produce/lib/produce/options.rb +12 -0
- data/scan/lib/scan/options.rb +5 -0
- data/scan/lib/scan/test_command_generator.rb +5 -1
- data/screengrab/lib/screengrab/runner.rb +12 -4
- data/snapshot/lib/snapshot/reports_generator.rb +4 -0
- data/spaceship/lib/spaceship/connect_api/models/app.rb +11 -0
- data/spaceship/lib/spaceship/connect_api/models/build.rb +1 -2
- data/spaceship/lib/spaceship/connect_api/models/certificate.rb +2 -0
- data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +23 -0
- data/spaceship/lib/spaceship/portal/app_service.rb +2 -2
- data/spaceship/lib/spaceship/portal/portal_client.rb +13 -0
- data/spaceship/lib/spaceship/tunes/app_version.rb +6 -1
- data/spaceship/lib/spaceship/tunes/application.rb +2 -1
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +2 -2
- data/spaceship/lib/spaceship/two_step_or_factor_client.rb +52 -16
- data/supply/lib/supply/client.rb +4 -4
- data/supply/lib/supply/setup.rb +5 -3
- metadata +34 -17
- data/gym/lib/gym/.code_signing_mapping.rb.swp +0 -0
@@ -93,7 +93,7 @@ module Fastlane
|
|
93
93
|
env_name: "FL_SETUP_CI_PROVIDER",
|
94
94
|
description: "CI provider. If none is set, the provider is detected automatically",
|
95
95
|
is_string: true,
|
96
|
-
|
96
|
+
optional: true,
|
97
97
|
verify_block: proc do |value|
|
98
98
|
value = value.to_s
|
99
99
|
# Validate both 'travis' and 'circleci' for backwards compatibility, even
|
@@ -14,7 +14,10 @@ module Fastlane
|
|
14
14
|
"SCAN_DERIVED_DATA_PATH",
|
15
15
|
"SCAN_OUTPUT_DIRECTORY",
|
16
16
|
"SCAN_RESULT_BUNDLE",
|
17
|
-
"XCODE_DERIVED_DATA_PATH"
|
17
|
+
"XCODE_DERIVED_DATA_PATH",
|
18
|
+
"MATCH_KEYCHAIN_NAME",
|
19
|
+
"MATCH_KEYCHAIN_PASSWORD",
|
20
|
+
"MATCH_READONLY"
|
18
21
|
].freeze
|
19
22
|
|
20
23
|
def self.run(params)
|
@@ -40,6 +43,9 @@ module Fastlane
|
|
40
43
|
add_to_search_list: params[:add_keychain_to_search_list],
|
41
44
|
set_default: params[:set_default_keychain]
|
42
45
|
)
|
46
|
+
ENV['MATCH_KEYCHAIN_NAME'] ||= keychain_path
|
47
|
+
ENV['MATCH_KEYCHAIN_PASSWORD'] ||= params[:keychain_password]
|
48
|
+
ENV["MATCH_READONLY"] ||= true.to_s
|
43
49
|
end
|
44
50
|
|
45
51
|
# Code signing identity
|
@@ -90,6 +96,7 @@ module Fastlane
|
|
90
96
|
def self.details
|
91
97
|
list = <<-LIST.markdown_list(true)
|
92
98
|
Adds and unlocks keychains from Jenkins 'Keychains and Provisioning Profiles Plugin'
|
99
|
+
Sets unlocked keychain to be used by Match
|
93
100
|
Sets code signing identity from Jenkins 'Keychains and Provisioning Profiles Plugin'
|
94
101
|
Sets output directory to './output' (gym, scan and backup_xcarchive)
|
95
102
|
Sets derived data path to './derivedData' (xcodebuild, gym, scan and clear_derived_data, carthage)
|
@@ -99,7 +106,9 @@ module Fastlane
|
|
99
106
|
[
|
100
107
|
list,
|
101
108
|
"This action helps with Jenkins integration. Creates own derived data for each job. All build results like IPA files and archives will be stored in the `./output` directory.",
|
102
|
-
"The action also works with [Keychains and Provisioning Profiles Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Keychains+and+Provisioning+Profiles+Plugin), the selected keychain will be automatically unlocked and the selected code signing identity will be used.
|
109
|
+
"The action also works with [Keychains and Provisioning Profiles Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Keychains+and+Provisioning+Profiles+Plugin), the selected keychain will be automatically unlocked and the selected code signing identity will be used.",
|
110
|
+
"[Match](https://docs.fastlane.tools/actions/match/) will be also set up to use the unlocked keychain and set in read-only mode, if its environment variables were not yet defined.",
|
111
|
+
"By default this action will only work when _fastlane_ is executed on a CI system."
|
103
112
|
].join("\n")
|
104
113
|
end
|
105
114
|
|
@@ -241,7 +241,7 @@ module Fastlane
|
|
241
241
|
FastlaneCore::ConfigItem.new(key: :ignore,
|
242
242
|
env_name: "FL_SLATHER_IGNORE",
|
243
243
|
description: "Tell slather to ignore files matching a path or any path from an array of paths",
|
244
|
-
|
244
|
+
type: Array,
|
245
245
|
optional: true),
|
246
246
|
FastlaneCore::ConfigItem.new(key: :verbose,
|
247
247
|
env_name: "FL_SLATHER_VERBOSE",
|
@@ -13,13 +13,7 @@ module Fastlane
|
|
13
13
|
|
14
14
|
command = (params[:executable] || "swiftlint").dup
|
15
15
|
command << " #{params[:mode]}"
|
16
|
-
command <<
|
17
|
-
command << supported_option_switch(params, :strict, "0.9.2", true)
|
18
|
-
command << " --config #{params[:config_file].shellescape}" if params[:config_file]
|
19
|
-
command << " --reporter #{params[:reporter]}" if params[:reporter]
|
20
|
-
command << supported_option_switch(params, :quiet, "0.9.0", true)
|
21
|
-
command << supported_option_switch(params, :format, "0.11.0", true) if params[:mode] == :autocorrect
|
22
|
-
command << " --compiler-log-path #{params[:compiler_log_path].shellescape}" if params[:compiler_log_path]
|
16
|
+
command << optional_flags(params)
|
23
17
|
|
24
18
|
if params[:files]
|
25
19
|
if version < Gem::Version.new('0.5.1')
|
@@ -41,12 +35,33 @@ module Fastlane
|
|
41
35
|
end
|
42
36
|
end
|
43
37
|
|
38
|
+
def self.optional_flags(params)
|
39
|
+
command = ""
|
40
|
+
command << " --path #{params[:path].shellescape}" if params[:path]
|
41
|
+
command << supported_option_switch(params, :strict, "0.9.2", true)
|
42
|
+
command << " --config #{params[:config_file].shellescape}" if params[:config_file]
|
43
|
+
command << " --reporter #{params[:reporter]}" if params[:reporter]
|
44
|
+
command << supported_option_switch(params, :quiet, "0.9.0", true)
|
45
|
+
command << supported_option_switch(params, :format, "0.11.0", true) if params[:mode] == :autocorrect
|
46
|
+
command << supported_no_cache_option(params) if params[:no_cache]
|
47
|
+
command << " --compiler-log-path #{params[:compiler_log_path].shellescape}" if params[:compiler_log_path]
|
48
|
+
return command
|
49
|
+
end
|
50
|
+
|
44
51
|
# Get current SwiftLint version
|
45
52
|
def self.swiftlint_version(executable: nil)
|
46
53
|
binary = executable || 'swiftlint'
|
47
54
|
Gem::Version.new(`#{binary} version`.chomp)
|
48
55
|
end
|
49
56
|
|
57
|
+
def self.supported_no_cache_option(params)
|
58
|
+
if params[:mode] == :autocorrect || params[:mode] == :lint
|
59
|
+
return " --no-cache"
|
60
|
+
else
|
61
|
+
return ""
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
50
65
|
# Return "--option" switch if option is on and current SwiftLint version is greater or equal than min version.
|
51
66
|
# Return "" otherwise.
|
52
67
|
def self.supported_option_switch(params, option, min_version, can_ignore = false)
|
@@ -139,6 +154,12 @@ module Fastlane
|
|
139
154
|
is_string: false,
|
140
155
|
type: Boolean,
|
141
156
|
optional: true),
|
157
|
+
FastlaneCore::ConfigItem.new(key: :no_cache,
|
158
|
+
description: "Ignore the cache when mode is :autocorrect or :lint",
|
159
|
+
default_value: false,
|
160
|
+
is_string: false,
|
161
|
+
type: Boolean,
|
162
|
+
optional: true),
|
142
163
|
FastlaneCore::ConfigItem.new(key: :compiler_log_path,
|
143
164
|
description: "Compiler log path when mode is :analyze",
|
144
165
|
is_string: true,
|
@@ -0,0 +1,203 @@
|
|
1
|
+
require 'xcodeproj'
|
2
|
+
module Fastlane
|
3
|
+
module Actions
|
4
|
+
class UpdateCodeSigningSettingsAction < Action
|
5
|
+
def self.run(params)
|
6
|
+
FastlaneCore::PrintTable.print_values(config: params, title: "Summary for code signing settings")
|
7
|
+
path = params[:path]
|
8
|
+
path = File.join(File.expand_path(path), "project.pbxproj")
|
9
|
+
|
10
|
+
project = Xcodeproj::Project.open(params[:path])
|
11
|
+
UI.user_error!("Could not find path to project config '#{path}'. Pass the path to your project (not workspace)!") unless File.exist?(path)
|
12
|
+
UI.message("Updating the Automatic Codesigning flag to #{params[:use_automatic_signing] ? 'enabled' : 'disabled'} for the given project '#{path}'")
|
13
|
+
|
14
|
+
unless project.root_object.attributes["TargetAttributes"]
|
15
|
+
UI.user_error!("Seems to be a very old project file format - please open your project file in a more recent version of Xcode")
|
16
|
+
return false
|
17
|
+
end
|
18
|
+
|
19
|
+
changed_targets = []
|
20
|
+
changed_build_configurations = []
|
21
|
+
|
22
|
+
project.targets.each do |target|
|
23
|
+
if params[:targets]
|
24
|
+
unless params[:targets].include?(target.name)
|
25
|
+
UI.important("Skipping #{target.name} not selected (#{params[:targets].join(',')})")
|
26
|
+
next
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
target.build_configurations.each do |config|
|
31
|
+
if params[:build_configurations]
|
32
|
+
unless params[:build_configurations].include?(config.name)
|
33
|
+
UI.important("Skipping #{config.name} not selected (#{params[:build_configurations].join(',')})")
|
34
|
+
next
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
style_value = params[:use_automatic_signing] ? 'Automatic' : 'Manual'
|
39
|
+
set_build_setting(config, "CODE_SIGN_STYLE", style_value)
|
40
|
+
|
41
|
+
if params[:team_id]
|
42
|
+
set_build_setting(config, "DEVELOPMENT_TEAM", params[:team_id])
|
43
|
+
UI.important("Set Team id to: #{params[:team_id]} for target: #{target.name} for build configuration: #{config.name}")
|
44
|
+
end
|
45
|
+
if params[:code_sign_identity]
|
46
|
+
set_build_setting(config, "CODE_SIGN_IDENTITY", params[:code_sign_identity])
|
47
|
+
UI.important("Set Code Sign identity to: #{params[:code_sign_identity]} for target: #{target.name} for build configuration: #{config.name}")
|
48
|
+
end
|
49
|
+
if params[:profile_name]
|
50
|
+
set_build_setting(config, "PROVISIONING_PROFILE_SPECIFIER", params[:profile_name])
|
51
|
+
UI.important("Set Provisioning Profile name to: #{params[:profile_name]} for target: #{target.name} for build configuration: #{config.name}")
|
52
|
+
end
|
53
|
+
# Since Xcode 8, this is no longer needed, you simply use PROVISIONING_PROFILE_SPECIFIER
|
54
|
+
if params[:profile_uuid]
|
55
|
+
set_build_setting(config, "PROVISIONING_PROFILE", params[:profile_uuid])
|
56
|
+
UI.important("Set Provisioning Profile UUID to: #{params[:profile_uuid]} for target: #{target.name} for build configuration: #{config.name}")
|
57
|
+
end
|
58
|
+
if params[:bundle_identifier]
|
59
|
+
set_build_setting(config, "PRODUCT_BUNDLE_IDENTIFIER", params[:bundle_identifier])
|
60
|
+
UI.important("Set Bundle identifier to: #{params[:bundle_identifier]} for target: #{target.name} for build configuration: #{config.name}")
|
61
|
+
end
|
62
|
+
|
63
|
+
changed_build_configurations << config.name
|
64
|
+
end
|
65
|
+
|
66
|
+
changed_targets << target.name
|
67
|
+
end
|
68
|
+
project.save
|
69
|
+
|
70
|
+
if changed_targets.empty?
|
71
|
+
UI.important("None of the specified targets has been modified")
|
72
|
+
UI.important("available targets:")
|
73
|
+
project.targets.each do |target|
|
74
|
+
UI.important("\t* #{target.name}")
|
75
|
+
end
|
76
|
+
else
|
77
|
+
UI.success("Successfully updated project settings to use Code Sign Style = '#{params[:use_automatic_signing] ? 'Automatic' : 'Manual'}'")
|
78
|
+
UI.success("Modified Targets:")
|
79
|
+
changed_targets.each do |target|
|
80
|
+
UI.success("\t * #{target}")
|
81
|
+
end
|
82
|
+
|
83
|
+
UI.success("Modified Build Configurations:")
|
84
|
+
changed_build_configurations.each do |name|
|
85
|
+
UI.success("\t * #{name}")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
params[:use_automatic_signing]
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.set_build_setting(configuration, name, value)
|
93
|
+
# Iterate over any keys that start with this name
|
94
|
+
# This will also set keys that have filtering like [sdk=iphoneos*]
|
95
|
+
keys = configuration.build_settings.keys.select { |key| key.to_s.match(/#{name}.*/) }
|
96
|
+
keys.each do |key|
|
97
|
+
configuration.build_settings[key] = value
|
98
|
+
end
|
99
|
+
|
100
|
+
# Explicitly set the key with value if keys don't exist
|
101
|
+
configuration.build_settings[name] = value
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.description
|
105
|
+
"Configures Xcode's Codesigning options"
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.details
|
109
|
+
"Configures Xcode's Codesigning options of all targets in the project"
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.available_options
|
113
|
+
[
|
114
|
+
FastlaneCore::ConfigItem.new(key: :path,
|
115
|
+
env_name: "FL_PROJECT_SIGNING_PROJECT_PATH",
|
116
|
+
description: "Path to your Xcode project",
|
117
|
+
code_gen_sensitive: true,
|
118
|
+
default_value: Dir['*.xcodeproj'].first,
|
119
|
+
default_value_dynamic: true,
|
120
|
+
verify_block: proc do |value|
|
121
|
+
UI.user_error!("Path is invalid") unless File.exist?(File.expand_path(value))
|
122
|
+
end),
|
123
|
+
FastlaneCore::ConfigItem.new(key: :use_automatic_signing,
|
124
|
+
env_name: "FL_PROJECT_USE_AUTOMATIC_SIGNING",
|
125
|
+
description: "Defines if project should use automatic signing",
|
126
|
+
is_string: false,
|
127
|
+
default_value: false),
|
128
|
+
FastlaneCore::ConfigItem.new(key: :team_id,
|
129
|
+
env_name: "FASTLANE_TEAM_ID",
|
130
|
+
optional: true,
|
131
|
+
description: "Team ID, is used when upgrading project",
|
132
|
+
is_string: true),
|
133
|
+
FastlaneCore::ConfigItem.new(key: :targets,
|
134
|
+
env_name: "FL_PROJECT_SIGNING_TARGETS",
|
135
|
+
optional: true,
|
136
|
+
type: Array,
|
137
|
+
description: "Specify targets you want to toggle the signing mech. (default to all targets)",
|
138
|
+
is_string: false),
|
139
|
+
FastlaneCore::ConfigItem.new(key: :build_configurations,
|
140
|
+
env_name: "FL_PROJECT_SIGNING_BUILD_CONFIGURATIONS",
|
141
|
+
optional: true,
|
142
|
+
type: Array,
|
143
|
+
description: "Specify build_configurations you want to toggle the signing mech. (default to all targets)",
|
144
|
+
is_string: false),
|
145
|
+
FastlaneCore::ConfigItem.new(key: :code_sign_identity,
|
146
|
+
env_name: "FL_CODE_SIGN_IDENTITY",
|
147
|
+
description: "Code signing identity type (iPhone Developer, iPhone Distribution)",
|
148
|
+
optional: true,
|
149
|
+
is_string: true),
|
150
|
+
FastlaneCore::ConfigItem.new(key: :profile_name,
|
151
|
+
env_name: "FL_PROVISIONING_PROFILE_SPECIFIER",
|
152
|
+
description: "Provisioning profile name to use for code signing",
|
153
|
+
optional: true,
|
154
|
+
is_string: true),
|
155
|
+
FastlaneCore::ConfigItem.new(key: :profile_uuid,
|
156
|
+
env_name: "FL_PROVISIONING_PROFILE",
|
157
|
+
description: "Provisioning profile UUID to use for code signing",
|
158
|
+
optional: true,
|
159
|
+
is_string: true),
|
160
|
+
FastlaneCore::ConfigItem.new(key: :bundle_identifier,
|
161
|
+
env_name: "FL_APP_IDENTIFIER",
|
162
|
+
description: "Application Product Bundle Identifier",
|
163
|
+
optional: true,
|
164
|
+
is_string: true)
|
165
|
+
]
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.output
|
169
|
+
end
|
170
|
+
|
171
|
+
def self.example_code
|
172
|
+
[
|
173
|
+
' # manual code signing
|
174
|
+
update_code_signing_settings(
|
175
|
+
use_automatic_signing: false,
|
176
|
+
path: "demo-project/demo/demo.xcodeproj"
|
177
|
+
)',
|
178
|
+
' # automatic code signing
|
179
|
+
update_code_signing_settings(
|
180
|
+
use_automatic_signing: true,
|
181
|
+
path: "demo-project/demo/demo.xcodeproj"
|
182
|
+
)'
|
183
|
+
]
|
184
|
+
end
|
185
|
+
|
186
|
+
def self.category
|
187
|
+
:code_signing
|
188
|
+
end
|
189
|
+
|
190
|
+
def self.return_value
|
191
|
+
"The current status (boolean) of codesigning after modification"
|
192
|
+
end
|
193
|
+
|
194
|
+
def self.authors
|
195
|
+
["mathiasAichinger", "hjanuschka", "p4checo", "portellaa", "aeons", "att55"]
|
196
|
+
end
|
197
|
+
|
198
|
+
def self.is_supported?(platform)
|
199
|
+
[:ios, :mac].include?(platform)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
@@ -130,7 +130,7 @@ module Fastlane
|
|
130
130
|
end
|
131
131
|
|
132
132
|
def self.find_binary_path(params)
|
133
|
-
params[:binary_path] ||= (Dir["/Applications/Fabric.app/**/upload-symbols"] + Dir["./Pods
|
133
|
+
params[:binary_path] ||= (Dir["/Applications/Fabric.app/**/upload-symbols"] + Dir["./Pods/Fabric/upload-symbols"] + Dir["./Pods/FirebaseCrashlytics/upload-symbols"]).last
|
134
134
|
UI.user_error!("Failed to find Fabric's upload_symbols binary at /Applications/Fabric.app/**/upload-symbols or ./Pods/**/upload-symbols. Please specify the location of the binary explicitly by using the binary_path option") unless params[:binary_path]
|
135
135
|
|
136
136
|
params[:binary_path] = File.expand_path(params[:binary_path])
|
@@ -46,7 +46,7 @@ module Fastlane
|
|
46
46
|
|
47
47
|
parts = cert_info.strip.split(/\r?\n/)
|
48
48
|
parts.each do |part|
|
49
|
-
if part =~ /\AAuthority=
|
49
|
+
if part =~ /\AAuthority=(iPhone|iOS|Apple)\s(Distribution|Development)/
|
50
50
|
type = part.split('=')[1].split(':')[0]
|
51
51
|
values['provisioning_type'] = type.downcase =~ /distribution/i ? "distribution" : "development"
|
52
52
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'aws-sdk-s3'
|
2
|
+
|
3
|
+
module Fastlane
|
4
|
+
module Helper
|
5
|
+
class S3ClientHelper
|
6
|
+
attr_reader :client
|
7
|
+
|
8
|
+
def initialize(access_key: nil, secret_access_key: nil, region: nil)
|
9
|
+
creds = Aws::Credentials.new(access_key, secret_access_key)
|
10
|
+
Aws.config.update(
|
11
|
+
region: region,
|
12
|
+
credentials: creds
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def list_buckets
|
17
|
+
return client.list_buckets
|
18
|
+
end
|
19
|
+
|
20
|
+
def upload_file(bucket_name, file_name, file_data, acl)
|
21
|
+
bucket = find_bucket!(bucket_name)
|
22
|
+
details = {
|
23
|
+
acl: acl,
|
24
|
+
key: file_name,
|
25
|
+
body: file_data
|
26
|
+
}
|
27
|
+
obj = bucket.put_object(details)
|
28
|
+
|
29
|
+
# When you enable versioning on a S3 bucket,
|
30
|
+
# writing to an object will create an object version
|
31
|
+
# instead of replacing the existing object.
|
32
|
+
# http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/ObjectVersion.html
|
33
|
+
if obj.kind_of?(Aws::S3::ObjectVersion)
|
34
|
+
obj = obj.object
|
35
|
+
end
|
36
|
+
|
37
|
+
# Return public url
|
38
|
+
obj.public_url.to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete_file(bucket_name, file_name)
|
42
|
+
bucket = find_bucket!(bucket_name)
|
43
|
+
file = bucket.object(file_name)
|
44
|
+
file.delete
|
45
|
+
end
|
46
|
+
|
47
|
+
def find_bucket!(bucket_name)
|
48
|
+
bucket = Aws::S3::Bucket.new(bucket_name, client: client)
|
49
|
+
raise "Bucket '#{bucket_name}' not found" unless bucket.exists?
|
50
|
+
|
51
|
+
return bucket
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def client
|
58
|
+
@client ||= Aws::S3::Client.new
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -2122,7 +2122,7 @@ func copyArtifacts(keepOriginal: Bool = true,
|
|
2122
2122
|
}
|
2123
2123
|
|
2124
2124
|
/**
|
2125
|
-
|
2125
|
+
Refer to [Firebase App Distribution](https://appdistro.page.link/fastlane-repo)
|
2126
2126
|
|
2127
2127
|
- parameters:
|
2128
2128
|
- ipaPath: Path to your IPA file. Optional if you use the _gym_ or _xcodebuild_ action
|
@@ -2137,6 +2137,10 @@ func copyArtifacts(keepOriginal: Bool = true,
|
|
2137
2137
|
- notifications: Crashlytics notification option (true/false)
|
2138
2138
|
- debug: Crashlytics debug option (true/false)
|
2139
2139
|
|
2140
|
+
Crashlytics Beta has been deprecated and replaced with Firebase App Distribution.
|
2141
|
+
Beta will continue working until May 4, 2020.
|
2142
|
+
Check out the [Firebase App Distribution docs](https://github.com/fastlane/fastlane-plugin-firebase_app_distribution) to get started.
|
2143
|
+
|
2140
2144
|
Additionally, you can specify `notes`, `emails`, `groups` and `notifications`.
|
2141
2145
|
Distributing to Groups: When using the `groups` parameter, it's important to use the group **alias** names for each group you'd like to distribute to. A group's alias can be found in the web UI. If you're viewing the Beta page, you can open the groups dialog by clicking the 'Manage Groups' button.
|
2142
2146
|
This action uses the `submit` binary provided by the Crashlytics framework. If the binary is not found in its usual path, you'll need to specify the path manually by using the `crashlytics_path` option.
|
@@ -2211,6 +2215,7 @@ func createAppOnManagedPlayStore(jsonKey: String? = nil,
|
|
2211
2215
|
- appVersion: Initial version number (e.g. '1.0')
|
2212
2216
|
- sku: SKU Number (e.g. '1234')
|
2213
2217
|
- platform: The platform to use (optional)
|
2218
|
+
- platforms: The platforms to use (optional)
|
2214
2219
|
- language: Primary Language (e.g. 'English', 'German')
|
2215
2220
|
- companyName: The name of your company. Only required if it's the first app you create
|
2216
2221
|
- skipItc: Skip the creation of the app on App Store Connect
|
@@ -2234,6 +2239,7 @@ func createAppOnline(username: String,
|
|
2234
2239
|
appVersion: String? = nil,
|
2235
2240
|
sku: String,
|
2236
2241
|
platform: String = "ios",
|
2242
|
+
platforms: [String]? = nil,
|
2237
2243
|
language: String = "English",
|
2238
2244
|
companyName: String? = nil,
|
2239
2245
|
skipItc: Bool = false,
|
@@ -2252,6 +2258,7 @@ func createAppOnline(username: String,
|
|
2252
2258
|
RubyCommand.Argument(name: "app_version", value: appVersion),
|
2253
2259
|
RubyCommand.Argument(name: "sku", value: sku),
|
2254
2260
|
RubyCommand.Argument(name: "platform", value: platform),
|
2261
|
+
RubyCommand.Argument(name: "platforms", value: platforms),
|
2255
2262
|
RubyCommand.Argument(name: "language", value: language),
|
2256
2263
|
RubyCommand.Argument(name: "company_name", value: companyName),
|
2257
2264
|
RubyCommand.Argument(name: "skip_itc", value: skipItc),
|
@@ -2312,6 +2319,7 @@ func createKeychain(name: String? = nil,
|
|
2312
2319
|
- repo: The name of the repository you want to submit the pull request to
|
2313
2320
|
- title: The title of the pull request
|
2314
2321
|
- body: The contents of the pull request
|
2322
|
+
- draft: Indicates whether the pull request is a draft
|
2315
2323
|
- labels: The labels for the pull request
|
2316
2324
|
- milestone: The milestone ID (Integer) for the pull request
|
2317
2325
|
- head: The name of the branch where your changes are implemented (defaults to the current branch name)
|
@@ -2327,6 +2335,7 @@ func createPullRequest(apiToken: String,
|
|
2327
2335
|
repo: String,
|
2328
2336
|
title: String,
|
2329
2337
|
body: String? = nil,
|
2338
|
+
draft: Bool? = nil,
|
2330
2339
|
labels: [String]? = nil,
|
2331
2340
|
milestone: String? = nil,
|
2332
2341
|
head: String? = nil,
|
@@ -2339,6 +2348,7 @@ func createPullRequest(apiToken: String,
|
|
2339
2348
|
RubyCommand.Argument(name: "repo", value: repo),
|
2340
2349
|
RubyCommand.Argument(name: "title", value: title),
|
2341
2350
|
RubyCommand.Argument(name: "body", value: body),
|
2351
|
+
RubyCommand.Argument(name: "draft", value: draft),
|
2342
2352
|
RubyCommand.Argument(name: "labels", value: labels),
|
2343
2353
|
RubyCommand.Argument(name: "milestone", value: milestone),
|
2344
2354
|
RubyCommand.Argument(name: "head", value: head),
|
@@ -2986,10 +2996,15 @@ func flock(message: String,
|
|
2986
2996
|
- forceDeviceType: Forces a given device type, useful for Mac screenshots, as their sizes vary
|
2987
2997
|
- useLegacyIphone5s: Use iPhone 5s instead of iPhone SE frames
|
2988
2998
|
- useLegacyIphone6s: Use iPhone 6s frames instead of iPhone 7 frames
|
2999
|
+
- useLegacyIphone7: Use iPhone 7 frames instead of iPhone 8 frames
|
2989
3000
|
- useLegacyIphonex: Use iPhone X instead of iPhone XS frames
|
3001
|
+
- useLegacyIphonexr: Use iPhone XR instead of iPhone 11 frames
|
3002
|
+
- useLegacyIphonexs: Use iPhone XS instead of iPhone 11 Pro frames
|
3003
|
+
- useLegacyIphonexsmax: Use iPhone XS Max instead of iPhone 11 Pro Max frames
|
2990
3004
|
- forceOrientationBlock: [Advanced] A block to customize your screenshots' device orientation
|
2991
3005
|
- debugMode: Output debug information in framed screenshots
|
2992
3006
|
- resume: Resume frameit instead of reprocessing all screenshots
|
3007
|
+
- usePlatform: Choose a platform, the valid options are IOS, ANDROID and ANY (IOS is default to ensure backward compatibility)
|
2993
3008
|
- path: The path to the directory containing the screenshots
|
2994
3009
|
|
2995
3010
|
Uses [frameit](https://docs.fastlane.tools/actions/frameit/) to prepare perfect screenshots for the App Store, your website, QA or emails.
|
@@ -3002,10 +3017,15 @@ func frameScreenshots(white: Bool? = nil,
|
|
3002
3017
|
forceDeviceType: String? = nil,
|
3003
3018
|
useLegacyIphone5s: Bool = false,
|
3004
3019
|
useLegacyIphone6s: Bool = false,
|
3020
|
+
useLegacyIphone7: Bool = false,
|
3005
3021
|
useLegacyIphonex: Bool = false,
|
3022
|
+
useLegacyIphonexr: Bool = false,
|
3023
|
+
useLegacyIphonexs: Bool = false,
|
3024
|
+
useLegacyIphonexsmax: Bool = false,
|
3006
3025
|
forceOrientationBlock: String? = nil,
|
3007
3026
|
debugMode: Bool = false,
|
3008
3027
|
resume: Bool = false,
|
3028
|
+
usePlatform: String = "IOS",
|
3009
3029
|
path: String = "./") {
|
3010
3030
|
let command = RubyCommand(commandID: "", methodName: "frame_screenshots", className: nil, args: [RubyCommand.Argument(name: "white", value: white),
|
3011
3031
|
RubyCommand.Argument(name: "silver", value: silver),
|
@@ -3014,10 +3034,15 @@ func frameScreenshots(white: Bool? = nil,
|
|
3014
3034
|
RubyCommand.Argument(name: "force_device_type", value: forceDeviceType),
|
3015
3035
|
RubyCommand.Argument(name: "use_legacy_iphone5s", value: useLegacyIphone5s),
|
3016
3036
|
RubyCommand.Argument(name: "use_legacy_iphone6s", value: useLegacyIphone6s),
|
3037
|
+
RubyCommand.Argument(name: "use_legacy_iphone7", value: useLegacyIphone7),
|
3017
3038
|
RubyCommand.Argument(name: "use_legacy_iphonex", value: useLegacyIphonex),
|
3039
|
+
RubyCommand.Argument(name: "use_legacy_iphonexr", value: useLegacyIphonexr),
|
3040
|
+
RubyCommand.Argument(name: "use_legacy_iphonexs", value: useLegacyIphonexs),
|
3041
|
+
RubyCommand.Argument(name: "use_legacy_iphonexsmax", value: useLegacyIphonexsmax),
|
3018
3042
|
RubyCommand.Argument(name: "force_orientation_block", value: forceOrientationBlock),
|
3019
3043
|
RubyCommand.Argument(name: "debug_mode", value: debugMode),
|
3020
3044
|
RubyCommand.Argument(name: "resume", value: resume),
|
3045
|
+
RubyCommand.Argument(name: "use_platform", value: usePlatform),
|
3021
3046
|
RubyCommand.Argument(name: "path", value: path)])
|
3022
3047
|
_ = runner.executeCommand(command)
|
3023
3048
|
}
|
@@ -3033,10 +3058,15 @@ func frameScreenshots(white: Bool? = nil,
|
|
3033
3058
|
- forceDeviceType: Forces a given device type, useful for Mac screenshots, as their sizes vary
|
3034
3059
|
- useLegacyIphone5s: Use iPhone 5s instead of iPhone SE frames
|
3035
3060
|
- useLegacyIphone6s: Use iPhone 6s frames instead of iPhone 7 frames
|
3061
|
+
- useLegacyIphone7: Use iPhone 7 frames instead of iPhone 8 frames
|
3036
3062
|
- useLegacyIphonex: Use iPhone X instead of iPhone XS frames
|
3063
|
+
- useLegacyIphonexr: Use iPhone XR instead of iPhone 11 frames
|
3064
|
+
- useLegacyIphonexs: Use iPhone XS instead of iPhone 11 Pro frames
|
3065
|
+
- useLegacyIphonexsmax: Use iPhone XS Max instead of iPhone 11 Pro Max frames
|
3037
3066
|
- forceOrientationBlock: [Advanced] A block to customize your screenshots' device orientation
|
3038
3067
|
- debugMode: Output debug information in framed screenshots
|
3039
3068
|
- resume: Resume frameit instead of reprocessing all screenshots
|
3069
|
+
- usePlatform: Choose a platform, the valid options are IOS, ANDROID and ANY (IOS is default to ensure backward compatibility)
|
3040
3070
|
- path: The path to the directory containing the screenshots
|
3041
3071
|
|
3042
3072
|
Uses [frameit](https://docs.fastlane.tools/actions/frameit/) to prepare perfect screenshots for the App Store, your website, QA or emails.
|
@@ -3049,10 +3079,15 @@ func frameit(white: Bool? = nil,
|
|
3049
3079
|
forceDeviceType: String? = nil,
|
3050
3080
|
useLegacyIphone5s: Bool = false,
|
3051
3081
|
useLegacyIphone6s: Bool = false,
|
3082
|
+
useLegacyIphone7: Bool = false,
|
3052
3083
|
useLegacyIphonex: Bool = false,
|
3084
|
+
useLegacyIphonexr: Bool = false,
|
3085
|
+
useLegacyIphonexs: Bool = false,
|
3086
|
+
useLegacyIphonexsmax: Bool = false,
|
3053
3087
|
forceOrientationBlock: String? = nil,
|
3054
3088
|
debugMode: Bool = false,
|
3055
3089
|
resume: Bool = false,
|
3090
|
+
usePlatform: String = "IOS",
|
3056
3091
|
path: String = "./") {
|
3057
3092
|
let command = RubyCommand(commandID: "", methodName: "frameit", className: nil, args: [RubyCommand.Argument(name: "white", value: white),
|
3058
3093
|
RubyCommand.Argument(name: "silver", value: silver),
|
@@ -3061,10 +3096,15 @@ func frameit(white: Bool? = nil,
|
|
3061
3096
|
RubyCommand.Argument(name: "force_device_type", value: forceDeviceType),
|
3062
3097
|
RubyCommand.Argument(name: "use_legacy_iphone5s", value: useLegacyIphone5s),
|
3063
3098
|
RubyCommand.Argument(name: "use_legacy_iphone6s", value: useLegacyIphone6s),
|
3099
|
+
RubyCommand.Argument(name: "use_legacy_iphone7", value: useLegacyIphone7),
|
3064
3100
|
RubyCommand.Argument(name: "use_legacy_iphonex", value: useLegacyIphonex),
|
3101
|
+
RubyCommand.Argument(name: "use_legacy_iphonexr", value: useLegacyIphonexr),
|
3102
|
+
RubyCommand.Argument(name: "use_legacy_iphonexs", value: useLegacyIphonexs),
|
3103
|
+
RubyCommand.Argument(name: "use_legacy_iphonexsmax", value: useLegacyIphonexsmax),
|
3065
3104
|
RubyCommand.Argument(name: "force_orientation_block", value: forceOrientationBlock),
|
3066
3105
|
RubyCommand.Argument(name: "debug_mode", value: debugMode),
|
3067
3106
|
RubyCommand.Argument(name: "resume", value: resume),
|
3107
|
+
RubyCommand.Argument(name: "use_platform", value: usePlatform),
|
3068
3108
|
RubyCommand.Argument(name: "path", value: path)])
|
3069
3109
|
_ = runner.executeCommand(command)
|
3070
3110
|
}
|
@@ -4444,6 +4484,10 @@ func makeChangelogFromJenkins(fallbackChangelog: String = "",
|
|
4444
4484
|
- googleCloudBucketName: Name of the Google Cloud Storage bucket to use
|
4445
4485
|
- googleCloudKeysFile: Path to the gc_keys.json file
|
4446
4486
|
- googleCloudProjectId: ID of the Google Cloud project to use for authentication
|
4487
|
+
- s3Region: Name of the S3 region
|
4488
|
+
- s3AccessKey: S3 access key
|
4489
|
+
- s3SecretAccessKey: S3 secret access key
|
4490
|
+
- s3Bucket: Name of the S3 bucket
|
4447
4491
|
- keychainName: Keychain the items should be imported to
|
4448
4492
|
- keychainPassword: This might be required the first time you access certificates on a new mac. For the login/default keychain this is your account password
|
4449
4493
|
- force: Renew the provisioning profiles every time you run match
|
@@ -4478,6 +4522,10 @@ func match(type: Any = matchfile.type,
|
|
4478
4522
|
googleCloudBucketName: Any? = matchfile.googleCloudBucketName,
|
4479
4523
|
googleCloudKeysFile: Any? = matchfile.googleCloudKeysFile,
|
4480
4524
|
googleCloudProjectId: Any? = matchfile.googleCloudProjectId,
|
4525
|
+
s3Region: Any? = matchfile.s3Region,
|
4526
|
+
s3AccessKey: Any? = matchfile.s3AccessKey,
|
4527
|
+
s3SecretAccessKey: Any? = matchfile.s3SecretAccessKey,
|
4528
|
+
s3Bucket: Any? = matchfile.s3Bucket,
|
4481
4529
|
keychainName: Any = matchfile.keychainName,
|
4482
4530
|
keychainPassword: Any? = matchfile.keychainPassword,
|
4483
4531
|
force: Bool = matchfile.force,
|
@@ -4509,6 +4557,10 @@ func match(type: Any = matchfile.type,
|
|
4509
4557
|
RubyCommand.Argument(name: "google_cloud_bucket_name", value: googleCloudBucketName),
|
4510
4558
|
RubyCommand.Argument(name: "google_cloud_keys_file", value: googleCloudKeysFile),
|
4511
4559
|
RubyCommand.Argument(name: "google_cloud_project_id", value: googleCloudProjectId),
|
4560
|
+
RubyCommand.Argument(name: "s3_region", value: s3Region),
|
4561
|
+
RubyCommand.Argument(name: "s3_access_key", value: s3AccessKey),
|
4562
|
+
RubyCommand.Argument(name: "s3_secret_access_key", value: s3SecretAccessKey),
|
4563
|
+
RubyCommand.Argument(name: "s3_bucket", value: s3Bucket),
|
4512
4564
|
RubyCommand.Argument(name: "keychain_name", value: keychainName),
|
4513
4565
|
RubyCommand.Argument(name: "keychain_password", value: keychainPassword),
|
4514
4566
|
RubyCommand.Argument(name: "force", value: force),
|
@@ -4910,6 +4962,8 @@ func pem(development: Bool = false,
|
|
4910
4962
|
- usesNonExemptEncryption: Provide the 'Uses Non-Exempt Encryption' for export compliance. This is used if there is 'ITSAppUsesNonExemptEncryption' is not set in the Info.plist
|
4911
4963
|
- distributeExternal: Should the build be distributed to external testers?
|
4912
4964
|
- notifyExternalTesters: Should notify external testers?
|
4965
|
+
- appVersion: 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
|
4966
|
+
- buildNumber: The build number of the application build to distribute. If the build number is not specified, the most recent build is distributed
|
4913
4967
|
- firstName: The tester's first name
|
4914
4968
|
- lastName: The tester's last name
|
4915
4969
|
- email: The tester's email
|
@@ -4944,6 +4998,8 @@ func pilot(username: String,
|
|
4944
4998
|
usesNonExemptEncryption: Bool = false,
|
4945
4999
|
distributeExternal: Bool = false,
|
4946
5000
|
notifyExternalTesters: Bool = true,
|
5001
|
+
appVersion: String? = nil,
|
5002
|
+
buildNumber: String? = nil,
|
4947
5003
|
firstName: String? = nil,
|
4948
5004
|
lastName: String? = nil,
|
4949
5005
|
email: String? = nil,
|
@@ -4974,6 +5030,8 @@ func pilot(username: String,
|
|
4974
5030
|
RubyCommand.Argument(name: "uses_non_exempt_encryption", value: usesNonExemptEncryption),
|
4975
5031
|
RubyCommand.Argument(name: "distribute_external", value: distributeExternal),
|
4976
5032
|
RubyCommand.Argument(name: "notify_external_testers", value: notifyExternalTesters),
|
5033
|
+
RubyCommand.Argument(name: "app_version", value: appVersion),
|
5034
|
+
RubyCommand.Argument(name: "build_number", value: buildNumber),
|
4977
5035
|
RubyCommand.Argument(name: "first_name", value: firstName),
|
4978
5036
|
RubyCommand.Argument(name: "last_name", value: lastName),
|
4979
5037
|
RubyCommand.Argument(name: "email", value: email),
|
@@ -5029,6 +5087,7 @@ func pluginScores(outputPath: String,
|
|
5029
5087
|
- platforms: Lint against specific platforms (defaults to all platforms supported by the podspec). Multiple platforms must be comma-delimited (available since cocoapods >= 1.6)
|
5030
5088
|
- skipImportValidation: Lint skips validating that the pod can be imported (available since cocoapods >= 1.3)
|
5031
5089
|
- skipTests: Lint skips building and running tests during validation (available since cocoapods >= 1.3)
|
5090
|
+
- analyze: Validate with the Xcode Static Analysis tool (available since cocoapods >= 1.6.1)
|
5032
5091
|
|
5033
5092
|
Test the syntax of your Podfile by linting the pod against the files of its directory
|
5034
5093
|
*/
|
@@ -5050,7 +5109,8 @@ func podLibLint(useBundleExec: Bool = true,
|
|
5050
5109
|
noSubspecs: Bool = false,
|
5051
5110
|
platforms: String? = nil,
|
5052
5111
|
skipImportValidation: Bool = false,
|
5053
|
-
skipTests: Bool = false
|
5112
|
+
skipTests: Bool = false,
|
5113
|
+
analyze: Bool = false) {
|
5054
5114
|
let command = RubyCommand(commandID: "", methodName: "pod_lib_lint", className: nil, args: [RubyCommand.Argument(name: "use_bundle_exec", value: useBundleExec),
|
5055
5115
|
RubyCommand.Argument(name: "podspec", value: podspec),
|
5056
5116
|
RubyCommand.Argument(name: "verbose", value: verbose),
|
@@ -5069,7 +5129,8 @@ func podLibLint(useBundleExec: Bool = true,
|
|
5069
5129
|
RubyCommand.Argument(name: "no_subspecs", value: noSubspecs),
|
5070
5130
|
RubyCommand.Argument(name: "platforms", value: platforms),
|
5071
5131
|
RubyCommand.Argument(name: "skip_import_validation", value: skipImportValidation),
|
5072
|
-
RubyCommand.Argument(name: "skip_tests", value: skipTests)
|
5132
|
+
RubyCommand.Argument(name: "skip_tests", value: skipTests),
|
5133
|
+
RubyCommand.Argument(name: "analyze", value: analyze)])
|
5073
5134
|
_ = runner.executeCommand(command)
|
5074
5135
|
}
|
5075
5136
|
|
@@ -5201,6 +5262,7 @@ func println(message: String? = nil) {
|
|
5201
5262
|
- appVersion: Initial version number (e.g. '1.0')
|
5202
5263
|
- sku: SKU Number (e.g. '1234')
|
5203
5264
|
- platform: The platform to use (optional)
|
5265
|
+
- platforms: The platforms to use (optional)
|
5204
5266
|
- language: Primary Language (e.g. 'English', 'German')
|
5205
5267
|
- companyName: The name of your company. Only required if it's the first app you create
|
5206
5268
|
- skipItc: Skip the creation of the app on App Store Connect
|
@@ -5224,6 +5286,7 @@ func produce(username: String,
|
|
5224
5286
|
appVersion: String? = nil,
|
5225
5287
|
sku: String,
|
5226
5288
|
platform: String = "ios",
|
5289
|
+
platforms: [String]? = nil,
|
5227
5290
|
language: String = "English",
|
5228
5291
|
companyName: String? = nil,
|
5229
5292
|
skipItc: Bool = false,
|
@@ -5242,6 +5305,7 @@ func produce(username: String,
|
|
5242
5305
|
RubyCommand.Argument(name: "app_version", value: appVersion),
|
5243
5306
|
RubyCommand.Argument(name: "sku", value: sku),
|
5244
5307
|
RubyCommand.Argument(name: "platform", value: platform),
|
5308
|
+
RubyCommand.Argument(name: "platforms", value: platforms),
|
5245
5309
|
RubyCommand.Argument(name: "language", value: language),
|
5246
5310
|
RubyCommand.Argument(name: "company_name", value: companyName),
|
5247
5311
|
RubyCommand.Argument(name: "skip_itc", value: skipItc),
|
@@ -5598,6 +5662,7 @@ func rubyVersion() {
|
|
5598
5662
|
- appIdentifier: The bundle identifier of the app to uninstall (only needed when enabling reinstall_app)
|
5599
5663
|
- onlyTesting: Array of strings matching Test Bundle/Test Suite/Test Cases to run
|
5600
5664
|
- skipTesting: Array of strings matching Test Bundle/Test Suite/Test Cases to skip
|
5665
|
+
- testplan: The testplan associated with the scheme that should be used for testing
|
5601
5666
|
- xctestrun: Run tests using the provided `.xctestrun` file
|
5602
5667
|
- toolchain: The toolchain that should be used for building the application (e.g. `com.apple.dt.toolchain.Swift_2_3, org.swift.30p620160816a`)
|
5603
5668
|
- clean: Should the project be cleaned before building it?
|
@@ -5660,6 +5725,7 @@ func runTests(workspace: String? = nil,
|
|
5660
5725
|
appIdentifier: String? = nil,
|
5661
5726
|
onlyTesting: Any? = nil,
|
5662
5727
|
skipTesting: Any? = nil,
|
5728
|
+
testplan: String? = nil,
|
5663
5729
|
xctestrun: String? = nil,
|
5664
5730
|
toolchain: Any? = nil,
|
5665
5731
|
clean: Bool = false,
|
@@ -5719,6 +5785,7 @@ func runTests(workspace: String? = nil,
|
|
5719
5785
|
RubyCommand.Argument(name: "app_identifier", value: appIdentifier),
|
5720
5786
|
RubyCommand.Argument(name: "only_testing", value: onlyTesting),
|
5721
5787
|
RubyCommand.Argument(name: "skip_testing", value: skipTesting),
|
5788
|
+
RubyCommand.Argument(name: "testplan", value: testplan),
|
5722
5789
|
RubyCommand.Argument(name: "xctestrun", value: xctestrun),
|
5723
5790
|
RubyCommand.Argument(name: "toolchain", value: toolchain),
|
5724
5791
|
RubyCommand.Argument(name: "clean", value: clean),
|
@@ -5859,6 +5926,7 @@ func say(text: Any,
|
|
5859
5926
|
- appIdentifier: The bundle identifier of the app to uninstall (only needed when enabling reinstall_app)
|
5860
5927
|
- onlyTesting: Array of strings matching Test Bundle/Test Suite/Test Cases to run
|
5861
5928
|
- skipTesting: Array of strings matching Test Bundle/Test Suite/Test Cases to skip
|
5929
|
+
- testplan: The testplan associated with the scheme that should be used for testing
|
5862
5930
|
- xctestrun: Run tests using the provided `.xctestrun` file
|
5863
5931
|
- toolchain: The toolchain that should be used for building the application (e.g. `com.apple.dt.toolchain.Swift_2_3, org.swift.30p620160816a`)
|
5864
5932
|
- clean: Should the project be cleaned before building it?
|
@@ -5921,6 +5989,7 @@ func scan(workspace: Any? = scanfile.workspace,
|
|
5921
5989
|
appIdentifier: Any? = scanfile.appIdentifier,
|
5922
5990
|
onlyTesting: Any? = scanfile.onlyTesting,
|
5923
5991
|
skipTesting: Any? = scanfile.skipTesting,
|
5992
|
+
testplan: Any? = scanfile.testplan,
|
5924
5993
|
xctestrun: Any? = scanfile.xctestrun,
|
5925
5994
|
toolchain: Any? = scanfile.toolchain,
|
5926
5995
|
clean: Bool = scanfile.clean,
|
@@ -5980,6 +6049,7 @@ func scan(workspace: Any? = scanfile.workspace,
|
|
5980
6049
|
RubyCommand.Argument(name: "app_identifier", value: appIdentifier),
|
5981
6050
|
RubyCommand.Argument(name: "only_testing", value: onlyTesting),
|
5982
6051
|
RubyCommand.Argument(name: "skip_testing", value: skipTesting),
|
6052
|
+
RubyCommand.Argument(name: "testplan", value: testplan),
|
5983
6053
|
RubyCommand.Argument(name: "xctestrun", value: xctestrun),
|
5984
6054
|
RubyCommand.Argument(name: "toolchain", value: toolchain),
|
5985
6055
|
RubyCommand.Argument(name: "clean", value: clean),
|
@@ -6283,7 +6353,7 @@ func setPodKey(useBundleExec: Bool = true,
|
|
6283
6353
|
This action helps with CI integration. Add this to the top of your Fastfile if you use CI.
|
6284
6354
|
*/
|
6285
6355
|
func setupCi(force: Bool = false,
|
6286
|
-
provider:
|
6356
|
+
provider: String? = nil) {
|
6287
6357
|
let command = RubyCommand(commandID: "", methodName: "setup_ci", className: nil, args: [RubyCommand.Argument(name: "force", value: force),
|
6288
6358
|
RubyCommand.Argument(name: "provider", value: provider)])
|
6289
6359
|
_ = runner.executeCommand(command)
|
@@ -6322,13 +6392,16 @@ func setupCircleCi(force: Bool = false) {
|
|
6322
6392
|
- resultBundle: Produce the result bundle describing what occurred will be placed
|
6323
6393
|
|
6324
6394
|
- Adds and unlocks keychains from Jenkins 'Keychains and Provisioning Profiles Plugin'|
|
6395
|
+
- Sets unlocked keychain to be used by Match|
|
6325
6396
|
- Sets code signing identity from Jenkins 'Keychains and Provisioning Profiles Plugin'|
|
6326
6397
|
- Sets output directory to './output' (gym, scan and backup_xcarchive)|
|
6327
6398
|
- Sets derived data path to './derivedData' (xcodebuild, gym, scan and clear_derived_data, carthage)|
|
6328
6399
|
- Produce result bundle (gym and scan)|
|
6329
6400
|
>|
|
6330
6401
|
This action helps with Jenkins integration. Creates own derived data for each job. All build results like IPA files and archives will be stored in the `./output` directory.
|
6331
|
-
The action also works with [Keychains and Provisioning Profiles Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Keychains+and+Provisioning+Profiles+Plugin), the selected keychain will be automatically unlocked and the selected code signing identity will be used.
|
6402
|
+
The action also works with [Keychains and Provisioning Profiles Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Keychains+and+Provisioning+Profiles+Plugin), the selected keychain will be automatically unlocked and the selected code signing identity will be used.
|
6403
|
+
[Match](https://docs.fastlane.tools/actions/match/) will be also set up to use the unlocked keychain and set in read-only mode, if its environment variables were not yet defined.
|
6404
|
+
By default this action will only work when _fastlane_ is executed on a CI system.
|
6332
6405
|
*/
|
6333
6406
|
func setupJenkins(force: Bool = false,
|
6334
6407
|
unlockKeychain: Bool = true,
|
@@ -6619,7 +6692,7 @@ func slather(buildDirectory: String? = nil,
|
|
6619
6692
|
show: Bool = false,
|
6620
6693
|
sourceDirectory: String? = nil,
|
6621
6694
|
outputDirectory: String? = nil,
|
6622
|
-
ignore:
|
6695
|
+
ignore: [String]? = nil,
|
6623
6696
|
verbose: Bool? = nil,
|
6624
6697
|
useBundleExec: Bool = false,
|
6625
6698
|
binaryBasename: Bool = false,
|
@@ -7081,6 +7154,7 @@ func supply(packageName: String,
|
|
7081
7154
|
- quiet: Don't print status logs like 'Linting <file>' & 'Done linting'
|
7082
7155
|
- executable: Path to the `swiftlint` executable on your machine
|
7083
7156
|
- format: Format code when mode is :autocorrect
|
7157
|
+
- noCache: Ignore the cache when mode is :autocorrect or :lint
|
7084
7158
|
- compilerLogPath: Compiler log path when mode is :analyze
|
7085
7159
|
*/
|
7086
7160
|
func swiftlint(mode: Any = "lint",
|
@@ -7095,6 +7169,7 @@ func swiftlint(mode: Any = "lint",
|
|
7095
7169
|
quiet: Bool = false,
|
7096
7170
|
executable: String? = nil,
|
7097
7171
|
format: Bool = false,
|
7172
|
+
noCache: Bool = false,
|
7098
7173
|
compilerLogPath: String? = nil) {
|
7099
7174
|
let command = RubyCommand(commandID: "", methodName: "swiftlint", className: nil, args: [RubyCommand.Argument(name: "mode", value: mode),
|
7100
7175
|
RubyCommand.Argument(name: "path", value: path),
|
@@ -7108,6 +7183,7 @@ func swiftlint(mode: Any = "lint",
|
|
7108
7183
|
RubyCommand.Argument(name: "quiet", value: quiet),
|
7109
7184
|
RubyCommand.Argument(name: "executable", value: executable),
|
7110
7185
|
RubyCommand.Argument(name: "format", value: format),
|
7186
|
+
RubyCommand.Argument(name: "no_cache", value: noCache),
|
7111
7187
|
RubyCommand.Argument(name: "compiler_log_path", value: compilerLogPath)])
|
7112
7188
|
_ = runner.executeCommand(command)
|
7113
7189
|
}
|
@@ -7137,6 +7213,10 @@ func swiftlint(mode: Any = "lint",
|
|
7137
7213
|
- googleCloudBucketName: Name of the Google Cloud Storage bucket to use
|
7138
7214
|
- googleCloudKeysFile: Path to the gc_keys.json file
|
7139
7215
|
- googleCloudProjectId: ID of the Google Cloud project to use for authentication
|
7216
|
+
- s3Region: Name of the S3 region
|
7217
|
+
- s3AccessKey: S3 access key
|
7218
|
+
- s3SecretAccessKey: S3 secret access key
|
7219
|
+
- s3Bucket: Name of the S3 bucket
|
7140
7220
|
- keychainName: Keychain the items should be imported to
|
7141
7221
|
- keychainPassword: This might be required the first time you access certificates on a new mac. For the login/default keychain this is your account password
|
7142
7222
|
- force: Renew the provisioning profiles every time you run match
|
@@ -7171,6 +7251,10 @@ func syncCodeSigning(type: String = "development",
|
|
7171
7251
|
googleCloudBucketName: String? = nil,
|
7172
7252
|
googleCloudKeysFile: String? = nil,
|
7173
7253
|
googleCloudProjectId: String? = nil,
|
7254
|
+
s3Region: String? = nil,
|
7255
|
+
s3AccessKey: String? = nil,
|
7256
|
+
s3SecretAccessKey: String? = nil,
|
7257
|
+
s3Bucket: String? = nil,
|
7174
7258
|
keychainName: String = "login.keychain",
|
7175
7259
|
keychainPassword: String? = nil,
|
7176
7260
|
force: Bool = false,
|
@@ -7202,6 +7286,10 @@ func syncCodeSigning(type: String = "development",
|
|
7202
7286
|
RubyCommand.Argument(name: "google_cloud_bucket_name", value: googleCloudBucketName),
|
7203
7287
|
RubyCommand.Argument(name: "google_cloud_keys_file", value: googleCloudKeysFile),
|
7204
7288
|
RubyCommand.Argument(name: "google_cloud_project_id", value: googleCloudProjectId),
|
7289
|
+
RubyCommand.Argument(name: "s3_region", value: s3Region),
|
7290
|
+
RubyCommand.Argument(name: "s3_access_key", value: s3AccessKey),
|
7291
|
+
RubyCommand.Argument(name: "s3_secret_access_key", value: s3SecretAccessKey),
|
7292
|
+
RubyCommand.Argument(name: "s3_bucket", value: s3Bucket),
|
7205
7293
|
RubyCommand.Argument(name: "keychain_name", value: keychainName),
|
7206
7294
|
RubyCommand.Argument(name: "keychain_password", value: keychainPassword),
|
7207
7295
|
RubyCommand.Argument(name: "force", value: force),
|
@@ -7302,6 +7390,8 @@ func testfairy(apiKey: String,
|
|
7302
7390
|
- usesNonExemptEncryption: Provide the 'Uses Non-Exempt Encryption' for export compliance. This is used if there is 'ITSAppUsesNonExemptEncryption' is not set in the Info.plist
|
7303
7391
|
- distributeExternal: Should the build be distributed to external testers?
|
7304
7392
|
- notifyExternalTesters: Should notify external testers?
|
7393
|
+
- appVersion: 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
|
7394
|
+
- buildNumber: The build number of the application build to distribute. If the build number is not specified, the most recent build is distributed
|
7305
7395
|
- firstName: The tester's first name
|
7306
7396
|
- lastName: The tester's last name
|
7307
7397
|
- email: The tester's email
|
@@ -7336,6 +7426,8 @@ func testflight(username: String,
|
|
7336
7426
|
usesNonExemptEncryption: Bool = false,
|
7337
7427
|
distributeExternal: Bool = false,
|
7338
7428
|
notifyExternalTesters: Bool = true,
|
7429
|
+
appVersion: String? = nil,
|
7430
|
+
buildNumber: String? = nil,
|
7339
7431
|
firstName: String? = nil,
|
7340
7432
|
lastName: String? = nil,
|
7341
7433
|
email: String? = nil,
|
@@ -7366,6 +7458,8 @@ func testflight(username: String,
|
|
7366
7458
|
RubyCommand.Argument(name: "uses_non_exempt_encryption", value: usesNonExemptEncryption),
|
7367
7459
|
RubyCommand.Argument(name: "distribute_external", value: distributeExternal),
|
7368
7460
|
RubyCommand.Argument(name: "notify_external_testers", value: notifyExternalTesters),
|
7461
|
+
RubyCommand.Argument(name: "app_version", value: appVersion),
|
7462
|
+
RubyCommand.Argument(name: "build_number", value: buildNumber),
|
7369
7463
|
RubyCommand.Argument(name: "first_name", value: firstName),
|
7370
7464
|
RubyCommand.Argument(name: "last_name", value: lastName),
|
7371
7465
|
RubyCommand.Argument(name: "email", value: email),
|
@@ -7503,6 +7597,45 @@ func updateAppIdentifier(xcodeproj: String,
|
|
7503
7597
|
_ = runner.executeCommand(command)
|
7504
7598
|
}
|
7505
7599
|
|
7600
|
+
/**
|
7601
|
+
Configures Xcode's Codesigning options
|
7602
|
+
|
7603
|
+
- parameters:
|
7604
|
+
- path: Path to your Xcode project
|
7605
|
+
- useAutomaticSigning: Defines if project should use automatic signing
|
7606
|
+
- teamId: Team ID, is used when upgrading project
|
7607
|
+
- targets: Specify targets you want to toggle the signing mech. (default to all targets)
|
7608
|
+
- buildConfigurations: Specify build_configurations you want to toggle the signing mech. (default to all targets)
|
7609
|
+
- codeSignIdentity: Code signing identity type (iPhone Developer, iPhone Distribution)
|
7610
|
+
- profileName: Provisioning profile name to use for code signing
|
7611
|
+
- profileUuid: Provisioning profile UUID to use for code signing
|
7612
|
+
- bundleIdentifier: Application Product Bundle Identifier
|
7613
|
+
|
7614
|
+
- returns: The current status (boolean) of codesigning after modification
|
7615
|
+
|
7616
|
+
Configures Xcode's Codesigning options of all targets in the project
|
7617
|
+
*/
|
7618
|
+
func updateCodeSigningSettings(path: String,
|
7619
|
+
useAutomaticSigning: Bool = false,
|
7620
|
+
teamId: String? = nil,
|
7621
|
+
targets: [String]? = nil,
|
7622
|
+
buildConfigurations: [String]? = nil,
|
7623
|
+
codeSignIdentity: String? = nil,
|
7624
|
+
profileName: String? = nil,
|
7625
|
+
profileUuid: String? = nil,
|
7626
|
+
bundleIdentifier: String? = nil) {
|
7627
|
+
let command = RubyCommand(commandID: "", methodName: "update_code_signing_settings", className: nil, args: [RubyCommand.Argument(name: "path", value: path),
|
7628
|
+
RubyCommand.Argument(name: "use_automatic_signing", value: useAutomaticSigning),
|
7629
|
+
RubyCommand.Argument(name: "team_id", value: teamId),
|
7630
|
+
RubyCommand.Argument(name: "targets", value: targets),
|
7631
|
+
RubyCommand.Argument(name: "build_configurations", value: buildConfigurations),
|
7632
|
+
RubyCommand.Argument(name: "code_sign_identity", value: codeSignIdentity),
|
7633
|
+
RubyCommand.Argument(name: "profile_name", value: profileName),
|
7634
|
+
RubyCommand.Argument(name: "profile_uuid", value: profileUuid),
|
7635
|
+
RubyCommand.Argument(name: "bundle_identifier", value: bundleIdentifier)])
|
7636
|
+
_ = runner.executeCommand(command)
|
7637
|
+
}
|
7638
|
+
|
7506
7639
|
/**
|
7507
7640
|
Makes sure fastlane-tools are up-to-date when running fastlane
|
7508
7641
|
|
@@ -8163,6 +8296,8 @@ func uploadToPlayStoreInternalAppSharing(packageName: String,
|
|
8163
8296
|
- usesNonExemptEncryption: Provide the 'Uses Non-Exempt Encryption' for export compliance. This is used if there is 'ITSAppUsesNonExemptEncryption' is not set in the Info.plist
|
8164
8297
|
- distributeExternal: Should the build be distributed to external testers?
|
8165
8298
|
- notifyExternalTesters: Should notify external testers?
|
8299
|
+
- appVersion: 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
|
8300
|
+
- buildNumber: The build number of the application build to distribute. If the build number is not specified, the most recent build is distributed
|
8166
8301
|
- firstName: The tester's first name
|
8167
8302
|
- lastName: The tester's last name
|
8168
8303
|
- email: The tester's email
|
@@ -8197,6 +8332,8 @@ func uploadToTestflight(username: String,
|
|
8197
8332
|
usesNonExemptEncryption: Bool = false,
|
8198
8333
|
distributeExternal: Bool = false,
|
8199
8334
|
notifyExternalTesters: Bool = true,
|
8335
|
+
appVersion: String? = nil,
|
8336
|
+
buildNumber: String? = nil,
|
8200
8337
|
firstName: String? = nil,
|
8201
8338
|
lastName: String? = nil,
|
8202
8339
|
email: String? = nil,
|
@@ -8227,6 +8364,8 @@ func uploadToTestflight(username: String,
|
|
8227
8364
|
RubyCommand.Argument(name: "uses_non_exempt_encryption", value: usesNonExemptEncryption),
|
8228
8365
|
RubyCommand.Argument(name: "distribute_external", value: distributeExternal),
|
8229
8366
|
RubyCommand.Argument(name: "notify_external_testers", value: notifyExternalTesters),
|
8367
|
+
RubyCommand.Argument(name: "app_version", value: appVersion),
|
8368
|
+
RubyCommand.Argument(name: "build_number", value: buildNumber),
|
8230
8369
|
RubyCommand.Argument(name: "first_name", value: firstName),
|
8231
8370
|
RubyCommand.Argument(name: "last_name", value: lastName),
|
8232
8371
|
RubyCommand.Argument(name: "email", value: email),
|
@@ -8536,7 +8675,7 @@ func xcov(workspace: String? = nil,
|
|
8536
8675
|
coverallsServiceJobId: String? = nil,
|
8537
8676
|
coverallsRepoToken: String? = nil,
|
8538
8677
|
xcconfig: String? = nil,
|
8539
|
-
ideFoundationPath: String = "/Applications/Xcode-11.
|
8678
|
+
ideFoundationPath: String = "/Applications/Xcode-11.4.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
|
8540
8679
|
legacySupport: Bool = false) {
|
8541
8680
|
let command = RubyCommand(commandID: "", methodName: "xcov", className: nil, args: [RubyCommand.Argument(name: "workspace", value: workspace),
|
8542
8681
|
RubyCommand.Argument(name: "project", value: project),
|
@@ -8681,4 +8820,4 @@ let snapshotfile: Snapshotfile = Snapshotfile()
|
|
8681
8820
|
|
8682
8821
|
// Please don't remove the lines below
|
8683
8822
|
// They are used to detect outdated files
|
8684
|
-
// FastlaneRunnerAPIVersion [0.9.
|
8823
|
+
// FastlaneRunnerAPIVersion [0.9.74]
|