fastlane 2.119.0.beta.20190322200024 → 2.119.0.beta.20190323200019
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
- - ">="
|