fastlane 2.119.0.beta.20190322200024 → 2.119.0.beta.20190323200019
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/deliver/lib/deliver/app_screenshot.rb +22 -15
- data/deliver/lib/deliver/options.rb +1 -1
- data/deliver/lib/deliver/runner.rb +20 -1
- data/deliver/lib/deliver/upload_screenshots.rb +3 -3
- data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +3 -0
- data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +3 -0
- data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +1 -1
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +56 -2
- data/frameit/lib/frameit/offsets.rb +5 -6
- data/pilot/lib/pilot/build_manager.rb +20 -1
- data/pilot/lib/pilot/options.rb +1 -1
- data/screengrab/lib/screengrab/runner.rb +22 -8
- data/spaceship/README.md +5 -19
- data/spaceship/lib/spaceship/tunes/device_type.rb +27 -1
- metadata +14 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 00f9fa9bd7eb8220d067769a4379a73604cd9034
|
4
|
+
data.tar.gz: b94cd6409e2a6c2f5f05fed2401b5b07e4fd5fb1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a4f4f70c1c40a6f597c12fb0c64df16dc0d44c7cd5baebb530796d843b2c73e72e34668ce106b97af20e59f819e32febedd9dca8241a1674d5079657528e33c
|
7
|
+
data.tar.gz: d1af8896830579581e945a7c174079f9f4b9eb8863e5ac27cbaac359c8ef0cdbd58479f25e0f88686beb755781709c10a688ec906840769b9534cb2531626ae6
|
@@ -6,14 +6,15 @@ module Deliver
|
|
6
6
|
# AppScreenshot represents one screenshots for one specific locale and
|
7
7
|
# device type.
|
8
8
|
class AppScreenshot
|
9
|
+
#
|
9
10
|
module ScreenSize
|
10
11
|
# iPhone 4
|
11
12
|
IOS_35 = "iOS-3.5-in"
|
12
13
|
# iPhone 5
|
13
14
|
IOS_40 = "iOS-4-in"
|
14
|
-
# iPhone 6
|
15
|
+
# iPhone 6, 7, & 8
|
15
16
|
IOS_47 = "iOS-4.7-in"
|
16
|
-
# iPhone 6 Plus
|
17
|
+
# iPhone 6 Plus, 7 Plus, & 8 Plus
|
17
18
|
IOS_55 = "iOS-5.5-in"
|
18
19
|
# iPhone XS
|
19
20
|
IOS_58 = "iOS-5.8-in"
|
@@ -21,6 +22,7 @@ module Deliver
|
|
21
22
|
IOS_61 = "iOS-6.1-in"
|
22
23
|
# iPhone XS Max
|
23
24
|
IOS_65 = "iOS-6.5-in"
|
25
|
+
|
24
26
|
# iPad
|
25
27
|
IOS_IPAD = "iOS-iPad"
|
26
28
|
# iPad 10.5
|
@@ -29,11 +31,12 @@ module Deliver
|
|
29
31
|
IOS_IPAD_11 = "iOS-iPad-11"
|
30
32
|
# iPad Pro
|
31
33
|
IOS_IPAD_PRO = "iOS-iPad-Pro"
|
34
|
+
|
32
35
|
# iPhone 5 iMessage
|
33
36
|
IOS_40_MESSAGES = "iOS-4-in-messages"
|
34
|
-
# iPhone 6 iMessage
|
37
|
+
# iPhone 6, 7, & 8 iMessage
|
35
38
|
IOS_47_MESSAGES = "iOS-4.7-in-messages"
|
36
|
-
# iPhone 6 Plus iMessage
|
39
|
+
# iPhone 6 Plus, 7 Plus, & 8 Plus iMessage
|
37
40
|
IOS_55_MESSAGES = "iOS-5.5-in-messages"
|
38
41
|
# iPhone XS iMessage
|
39
42
|
IOS_58_MESSAGES = "iOS-5.8-in-messages"
|
@@ -41,6 +44,7 @@ module Deliver
|
|
41
44
|
IOS_61_MESSAGES = "iOS-6.1-in-messages"
|
42
45
|
# iPhone XS Max iMessage
|
43
46
|
IOS_65_MESSAGES = "iOS-6.5-in-messages"
|
47
|
+
|
44
48
|
# iPad iMessage
|
45
49
|
IOS_IPAD_MESSAGES = "iOS-iPad-messages"
|
46
50
|
# iPad 10.5 iMessage
|
@@ -49,14 +53,17 @@ module Deliver
|
|
49
53
|
IOS_IPAD_11_MESSAGES = "iOS-11-messages"
|
50
54
|
# iPad Pro iMessage
|
51
55
|
IOS_IPAD_PRO_MESSAGES = "iOS-iPad-Pro-messages"
|
56
|
+
|
52
57
|
# Apple Watch
|
53
58
|
IOS_APPLE_WATCH = "iOS-Apple-Watch"
|
54
59
|
# Apple Watch Series 4
|
55
60
|
IOS_APPLE_WATCH_SERIES4 = "iOS-Apple-Watch-Series4"
|
56
|
-
|
57
|
-
MAC = "Mac"
|
61
|
+
|
58
62
|
# Apple TV
|
59
63
|
APPLE_TV = "Apple-TV"
|
64
|
+
|
65
|
+
# Mac
|
66
|
+
MAC = "Mac"
|
60
67
|
end
|
61
68
|
|
62
69
|
# @return [Deliver::ScreenSize] the screen size (device type)
|
@@ -68,7 +75,7 @@ module Deliver
|
|
68
75
|
attr_accessor :language
|
69
76
|
|
70
77
|
# @param path (String) path to the screenshot file
|
71
|
-
# @param
|
78
|
+
# @param language (String) Language of this screenshot (e.g. English)
|
72
79
|
# @param screen_size (Deliver::AppScreenshot::ScreenSize) the screen size, which
|
73
80
|
# will automatically be calculated when you don't set it.
|
74
81
|
def initialize(path, language, screen_size = nil)
|
@@ -88,8 +95,8 @@ module Deliver
|
|
88
95
|
matching = {
|
89
96
|
ScreenSize::IOS_35 => "iphone35",
|
90
97
|
ScreenSize::IOS_40 => "iphone4",
|
91
|
-
ScreenSize::IOS_47 => "iphone6",
|
92
|
-
ScreenSize::IOS_55 => "iphone6Plus",
|
98
|
+
ScreenSize::IOS_47 => "iphone6", # also 7 and 8
|
99
|
+
ScreenSize::IOS_55 => "iphone6Plus", # also 7 Plus & 8 Plus
|
93
100
|
ScreenSize::IOS_58 => "iphone58",
|
94
101
|
ScreenSize::IOS_65 => "iphone65",
|
95
102
|
ScreenSize::IOS_IPAD => "ipad",
|
@@ -97,8 +104,8 @@ module Deliver
|
|
97
104
|
ScreenSize::IOS_IPAD_11 => "ipadPro11",
|
98
105
|
ScreenSize::IOS_IPAD_PRO => "ipadPro",
|
99
106
|
ScreenSize::IOS_40_MESSAGES => "iphone4",
|
100
|
-
ScreenSize::IOS_47_MESSAGES => "iphone6",
|
101
|
-
ScreenSize::IOS_55_MESSAGES => "iphone6Plus",
|
107
|
+
ScreenSize::IOS_47_MESSAGES => "iphone6", # also 7 & 8
|
108
|
+
ScreenSize::IOS_55_MESSAGES => "iphone6Plus", # also 7 Plus & 8 Plus
|
102
109
|
ScreenSize::IOS_58_MESSAGES => "iphone58",
|
103
110
|
ScreenSize::IOS_65_MESSAGES => "iphone65",
|
104
111
|
ScreenSize::IOS_IPAD_MESSAGES => "ipad",
|
@@ -120,8 +127,8 @@ module Deliver
|
|
120
127
|
matching = {
|
121
128
|
ScreenSize::IOS_35 => "iPhone 4",
|
122
129
|
ScreenSize::IOS_40 => "iPhone 5",
|
123
|
-
ScreenSize::IOS_47 => "iPhone 6",
|
124
|
-
ScreenSize::IOS_55 => "iPhone 6 Plus",
|
130
|
+
ScreenSize::IOS_47 => "iPhone 6", # and 7
|
131
|
+
ScreenSize::IOS_55 => "iPhone 6 Plus", # and 7 Plus
|
125
132
|
ScreenSize::IOS_58 => "iPhone XS",
|
126
133
|
ScreenSize::IOS_61 => "iPhone XR",
|
127
134
|
ScreenSize::IOS_65 => "iPhone XS Max",
|
@@ -130,8 +137,8 @@ module Deliver
|
|
130
137
|
ScreenSize::IOS_IPAD_11 => "iPad 11",
|
131
138
|
ScreenSize::IOS_IPAD_PRO => "iPad Pro",
|
132
139
|
ScreenSize::IOS_40_MESSAGES => "iPhone 5 (iMessage)",
|
133
|
-
ScreenSize::IOS_47_MESSAGES => "iPhone 6 (iMessage)",
|
134
|
-
ScreenSize::IOS_55_MESSAGES => "iPhone 6 Plus (iMessage)",
|
140
|
+
ScreenSize::IOS_47_MESSAGES => "iPhone 6 (iMessage)", # also 7 & 8
|
141
|
+
ScreenSize::IOS_55_MESSAGES => "iPhone 6 Plus (iMessage)", # also 7 Plus & 8 Plus
|
135
142
|
ScreenSize::IOS_58_MESSAGES => "iPhone XS (iMessage)",
|
136
143
|
ScreenSize::IOS_61_MESSAGES => "iPhone XR (iMessage)",
|
137
144
|
ScreenSize::IOS_65_MESSAGES => "iPhone XS Max (iMessage)",
|
@@ -243,7 +243,7 @@ module Deliver
|
|
243
243
|
# rubocop:disable Metrics/LineLength
|
244
244
|
FastlaneCore::ConfigItem.new(key: :itc_provider,
|
245
245
|
env_name: "DELIVER_ITC_PROVIDER",
|
246
|
-
description: "The provider short name to be used with the iTMSTransporter to identify your team. To get provider short name run `pathToXcode.app/Contents/Applications/Application\\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column",
|
246
|
+
description: "The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `pathToXcode.app/Contents/Applications/Application\\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column",
|
247
247
|
optional: true),
|
248
248
|
# rubocop:enable Metrics/LineLength
|
249
249
|
|
@@ -156,7 +156,7 @@ module Deliver
|
|
156
156
|
)
|
157
157
|
end
|
158
158
|
|
159
|
-
transporter =
|
159
|
+
transporter = transporter_for_selected_team
|
160
160
|
result = transporter.upload(options[:app].apple_id, package_path)
|
161
161
|
UI.user_error!("Could not upload binary to App Store Connect. Check out the error above", show_github_issues: true) unless result
|
162
162
|
end
|
@@ -174,6 +174,25 @@ module Deliver
|
|
174
174
|
|
175
175
|
private
|
176
176
|
|
177
|
+
# If itc_provider was explicitly specified, use it.
|
178
|
+
# If there are multiple teams, infer the provider from the selected team name.
|
179
|
+
# If there are fewer than two teams, don't infer the provider.
|
180
|
+
def transporter_for_selected_team
|
181
|
+
generic_transporter = FastlaneCore::ItunesTransporter.new(options[:username], nil, false, options[:itc_provider])
|
182
|
+
return generic_transporter unless options[:itc_provider].nil? && Spaceship::Tunes.client.teams.count > 1
|
183
|
+
|
184
|
+
begin
|
185
|
+
team = Spaceship::Tunes.client.teams.find { |t| t['contentProvider']['contentProviderId'].to_s == Spaceship::Tunes.client.team_id }
|
186
|
+
name = team['contentProvider']['name']
|
187
|
+
provider_id = generic_transporter.provider_ids[name]
|
188
|
+
UI.verbose("Inferred provider id #{provider_id} for team #{name}.")
|
189
|
+
return FastlaneCore::ItunesTransporter.new(options[:username], nil, false, provider_id)
|
190
|
+
rescue => ex
|
191
|
+
UI.verbose("Couldn't infer a provider short name for team with id #{Spaceship::Tunes.client.team_id} automatically: #{ex}. Proceeding without provider short name.")
|
192
|
+
return generic_transporter
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
177
196
|
def validate_html(screenshots)
|
178
197
|
return if options[:force]
|
179
198
|
return if options[:skip_metadata] && options[:skip_screenshots]
|
@@ -104,9 +104,9 @@ module Deliver
|
|
104
104
|
files = Dir.glob(File.join(lng_folder, "*.#{extensions}"), File::FNM_CASEFOLD).sort
|
105
105
|
next if files.count == 0
|
106
106
|
|
107
|
-
|
107
|
+
framed_screenshots_found = Dir.glob(File.join(lng_folder, "*_framed.#{extensions}"), File::FNM_CASEFOLD).count > 0
|
108
108
|
|
109
|
-
UI.important("Framed screenshots are detected! 🖼 Non-framed screenshot files may be skipped. 🏃") if
|
109
|
+
UI.important("Framed screenshots are detected! 🖼 Non-framed screenshot files may be skipped. 🏃") if framed_screenshots_found
|
110
110
|
|
111
111
|
language_dir_name = File.basename(lng_folder)
|
112
112
|
|
@@ -120,7 +120,7 @@ module Deliver
|
|
120
120
|
is_framed = file_path.downcase.include?("_framed.")
|
121
121
|
is_watch = file_path.downcase.include?("watch")
|
122
122
|
|
123
|
-
if
|
123
|
+
if framed_screenshots_found && !is_framed && !is_watch
|
124
124
|
UI.important("🏃 Skipping screenshot file: #{file_path}")
|
125
125
|
next
|
126
126
|
end
|
@@ -743,3 +743,6 @@ App Store Connect has a limit of 150 binary uploads per day.
|
|
743
743
|
|
744
744
|
## Editing the `Deliverfile`
|
745
745
|
Change syntax highlighting to *Ruby*.
|
746
|
+
|
747
|
+
## Provider Short Name
|
748
|
+
If you are on multiple App Store Connect teams, _deliver_ needs a provider short name to know where to upload your binary. _deliver_ will try to use the long name of the selected team to detect the provider short name. To override the detected value with an explicit one, use the `itc_provider` option.
|
@@ -222,3 +222,6 @@ If your password contains special characters, _pilot_ may throw a confusing erro
|
|
222
222
|
## How is my password stored?
|
223
223
|
|
224
224
|
_pilot_ uses the [CredentialsManager](https://github.com/fastlane/fastlane/tree/master/credentials_manager) from _fastlane_.
|
225
|
+
|
226
|
+
## Provider Short Name
|
227
|
+
If you are on multiple App Store Connect teams, iTunes Transporter may need a provider short name to know where to upload your binary. _pilot_ will try to use the long name of the selected team to detect the provider short name. To override the detected value with an explicit one, use the `itc_provider` option.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Fastlane
|
2
|
-
VERSION = '2.119.0.beta.
|
2
|
+
VERSION = '2.119.0.beta.20190323200019'.freeze
|
3
3
|
DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
|
4
4
|
MINIMUM_XCODE_RELEASE = "7.0".freeze
|
5
5
|
RUBOCOP_REQUIREMENT = '0.49.1'.freeze
|
@@ -31,7 +31,10 @@ module FastlaneCore
|
|
31
31
|
private_constant :ERROR_REGEX, :WARNING_REGEX, :OUTPUT_REGEX, :RETURN_VALUE_REGEX, :SKIP_ERRORS
|
32
32
|
|
33
33
|
def execute(command, hide_output)
|
34
|
-
|
34
|
+
if Helper.test?
|
35
|
+
yield(nil) if block_given?
|
36
|
+
return command
|
37
|
+
end
|
35
38
|
|
36
39
|
@errors = []
|
37
40
|
@warnings = []
|
@@ -87,7 +90,8 @@ module FastlaneCore
|
|
87
90
|
UI.important("Although errors occurred during execution of iTMSTransporter, it returned success status.")
|
88
91
|
end
|
89
92
|
|
90
|
-
|
93
|
+
yield(@all_lines) if block_given?
|
94
|
+
return exit_status.zero?
|
91
95
|
end
|
92
96
|
|
93
97
|
private
|
@@ -185,6 +189,15 @@ module FastlaneCore
|
|
185
189
|
].compact.join(' ')
|
186
190
|
end
|
187
191
|
|
192
|
+
def build_provider_ids_command(username, password)
|
193
|
+
[
|
194
|
+
'"' + Helper.transporter_path + '"',
|
195
|
+
'-m provider',
|
196
|
+
"-u \"#{username}\"",
|
197
|
+
"-p #{shell_escaped_password(password)}"
|
198
|
+
].compact.join(' ')
|
199
|
+
end
|
200
|
+
|
188
201
|
def handle_error(password)
|
189
202
|
# rubocop:disable Style/CaseEquality
|
190
203
|
# rubocop:disable Style/YodaCondition
|
@@ -270,6 +283,24 @@ module FastlaneCore
|
|
270
283
|
].compact.join(' ')
|
271
284
|
end
|
272
285
|
|
286
|
+
def build_provider_ids_command(username, password)
|
287
|
+
[
|
288
|
+
Helper.transporter_java_executable_path.shellescape,
|
289
|
+
"-Djava.ext.dirs=#{Helper.transporter_java_ext_dir.shellescape}",
|
290
|
+
'-XX:NewSize=2m',
|
291
|
+
'-Xms32m',
|
292
|
+
'-Xmx1024m',
|
293
|
+
'-Xms1024m',
|
294
|
+
'-Djava.awt.headless=true',
|
295
|
+
'-Dsun.net.http.retryPost=false',
|
296
|
+
java_code_option,
|
297
|
+
'-m provider',
|
298
|
+
"-u #{username.shellescape}",
|
299
|
+
"-p #{password.shellescape}",
|
300
|
+
'2>&1' # cause stderr to be written to stdout
|
301
|
+
].compact.join(' ')
|
302
|
+
end
|
303
|
+
|
273
304
|
def java_code_option
|
274
305
|
if Helper.mac? && Helper.xcode_at_least?(9)
|
275
306
|
return "-jar #{Helper.transporter_java_jar_path.shellescape}"
|
@@ -297,6 +328,8 @@ module FastlaneCore
|
|
297
328
|
end
|
298
329
|
|
299
330
|
class ItunesTransporter
|
331
|
+
# Matches a line in the provider table: "12 Initech Systems Inc LG89CQY559"
|
332
|
+
PROVIDER_REGEX = /^\d+\s{2,}.+\s{2,}[^\s]+$/
|
300
333
|
TWO_STEP_HOST_PREFIX = "deliver.appspecific"
|
301
334
|
|
302
335
|
# This will be called from the Deliverfile, and disables the logging of the transporter output
|
@@ -401,6 +434,21 @@ module FastlaneCore
|
|
401
434
|
result
|
402
435
|
end
|
403
436
|
|
437
|
+
def provider_ids
|
438
|
+
command = @transporter_executor.build_provider_ids_command(@user, @password)
|
439
|
+
UI.verbose(@transporter_executor.build_provider_ids_command(@user, 'YourPassword'))
|
440
|
+
lines = []
|
441
|
+
begin
|
442
|
+
result = @transporter_executor.execute(command, ItunesTransporter.hide_transporter_output?) { |xs| lines = xs }
|
443
|
+
return result if Helper.test?
|
444
|
+
rescue TransporterRequiresApplicationSpecificPasswordError => ex
|
445
|
+
handle_two_step_failure(ex)
|
446
|
+
return provider_ids
|
447
|
+
end
|
448
|
+
|
449
|
+
lines.map { |line| provider_pair(line) }.compact.to_h
|
450
|
+
end
|
451
|
+
|
404
452
|
private
|
405
453
|
|
406
454
|
TWO_FACTOR_ENV_VARIABLE = "FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD"
|
@@ -462,5 +510,11 @@ module FastlaneCore
|
|
462
510
|
def handle_error(password)
|
463
511
|
@transporter_executor.handle_error(password)
|
464
512
|
end
|
513
|
+
|
514
|
+
def provider_pair(line)
|
515
|
+
line = line.strip
|
516
|
+
return nil unless line =~ PROVIDER_REGEX
|
517
|
+
line.split(/\s{2,}/).drop(1)
|
518
|
+
end
|
465
519
|
end
|
466
520
|
end
|
@@ -3,19 +3,18 @@ require_relative 'frame_downloader'
|
|
3
3
|
|
4
4
|
module Frameit
|
5
5
|
class Offsets
|
6
|
-
# Returns the image offset needed for a certain device type
|
7
|
-
# uses deliver to detect the screen size
|
6
|
+
# Returns the image offset needed for a certain device type
|
8
7
|
def self.image_offset(screenshot)
|
9
8
|
require 'json'
|
10
9
|
|
11
|
-
unless @
|
10
|
+
unless @offsets_cache
|
12
11
|
offsets_json_path = File.join(FrameDownloader.new.templates_path, "offsets.json")
|
13
12
|
UI.user_error!("Could not find offsets.json file at path '#{offsets_json_path}'") unless File.exist?(offsets_json_path)
|
14
|
-
@
|
13
|
+
@offsets_cache = JSON.parse(File.read(offsets_json_path))
|
15
14
|
end
|
16
15
|
|
17
|
-
offset_value = @
|
18
|
-
UI.error("Tried looking for offset information for 'portrait', #{screenshot.device_name}") unless offset_value
|
16
|
+
offset_value = @offsets_cache["portrait"][screenshot.device_name]
|
17
|
+
UI.error("Tried looking for offset information for 'portrait', #{screenshot.device_name} in '#{offsets_json_path}'") unless offset_value
|
19
18
|
return offset_value
|
20
19
|
end
|
21
20
|
end
|
@@ -34,7 +34,7 @@ module Pilot
|
|
34
34
|
package_path: dir,
|
35
35
|
platform: platform)
|
36
36
|
|
37
|
-
transporter =
|
37
|
+
transporter = transporter_for_selected_team(options)
|
38
38
|
result = transporter.upload(app.apple_id, package_path)
|
39
39
|
|
40
40
|
unless result
|
@@ -212,6 +212,25 @@ module Pilot
|
|
212
212
|
!options[:localized_build_info].nil?
|
213
213
|
end
|
214
214
|
|
215
|
+
# If itc_provider was explicitly specified, use it.
|
216
|
+
# If there are multiple teams, infer the provider from the selected team name.
|
217
|
+
# If there are fewer than two teams, don't infer the provider.
|
218
|
+
def transporter_for_selected_team(options)
|
219
|
+
generic_transporter = FastlaneCore::ItunesTransporter.new(options[:username], nil, false, options[:itc_provider])
|
220
|
+
return generic_transporter unless options[:itc_provider].nil? && Spaceship::Tunes.client.teams.count > 1
|
221
|
+
|
222
|
+
begin
|
223
|
+
team = Spaceship::Tunes.client.teams.find { |t| t['contentProvider']['contentProviderId'].to_s == Spaceship::Tunes.client.team_id }
|
224
|
+
name = team['contentProvider']['name']
|
225
|
+
provider_id = generic_transporter.provider_ids[name]
|
226
|
+
UI.verbose("Inferred provider id #{provider_id} for team #{name}.")
|
227
|
+
return FastlaneCore::ItunesTransporter.new(options[:username], nil, false, provider_id)
|
228
|
+
rescue => ex
|
229
|
+
UI.verbose("Couldn't infer a provider short name for team with id #{Spaceship::Tunes.client.team_id} automatically: #{ex}. Proceeding without provider short name.")
|
230
|
+
return generic_transporter
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
215
234
|
def distribute_build(uploaded_build, options)
|
216
235
|
UI.message("Distributing new build to testers: #{uploaded_build.train_version} - #{uploaded_build.build_version}")
|
217
236
|
|
data/pilot/lib/pilot/options.rb
CHANGED
@@ -224,7 +224,7 @@ module Pilot
|
|
224
224
|
# rubocop:disable Metrics/LineLength
|
225
225
|
FastlaneCore::ConfigItem.new(key: :itc_provider,
|
226
226
|
env_name: "PILOT_ITC_PROVIDER",
|
227
|
-
description: "The provider short name to be used with the iTMSTransporter to identify your team. To get provider short name run `pathToXcode.app/Contents/Applications/Application\\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column",
|
227
|
+
description: "The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `pathToXcode.app/Contents/Applications/Application\\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column",
|
228
228
|
optional: true),
|
229
229
|
# rubocop:enable Metrics/LineLength
|
230
230
|
|
@@ -195,15 +195,21 @@ module Screengrab
|
|
195
195
|
end
|
196
196
|
|
197
197
|
def uninstall_apks(device_serial, app_package_name, tests_package_name)
|
198
|
-
|
199
|
-
run_adb_command("adb -s #{device_serial} uninstall #{app_package_name}",
|
200
|
-
print_all: true,
|
201
|
-
print_command: true)
|
198
|
+
packages = installed_packages(device_serial)
|
202
199
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
200
|
+
if packages.include?(app_package_name.to_s)
|
201
|
+
UI.message('Uninstalling app APK')
|
202
|
+
run_adb_command("adb -s #{device_serial} uninstall #{app_package_name}",
|
203
|
+
print_all: true,
|
204
|
+
print_command: true)
|
205
|
+
end
|
206
|
+
|
207
|
+
if packages.include?(tests_package_name.to_s)
|
208
|
+
UI.message('Uninstalling tests APK')
|
209
|
+
run_adb_command("adb -s #{device_serial} uninstall #{tests_package_name}",
|
210
|
+
print_all: true,
|
211
|
+
print_command: true)
|
212
|
+
end
|
207
213
|
end
|
208
214
|
|
209
215
|
def grant_permissions(device_serial)
|
@@ -351,6 +357,14 @@ module Screengrab
|
|
351
357
|
# We can safely ignore that and treat it as if it returned 'No such file'
|
352
358
|
end
|
353
359
|
|
360
|
+
# Return an array of packages that are installed on the device
|
361
|
+
def installed_packages(device_serial)
|
362
|
+
packages = run_adb_command("adb -s #{device_serial} shell pm list packages",
|
363
|
+
print_all: true,
|
364
|
+
print_command: true)
|
365
|
+
packages.split("\n").map { |package| package.gsub("package:", "") }
|
366
|
+
end
|
367
|
+
|
354
368
|
def run_adb_command(command, print_all: false, print_command: false)
|
355
369
|
adb_path = @android_env.adb_path.chomp("adb")
|
356
370
|
output = @executor.execute(command: adb_path + command,
|
data/spaceship/README.md
CHANGED
@@ -97,11 +97,11 @@ This requires you to install `pry` using `sudo gem install pry`. `pry` is not in
|
|
97
97
|
|
98
98
|
## Apple Developer Portal API
|
99
99
|
|
100
|
-
|
100
|
+
Open [DeveloperPortal.md](docs/DeveloperPortal.md) for code samples
|
101
101
|
|
102
102
|
## App Store Connect API
|
103
103
|
|
104
|
-
|
104
|
+
Open [AppStoreConnect.md](docs/AppStoreConnect.md) for code samples
|
105
105
|
|
106
106
|
## 2 Step Verification
|
107
107
|
|
@@ -123,24 +123,9 @@ This will authenticate you and provide a string that can be transferred to your
|
|
123
123
|
export FASTLANE_SESSION='---\n- !ruby/object:HTTP::Cookie\n name: DES5c148586dfd451e55afbaaa5f62418f91\n value: HSARMTKNSRVTWFla1+yO4gVPowH17VaaaxPFnUdMUegQZxqy1Ie1c2v6bM1vSOzIbuOmrl/FNenlScsd/NbF7/Lw4cpnL15jsyg0TOJwP32tC/NguPiyOaaaU+jrj4tf4uKdIywVaaaFSRVT\n domain: idmsa.apple.com\n for_domain: true\n path: "/"\n secure: true\n httponly: true\n expires: 2016-04-27 23:55:56.000000000 Z\n max_age: \n created_at: 2016-03-28 16:55:57.032086000 -07:00\n accessed_at: 2016-03-28 19:11:17.828141000 -07:00\n'
|
124
124
|
```
|
125
125
|
|
126
|
-
#### Bypass trusted device and use SMS for verification
|
127
|
-
|
128
|
-
If you have a trusted device configured, Apple will not send a SMS code to your phone for your Apple account when you try to generate a web session with _fastlane_. Instead, a code will be displayed on one of your account's trusted devices. This can be problematic if you are trying to authenticate but don't have access to a trusted device. Take the following steps to circumvent the device and use SMS instead:
|
129
|
-
|
130
|
-
- Attempt to generate a web session with `fastlane spaceauth -u [email]` and wait for security code prompt to appear
|
131
|
-
- Open a browser to [appleid.apple.com](https://appleid.apple.com) or an address that requires you to login with your Apple ID, and logout of any previous session
|
132
|
-
- Login with your Apple ID and request a code be sent to the desired phone when prompted for a security code
|
133
|
-
- Use the code sent to phone with _fastlane_ instead of with the browser
|
134
|
-
|
135
126
|
#### Transporter
|
136
127
|
|
137
|
-
|
138
|
-
|
139
|
-
1. Visit [appleid.apple.com/account/manage](https://appleid.apple.com/account/manage)
|
140
|
-
1. Generate a new application specific password
|
141
|
-
1. Provide the application specific password using an environment variable `FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD`.
|
142
|
-
|
143
|
-
Alternatively you can enter the application specific password when you're asked the first time _fastlane_ uploads a build.
|
128
|
+
See [Continuous Integration > Authentication with Apple services > Application specific passwords](https://docs.fastlane.tools/best-practices/continuous-integration/#application-specific-passwords)
|
144
129
|
|
145
130
|
## _spaceship_ in use
|
146
131
|
|
@@ -152,7 +137,8 @@ All [fastlane tools](https://fastlane.tools) that communicate with Apple's web s
|
|
152
137
|
|
153
138
|
Overview of the used API endpoints
|
154
139
|
|
155
|
-
- `https://idmsa.apple.com`:
|
140
|
+
- `https://idmsa.apple.com`:
|
141
|
+
- Used to authenticate to get a valid session
|
156
142
|
- `https://developerservices2.apple.com`:
|
157
143
|
- Get a list of all available provisioning profiles
|
158
144
|
- Register new devices
|
@@ -1,7 +1,33 @@
|
|
1
1
|
module Spaceship
|
2
2
|
module Tunes
|
3
|
+
# identifiers of devices that App Store Connect accepts screenshots for
|
3
4
|
class DeviceType
|
4
|
-
@types = [
|
5
|
+
@types = [
|
6
|
+
# iPhone
|
7
|
+
'iphone35',
|
8
|
+
'iphone4',
|
9
|
+
'iphone6', # 4.7-inch Display
|
10
|
+
'iphone6Plus', # 5.5-inch Display
|
11
|
+
'iphone58', # iPhone XS
|
12
|
+
'iphone65', # iPhone XS Max
|
13
|
+
|
14
|
+
# iPad
|
15
|
+
'ipad', # 9.7-inch Display
|
16
|
+
'ipad105',
|
17
|
+
'ipadPro',
|
18
|
+
'ipadPro11',
|
19
|
+
'ipadPro129',
|
20
|
+
|
21
|
+
# Apple Watch
|
22
|
+
'watch', # series 3
|
23
|
+
'watchSeries4',
|
24
|
+
|
25
|
+
# Apple TV
|
26
|
+
'appleTV',
|
27
|
+
|
28
|
+
# Mac
|
29
|
+
'desktop'
|
30
|
+
]
|
5
31
|
class << self
|
6
32
|
attr_accessor :types
|
7
33
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.119.0.beta.
|
4
|
+
version: 2.119.0.beta.20190323200019
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Iulian Onofrei
|
@@ -27,7 +27,7 @@ authors:
|
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
30
|
-
date: 2019-03-
|
30
|
+
date: 2019-03-23 00:00:00.000000000 Z
|
31
31
|
dependencies:
|
32
32
|
- !ruby/object:Gem::Dependency
|
33
33
|
name: slack-notifier
|
@@ -1688,24 +1688,24 @@ metadata:
|
|
1688
1688
|
post_install_message:
|
1689
1689
|
rdoc_options: []
|
1690
1690
|
require_paths:
|
1691
|
-
-
|
1692
|
-
-
|
1691
|
+
- deliver/lib
|
1692
|
+
- cert/lib
|
1693
|
+
- produce/lib
|
1694
|
+
- fastlane_core/lib
|
1693
1695
|
- pilot/lib
|
1694
|
-
-
|
1696
|
+
- match/lib
|
1695
1697
|
- spaceship/lib
|
1696
1698
|
- supply/lib
|
1697
|
-
-
|
1698
|
-
-
|
1699
|
+
- precheck/lib
|
1700
|
+
- sigh/lib
|
1699
1701
|
- fastlane/lib
|
1700
|
-
- fastlane_core/lib
|
1701
|
-
- deliver/lib
|
1702
1702
|
- credentials_manager/lib
|
1703
|
-
-
|
1704
|
-
-
|
1705
|
-
-
|
1706
|
-
- precheck/lib
|
1703
|
+
- frameit/lib
|
1704
|
+
- snapshot/lib
|
1705
|
+
- gym/lib
|
1707
1706
|
- pem/lib
|
1708
|
-
-
|
1707
|
+
- scan/lib
|
1708
|
+
- screengrab/lib
|
1709
1709
|
required_ruby_version: !ruby/object:Gem::Requirement
|
1710
1710
|
requirements:
|
1711
1711
|
- - ">="
|