fastlane 2.65.0.beta.20171117010003 → 2.65.0.beta.20171118010003
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/fastlane/lib/fastlane/actions/download_dsyms.rb +3 -0
- data/fastlane/lib/fastlane/actions/gradle.rb +16 -1
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/spaceship/lib/spaceship.rb +1 -0
- data/spaceship/lib/spaceship/client.rb +14 -2
- data/spaceship/lib/spaceship/provider.rb +13 -0
- data/spaceship/lib/spaceship/test_flight/build.rb +15 -2
- data/spaceship/lib/spaceship/test_flight/build_trains.rb +6 -1
- data/spaceship/lib/spaceship/test_flight/client.rb +50 -8
- data/spaceship/lib/spaceship/test_flight/group.rb +20 -6
- data/spaceship/lib/spaceship/tunes/application.rb +7 -34
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 787f3b4ef5ff27786c4d6028c038bab3e9f5d73b
|
4
|
+
data.tar.gz: a7a489a49ebb8033c682479ed587c85a78864fe3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 78bb309c12f3aabb9d57ff90512c3bbd510c657731b8c02243dc64db5d44541670d0dd8378f67be17c6b590998d38c93b110e5174cce188ad40f0558fe9d3e6b
|
7
|
+
data.tar.gz: 35048fe0d1a63c22d5a10b337ec20a32701843cc885dd2be33bc30059d113b039644ad77575a6fad10d71e5ae2620f8a67ce424ab2c1be417fba1ce95cd9ed8d
|
@@ -47,6 +47,9 @@ module Fastlane
|
|
47
47
|
UI.message(message.join(" "))
|
48
48
|
|
49
49
|
# Loop through all app versions and download their dSYM
|
50
|
+
# This will need to change with the new build trains endpoints
|
51
|
+
# can use app.build_trains(platform: platform).versions to check for the right version
|
52
|
+
# then iterate through the builds
|
50
53
|
app.all_build_train_numbers(platform: platform).each do |train_number|
|
51
54
|
if version && version != train_number
|
52
55
|
next
|
@@ -185,8 +185,23 @@ module Fastlane
|
|
185
185
|
"versionName" => "1.0.0",
|
186
186
|
# ...
|
187
187
|
}
|
188
|
+
)
|
189
|
+
```
|
190
|
+
|
191
|
+
You can use this to automatically [sign and zipalign](https://developer.android.com/studio/publish/app-signing.html) your app:
|
192
|
+
```ruby
|
193
|
+
gradle(
|
194
|
+
task: "assemble",
|
195
|
+
build_type: "Release",
|
196
|
+
print_command: false,
|
197
|
+
properties: {
|
198
|
+
"android.injected.signing.store.file" => "keystore.jks",
|
199
|
+
"android.injected.signing.store.password" => "store_password",
|
200
|
+
"android.injected.signing.key.alias" => "key_alias",
|
201
|
+
"android.injected.signing.key.password" => "key_password",
|
202
|
+
}
|
188
203
|
)',
|
189
|
-
'# If you need to pass sensitive information through the `gradle` action, and don
|
204
|
+
'# If you need to pass sensitive information through the `gradle` action, and don\'t want the generated command to be printed before it is run, you can suppress that:
|
190
205
|
gradle(
|
191
206
|
# ...
|
192
207
|
print_command: false
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Fastlane
|
2
|
-
VERSION = '2.65.0.beta.
|
2
|
+
VERSION = '2.65.0.beta.20171118010003'.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
|
data/spaceship/lib/spaceship.rb
CHANGED
@@ -33,6 +33,10 @@ module Spaceship
|
|
33
33
|
|
34
34
|
attr_accessor :csrf_tokens
|
35
35
|
|
36
|
+
attr_accessor :provider
|
37
|
+
|
38
|
+
attr_accessor :available_providers
|
39
|
+
|
36
40
|
# Base class for errors that want to present their message as
|
37
41
|
# preferred error info for fastlane error handling. See:
|
38
42
|
# fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb
|
@@ -489,11 +493,19 @@ module Spaceship
|
|
489
493
|
# Get the `itctx` from the new (22nd May 2017) API endpoint "olympus"
|
490
494
|
def fetch_olympus_session
|
491
495
|
response = request(:get, "https://olympus.itunes.apple.com/v1/session")
|
492
|
-
|
493
|
-
|
496
|
+
body = response.body
|
497
|
+
if body
|
498
|
+
body = JSON.parse(body) if body.kind_of?(String)
|
499
|
+
user_map = body["user"]
|
494
500
|
if user_map
|
495
501
|
self.user_email = user_map["emailAddress"]
|
496
502
|
end
|
503
|
+
|
504
|
+
provider = body["provider"]
|
505
|
+
self.provider = Spaceship::Provider.new(provider_hash: provider)
|
506
|
+
self.available_providers = body["availableProviders"].map do |provider_hash|
|
507
|
+
Spaceship::Provider.new(provider_hash: provider_hash)
|
508
|
+
end
|
497
509
|
end
|
498
510
|
end
|
499
511
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Spaceship
|
2
|
+
class Provider
|
3
|
+
attr_accessor :provider_id
|
4
|
+
attr_accessor :name
|
5
|
+
attr_accessor :content_types
|
6
|
+
|
7
|
+
def initialize(provider_hash: nil)
|
8
|
+
self.provider_id = provider_hash['providerId']
|
9
|
+
self.name = provider_hash['name']
|
10
|
+
self.content_types = provider_hash['contentTypes']
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -45,6 +45,13 @@ module Spaceship::TestFlight
|
|
45
45
|
|
46
46
|
attr_accessor :upload_date
|
47
47
|
|
48
|
+
attr_accessor :dsym_url
|
49
|
+
attr_accessor :build_sdk
|
50
|
+
attr_accessor :include_symbols
|
51
|
+
attr_accessor :number_of_asset_packs
|
52
|
+
attr_accessor :contains_odr
|
53
|
+
attr_accessor :file_name
|
54
|
+
|
48
55
|
attr_mapping({
|
49
56
|
'appAdamId' => :app_id,
|
50
57
|
'providerId' => :provider_id,
|
@@ -61,7 +68,13 @@ module Spaceship::TestFlight
|
|
61
68
|
'crashCount' => :crash_count,
|
62
69
|
'didNotify' => :did_notify,
|
63
70
|
'uploadDate' => :upload_date,
|
64
|
-
'id' => :id
|
71
|
+
'id' => :id,
|
72
|
+
'dSYMUrl' => :dsym_url,
|
73
|
+
'buildSdk' => :build_sdk,
|
74
|
+
'includesSymbols' => :include_symbols,
|
75
|
+
'numberOfAssetPacks' => :number_of_asset_packs,
|
76
|
+
'containsODR' => :contains_odr,
|
77
|
+
'fileName' => :file_name
|
65
78
|
})
|
66
79
|
|
67
80
|
BUILD_STATES = {
|
@@ -86,7 +99,7 @@ module Spaceship::TestFlight
|
|
86
99
|
trains.values.flatten
|
87
100
|
end
|
88
101
|
|
89
|
-
def self.builds_for_train(app_id: nil, platform: nil, train_version: nil, retry_count:
|
102
|
+
def self.builds_for_train(app_id: nil, platform: nil, train_version: nil, retry_count: 3)
|
90
103
|
builds_data = client.get_builds_for_train(app_id: app_id, platform: platform, train_version: train_version, retry_count: retry_count)
|
91
104
|
builds_data.map { |data| self.new(data) }
|
92
105
|
end
|
@@ -9,9 +9,10 @@ module Spaceship::TestFlight
|
|
9
9
|
#
|
10
10
|
# See `Spaceship::TestFlight::Build#reload`
|
11
11
|
|
12
|
-
def self.all(app_id: nil, platform: nil, retry_count:
|
12
|
+
def self.all(app_id: nil, platform: nil, retry_count: 3)
|
13
13
|
data = client.get_build_trains(app_id: app_id, platform: platform)
|
14
14
|
trains = {}
|
15
|
+
|
15
16
|
data.each do |train_version|
|
16
17
|
builds_data = client.get_builds_for_train(app_id: app_id, platform: platform, train_version: train_version, retry_count: retry_count)
|
17
18
|
trains[train_version] = builds_data.map { |attrs| Build.new(attrs) }
|
@@ -32,5 +33,9 @@ module Spaceship::TestFlight
|
|
32
33
|
def values
|
33
34
|
@trains.values
|
34
35
|
end
|
36
|
+
|
37
|
+
def versions
|
38
|
+
@trains.keys
|
39
|
+
end
|
35
40
|
end
|
36
41
|
end
|
@@ -24,10 +24,11 @@ module Spaceship::TestFlight
|
|
24
24
|
assert_required_params(__method__, binding)
|
25
25
|
|
26
26
|
response = request(:get, "providers/#{team_id}/apps/#{app_id}/platforms/#{platform}/trains")
|
27
|
+
|
27
28
|
handle_response(response)
|
28
29
|
end
|
29
30
|
|
30
|
-
def get_builds_for_train(app_id: nil, platform: "ios", train_version: nil, retry_count:
|
31
|
+
def get_builds_for_train(app_id: nil, platform: "ios", train_version: nil, retry_count: 3)
|
31
32
|
assert_required_params(__method__, binding)
|
32
33
|
with_retry(retry_count) do
|
33
34
|
response = request(:get, "providers/#{team_id}/apps/#{app_id}/platforms/#{platform}/trains/#{train_version}/builds", nil, {}, true)
|
@@ -105,6 +106,44 @@ module Spaceship::TestFlight
|
|
105
106
|
handle_response(response)
|
106
107
|
end
|
107
108
|
|
109
|
+
# Returns a list of available testing groups
|
110
|
+
# e.g.
|
111
|
+
# {"b6f65dbd-c845-4d91-bc39-0b661d608970" => "Boarding",
|
112
|
+
# "70402368-9deb-409f-9a26-bb3f215dfee3" => "Automatic"}
|
113
|
+
def groups(app_id)
|
114
|
+
return @cached_groups if @cached_groups
|
115
|
+
|
116
|
+
r = request(:get, "/testflight/v2/providers/#{self.provider.provider_id}/apps/#{app_id}/groups")
|
117
|
+
@cached_groups = parse_response(r, 'data')
|
118
|
+
end
|
119
|
+
|
120
|
+
#####################################################
|
121
|
+
# @!group Testers
|
122
|
+
#####################################################
|
123
|
+
def testers(tester)
|
124
|
+
url = tester.url[:index]
|
125
|
+
r = request(:get, url)
|
126
|
+
parse_response(r, 'data')['users']
|
127
|
+
end
|
128
|
+
|
129
|
+
def testers_by_app(tester, app_id, group_id: nil)
|
130
|
+
if group_id.nil?
|
131
|
+
group_ids = groups(app_id).map do |group|
|
132
|
+
group['id']
|
133
|
+
end
|
134
|
+
end
|
135
|
+
group_ids ||= [group_id]
|
136
|
+
testers = []
|
137
|
+
|
138
|
+
group_ids.each do |json_group_id|
|
139
|
+
url = tester.url(app_id, self.provider.provider_id, json_group_id)[:index_by_app]
|
140
|
+
r = request(:get, url)
|
141
|
+
testers += parse_response(r, 'data')['users']
|
142
|
+
end
|
143
|
+
|
144
|
+
testers
|
145
|
+
end
|
146
|
+
|
108
147
|
##
|
109
148
|
# @!group Testers API
|
110
149
|
##
|
@@ -164,18 +203,19 @@ module Spaceship::TestFlight
|
|
164
203
|
handle_response(response)
|
165
204
|
end
|
166
205
|
|
167
|
-
def
|
206
|
+
def post_tester_to_group(app_id: nil, email: nil, first_name: nil, last_name: nil, group_id: nil)
|
168
207
|
assert_required_params(__method__, binding)
|
169
208
|
|
170
209
|
# Then we can add the tester to the group that allows the app to test
|
171
210
|
# This is easy enough, we already have all this data. We don't need any response from the previous request
|
172
|
-
url = "providers/#{team_id}/apps/#{app_id}/groups/#{group_id}/testers
|
173
|
-
response = request(:
|
211
|
+
url = "providers/#{team_id}/apps/#{app_id}/groups/#{group_id}/testers"
|
212
|
+
response = request(:post) do |req|
|
174
213
|
req.url url
|
175
|
-
req.body = {
|
176
|
-
"
|
177
|
-
"
|
178
|
-
|
214
|
+
req.body = [{
|
215
|
+
"email" => email,
|
216
|
+
"firstName" => first_name,
|
217
|
+
"lastName" => last_name
|
218
|
+
}].to_json
|
179
219
|
req.headers['Content-Type'] = 'application/json'
|
180
220
|
end
|
181
221
|
handle_response(response)
|
@@ -229,6 +269,8 @@ module Spaceship::TestFlight
|
|
229
269
|
|
230
270
|
raise UnexpectedResponse, response.body['error'] if response.body['error']
|
231
271
|
|
272
|
+
raise UnexpectedResponse, "Temporary iTunes Connect error: #{response.body}" if response.body['statusCode'] == 'ERROR'
|
273
|
+
|
232
274
|
return response.body['data'] if response.body['data']
|
233
275
|
|
234
276
|
return response.body
|
@@ -4,6 +4,9 @@ module Spaceship::TestFlight
|
|
4
4
|
attr_accessor :name
|
5
5
|
attr_accessor :is_default_external_group
|
6
6
|
attr_accessor :is_internal_group
|
7
|
+
attr_accessor :provider_id
|
8
|
+
attr_accessor :is_active
|
9
|
+
attr_accessor :created
|
7
10
|
|
8
11
|
attr_accessor :app_id
|
9
12
|
|
@@ -12,7 +15,10 @@ module Spaceship::TestFlight
|
|
12
15
|
'name' => :name,
|
13
16
|
'isInternalGroup' => :is_internal_group,
|
14
17
|
'appAdamId' => :app_id,
|
15
|
-
'isDefaultExternalGroup' => :is_default_external_group
|
18
|
+
'isDefaultExternalGroup' => :is_default_external_group,
|
19
|
+
'providerId' => :provider_id,
|
20
|
+
'active' => :is_active,
|
21
|
+
'created' => :created
|
16
22
|
})
|
17
23
|
|
18
24
|
def self.all(app_id: nil)
|
@@ -48,12 +54,16 @@ module Spaceship::TestFlight
|
|
48
54
|
def add_tester!(tester)
|
49
55
|
# This post request creates an account-level tester and then makes it available to the app, or just makes
|
50
56
|
# it available to the app if it already exists
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
57
|
+
client.create_app_level_tester(app_id: self.app_id,
|
58
|
+
first_name: tester.first_name,
|
59
|
+
last_name: tester.last_name,
|
60
|
+
email: tester.email)
|
55
61
|
# This put request adds the tester to the group
|
56
|
-
client.
|
62
|
+
client.post_tester_to_group(group_id: self.id,
|
63
|
+
email: tester.email,
|
64
|
+
first_name: tester.first_name,
|
65
|
+
last_name: tester.last_name,
|
66
|
+
app_id: self.app_id)
|
57
67
|
end
|
58
68
|
|
59
69
|
def remove_tester!(tester)
|
@@ -84,6 +94,10 @@ module Spaceship::TestFlight
|
|
84
94
|
is_internal_group
|
85
95
|
end
|
86
96
|
|
97
|
+
def active?
|
98
|
+
is_active
|
99
|
+
end
|
100
|
+
|
87
101
|
def self.perform_for_groups_in_app(app: nil, groups: nil, &block)
|
88
102
|
if groups.nil?
|
89
103
|
default_external_group = app.default_external_group
|
@@ -261,15 +261,13 @@ module Spaceship
|
|
261
261
|
# TestFlight: A reference to all the build trains
|
262
262
|
# @return [Hash] a hash, the version number and platform being the key
|
263
263
|
def build_trains(platform: nil)
|
264
|
-
|
264
|
+
TestFlight::BuildTrains.all(app_id: self.apple_id, platform: platform)
|
265
265
|
end
|
266
266
|
|
267
267
|
# The numbers of all build trains that were uploaded
|
268
268
|
# @return [Array] An array of train version numbers
|
269
269
|
def all_build_train_numbers(platform: nil)
|
270
|
-
|
271
|
-
current["versionString"]
|
272
|
-
end
|
270
|
+
return self.build_trains.versions
|
273
271
|
end
|
274
272
|
|
275
273
|
# Receive the build details for a specific build
|
@@ -277,46 +275,21 @@ module Spaceship
|
|
277
275
|
# which might happen if you don't use TestFlight
|
278
276
|
# This is used to receive dSYM files from Apple
|
279
277
|
def all_builds_for_train(train: nil, platform: nil)
|
280
|
-
|
281
|
-
attrs[:apple_id] = self.apple_id
|
282
|
-
Tunes::Build.factory(attrs)
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
# @return [Array]A list of binaries which are in the invalid state
|
287
|
-
def all_invalid_builds(platform: nil)
|
288
|
-
builds = []
|
289
|
-
|
290
|
-
self.build_trains(platform: platform).values.each do |train|
|
291
|
-
builds.concat(train.invalid_builds)
|
292
|
-
end
|
293
|
-
|
294
|
-
return builds
|
278
|
+
return TestFlight::Build.builds_for_train(app_id: self.apple_id, platform: platform, train_version: train)
|
295
279
|
end
|
296
280
|
|
297
281
|
# @return [Array] This will return an array of *all* processing builds
|
298
282
|
# this include pre-processing or standard processing
|
299
283
|
def all_processing_builds(platform: nil)
|
300
|
-
|
301
|
-
|
302
|
-
self.build_trains(platform: platform).each do |version_number, train|
|
303
|
-
builds.concat(train.processing_builds)
|
304
|
-
end
|
305
|
-
|
306
|
-
return builds
|
284
|
+
return TestFlight::Build.all_processing_builds(app_id: self.apple_id, platform: platform)
|
307
285
|
end
|
308
286
|
|
309
287
|
# Get all builds that are already processed for all build trains
|
310
288
|
# You can either use the return value (array) or pass a block
|
311
289
|
def builds(platform: nil)
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
yield(build) if block_given?
|
316
|
-
all_builds << build unless block_given?
|
317
|
-
end
|
318
|
-
end
|
319
|
-
all_builds
|
290
|
+
all = TestFlight::Build.all(app_id: self.apple_id, platform: platform)
|
291
|
+
return all unless block_given?
|
292
|
+
all.each { |build| yield(build) }
|
320
293
|
end
|
321
294
|
|
322
295
|
#####################################################
|
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.65.0.beta.
|
4
|
+
version: 2.65.0.beta.20171118010003
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date: 2017-11-
|
18
|
+
date: 2017-11-18 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: slack-notifier
|
@@ -1427,6 +1427,7 @@ files:
|
|
1427
1427
|
- spaceship/lib/spaceship/portal/spaceship.rb
|
1428
1428
|
- spaceship/lib/spaceship/portal/ui/select_team.rb
|
1429
1429
|
- spaceship/lib/spaceship/portal/website_push.rb
|
1430
|
+
- spaceship/lib/spaceship/provider.rb
|
1430
1431
|
- spaceship/lib/spaceship/spaceauth_runner.rb
|
1431
1432
|
- spaceship/lib/spaceship/test_flight.rb
|
1432
1433
|
- spaceship/lib/spaceship/test_flight/app_test_info.rb
|