fastlane 2.132.0.beta.20190921200021 → 2.132.0.beta.20190922200014
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/app_store_build_number.rb +10 -2
- data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +3 -3
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/match/lib/match/storage/google_cloud_storage.rb +82 -33
- data/spaceship/lib/spaceship/tunes/app_version.rb +4 -0
- data/spaceship/lib/spaceship/tunes/iap_family_details.rb +10 -2
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a1ca53c03f79a2ab3085b365d28c70023b6b30a
|
4
|
+
data.tar.gz: 73dc05ecd0c1da1b68098c0aae53893297f5918c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0da136f1a574afca72055877880ce358a0b46cfe66382216374790b94e2a5485cc50e201f6f3f8d1f0c88dc9dce892a7bde9437e22c13fa3dda364f542d518f1
|
7
|
+
data.tar.gz: 87eefbf93477988092f8be024a4694a8ffe3b5972a46b86c7c1fa4ba43d29db7e65dba082ee2aee3e34483439c50dad1f4ccadcbb067d346d14048aa496b5919
|
@@ -36,6 +36,7 @@ module Fastlane
|
|
36
36
|
return build_nr
|
37
37
|
else
|
38
38
|
version_number = params[:version]
|
39
|
+
platform = params[:platform]
|
39
40
|
|
40
41
|
# Create filter for get_builds with optional version number
|
41
42
|
filter = { app: app.apple_id }
|
@@ -46,18 +47,25 @@ module Fastlane
|
|
46
47
|
version_number_message = "any version"
|
47
48
|
end
|
48
49
|
|
50
|
+
if platform
|
51
|
+
filter["preReleaseVersion.platform"] = Spaceship::ConnectAPI::Platform.map(platform)
|
52
|
+
platform_message = "#{platform} platform"
|
53
|
+
else
|
54
|
+
platform_message = "any platform"
|
55
|
+
end
|
56
|
+
|
49
57
|
UI.message("Fetching the latest build number for #{version_number_message}")
|
50
58
|
|
51
59
|
# Get latest build for optional version number and return build number if found
|
52
60
|
build = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion", limit: 1).first
|
53
61
|
if build
|
54
62
|
build_nr = build.version
|
55
|
-
UI.message("Latest upload for version #{build.app_version} is build: #{build_nr}")
|
63
|
+
UI.message("Latest upload for version #{build.app_version} on #{platform_message} is build: #{build_nr}")
|
56
64
|
return build_nr
|
57
65
|
end
|
58
66
|
|
59
67
|
# Let user know that build couldn't be found
|
60
|
-
UI.important("Could not find a build for #{version_number_message} on App Store Connect")
|
68
|
+
UI.important("Could not find a build for #{version_number_message} on #{platform_message} on App Store Connect")
|
61
69
|
|
62
70
|
if params[:initial_build_number].nil?
|
63
71
|
UI.user_error!("Could not find a build on App Store Connect - and 'initial_build_number' option is not set")
|
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
A new approach to iOS code signing: Share one code signing identity across your development team to simplify your codesigning setup and prevent code signing issues.
|
8
8
|
|
9
|
-
_match_ is the implementation of the [
|
9
|
+
_match_ is the implementation of the [codesigning.guide concept](https://codesigning.guide). _match_ creates all required certificates & provisioning profiles and stores them in a separate git repository. Every team member with access to the repo can use those credentials for code signing. _match_ also automatically repairs broken and expired credentials. It's the easiest way to share signing credentials across teams
|
10
10
|
|
11
11
|
[More information on how to get started with codesigning](https://docs.fastlane.tools/codesigning/getting-started/)
|
12
12
|
|
@@ -138,7 +138,7 @@ match(git_branch: "team2", username: "user@team2.com")
|
|
138
138
|
|
139
139
|
#### Google Cloud Storage
|
140
140
|
|
141
|
-
If you use Google Cloud Storage, you don't need to do anything manually. Just use Google Cloud Storage, and the top level folder will be the team ID.
|
141
|
+
If you use Google Cloud Storage, you don't need to do anything manually for multiple teams. Just use Google Cloud Storage, and the top level folder will be the team ID.
|
142
142
|
|
143
143
|
### Run
|
144
144
|
|
@@ -233,7 +233,7 @@ There are two cases for reading and writing certificates stored in a Google Clou
|
|
233
233
|
1. Continuous integration jobs. These will authenticate to your Google Cloud project via a service account, and use a `gc_keys.json` file as credentials.
|
234
234
|
1. Developers on a local workstation. In this case, you should choose whether everyone on your team will create their own `gc_keys.json` file, or whether you want to manage access to the bucket directly using your developers' Google accounts.
|
235
235
|
|
236
|
-
When running `fastlane match init` the first time, the setup process will give you the option to create your `gc_keys.json` file. This file contains the
|
236
|
+
When running `fastlane match init` the first time, the setup process will give you the option to create your `gc_keys.json` file. This file contains the authentication credentials needed to access your Google Cloud storage bucket. Make sure to keep that file secret and never add it to version control. We recommend adding `gc_keys.json` to your `.gitignore`
|
237
237
|
|
238
238
|
##### Managing developer access via keys
|
239
239
|
If you want to manage developer access to your certificates via authentication keys, every developer should create their own `gc_keys.json` and add the file to all their work machines. This will give the admin full control over who has read/write access to the given Storage bucket. At the same time it allows your team to revoke a single key if a file gets compromised.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Fastlane
|
2
|
-
VERSION = '2.132.0.beta.
|
2
|
+
VERSION = '2.132.0.beta.20190922200014'.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
|
@@ -97,6 +97,7 @@ module Match
|
|
97
97
|
end
|
98
98
|
|
99
99
|
ensure_bucket_is_selected
|
100
|
+
check_bucket_permissions
|
100
101
|
end
|
101
102
|
|
102
103
|
def currently_used_team_id
|
@@ -234,74 +235,122 @@ module Match
|
|
234
235
|
end
|
235
236
|
end
|
236
237
|
|
237
|
-
# User doesn't seem to have provided a keys file
|
238
|
-
UI.message("Looks like you don't have a Google Cloud #{DEFAULT_KEYS_FILE_NAME.cyan} file")
|
239
|
-
UI.message("If you have one, make sure to put it into the '#{Dir.pwd}' directory and call it '#{DEFAULT_KEYS_FILE_NAME.cyan}'")
|
238
|
+
# User doesn't seem to have provided a keys file
|
239
|
+
UI.message("Looks like you don't have a Google Cloud #{DEFAULT_KEYS_FILE_NAME.cyan} file yet.")
|
240
|
+
UI.message("If you have one, make sure to put it into the '#{Dir.pwd}' directory and call it '#{DEFAULT_KEYS_FILE_NAME.cyan}'.")
|
240
241
|
unless UI.confirm("Do you want fastlane to help you to create a #{DEFAULT_KEYS_FILE_NAME} file?")
|
241
242
|
UI.user_error!("Process stopped, run fastlane again to start things up again")
|
242
243
|
end
|
243
244
|
|
244
|
-
UI.message("fastlane will help you create a keys file.
|
245
|
+
UI.message("fastlane will help you create a keys file. Start by opening the following website:")
|
245
246
|
UI.message("")
|
246
247
|
UI.message("\t\thttps://console.cloud.google.com".cyan)
|
247
248
|
UI.message("")
|
248
|
-
UI.input("Press
|
249
|
+
UI.input("Press [Enter] once you're logged in")
|
249
250
|
|
250
|
-
UI.message("Now it's time to generate a new JSON auth file for fastlane to access Google Cloud")
|
251
251
|
UI.message("First, switch to the Google Cloud project you want to use.")
|
252
|
-
UI.message("If you don't have one yet, create a new one and switch to it")
|
252
|
+
UI.message("If you don't have one yet, create a new one and switch to it.")
|
253
253
|
UI.message("")
|
254
|
-
UI.message("\t\thttps://console.cloud.google.com/
|
254
|
+
UI.message("\t\thttps://console.cloud.google.com/projectcreate".cyan)
|
255
255
|
UI.message("")
|
256
|
-
UI.input("
|
256
|
+
UI.input("Press [Enter] once you selected the right project")
|
257
257
|
|
258
|
-
UI.message("
|
258
|
+
UI.message("Next fastlane will show you the steps to create a keys file.")
|
259
|
+
UI.message("For this it might be useful to switch the Google Cloud interface to English.")
|
260
|
+
UI.message("Append " + "&hl=en".cyan + " to the URL and the interface should be in English.")
|
261
|
+
UI.input("Press [Enter] to continue")
|
262
|
+
|
263
|
+
UI.message("Now it's time to generate a new JSON auth file for fastlane to access Google Cloud Storage:")
|
259
264
|
UI.message("")
|
260
|
-
UI.message("\t\t 1.
|
261
|
-
UI.message("\t\t 2.
|
262
|
-
UI.message("\t\t 3.
|
263
|
-
UI.message("\t\t 4.
|
264
|
-
UI.message("\t\t 5.
|
265
|
+
UI.message("\t\t 1. From the side menu choose 'APIs & Services' and then 'Credentials'".cyan)
|
266
|
+
UI.message("\t\t 2. Click 'Create credentials'".cyan)
|
267
|
+
UI.message("\t\t 3. Choose 'Service account key'".cyan)
|
268
|
+
UI.message("\t\t 4. Select 'New service account'".cyan)
|
269
|
+
UI.message("\t\t 5. Enter a name and ID for the service account".cyan)
|
270
|
+
UI.message("\t\t 6. Don't give the service account a role just yet!".cyan)
|
271
|
+
UI.message("\t\t 7. Make sure the key type is set to 'JSON'".cyan)
|
272
|
+
UI.message("\t\t 8. Click 'Create'".cyan)
|
265
273
|
UI.message("")
|
266
|
-
UI.input("Confirm with
|
274
|
+
UI.input("Confirm with [Enter] once you created and downloaded the JSON file")
|
267
275
|
|
268
276
|
UI.message("Copy the file to the current directory (#{Dir.pwd})")
|
269
277
|
UI.message("and rename it to `#{DEFAULT_KEYS_FILE_NAME.cyan}`")
|
270
278
|
UI.message("")
|
271
|
-
UI.input("Confirm with
|
279
|
+
UI.input("Confirm with [Enter]")
|
272
280
|
|
273
281
|
until File.exist?(DEFAULT_KEYS_FILE_NAME)
|
274
282
|
UI.message("Make sure to place the file in '#{Dir.pwd.cyan}' and name it '#{DEFAULT_KEYS_FILE_NAME.cyan}'")
|
275
|
-
UI.
|
283
|
+
UI.message("")
|
284
|
+
UI.input("Confirm with [Enter]")
|
276
285
|
end
|
277
286
|
|
278
287
|
UI.important("Please never add the #{DEFAULT_KEYS_FILE_NAME.cyan} file in version control.")
|
279
|
-
UI.important("Instead please add the file to your
|
280
|
-
UI.
|
288
|
+
UI.important("Instead please add the file to your `.gitignore` file")
|
289
|
+
UI.message("")
|
290
|
+
UI.input("Confirm with [Enter]")
|
281
291
|
|
282
292
|
return DEFAULT_KEYS_FILE_NAME
|
283
293
|
end
|
284
294
|
|
285
295
|
def ensure_bucket_is_selected
|
286
|
-
|
287
|
-
# be asked to provide one here
|
296
|
+
created_bucket = UI.confirm("Did you already create a Google Cloud Storage bucket?")
|
288
297
|
while self.bucket_name.to_s.length == 0
|
289
|
-
|
290
|
-
|
291
|
-
available_bucket_identifiers = self.gc_storage.buckets.collect(&:id)
|
292
|
-
if available_bucket_identifiers.count > 0
|
293
|
-
@bucket_name = UI.select("What Google Cloud Storage bucket do you want to use? (you can define it using the `google_cloud_bucket_name` key)", available_bucket_identifiers)
|
294
|
-
else
|
295
|
-
UI.error("Looks like your Google Cloud account for the project ID '#{self.google_cloud_project_id}' doesn't")
|
296
|
-
UI.error("have any available storage buckets yet. Please visit the following URL")
|
298
|
+
unless created_bucket
|
299
|
+
UI.message("Create a bucket at the following URL:")
|
297
300
|
UI.message("")
|
298
301
|
UI.message("\t\thttps://console.cloud.google.com/storage/browser".cyan)
|
299
302
|
UI.message("")
|
300
|
-
UI.message("
|
301
|
-
UI.message("
|
303
|
+
UI.message("Make sure to select the right project at the top of the page!")
|
304
|
+
UI.message("")
|
305
|
+
UI.message("\t\t 1. Click 'Create bucket'".cyan)
|
306
|
+
UI.message("\t\t 2. Enter a unique name".cyan)
|
307
|
+
UI.message("\t\t 3. Select a geographic location for your bucket".cyan)
|
308
|
+
UI.message("\t\t 4. Make sure the storage class is set to 'Standard'".cyan)
|
309
|
+
UI.message("\t\t 5. Click 'Create' to create the bucket".cyan)
|
302
310
|
UI.message("")
|
303
|
-
UI.input("
|
311
|
+
UI.input("Press [Enter] once you created a bucket")
|
312
|
+
end
|
313
|
+
bucket_name = UI.input("Enter the name of your bucket: ")
|
314
|
+
|
315
|
+
# Verify if the bucket exists
|
316
|
+
begin
|
317
|
+
bucket_exists = !self.gc_storage.bucket(bucket_name).nil?
|
318
|
+
rescue Google::Cloud::PermissionDeniedError
|
319
|
+
bucket_exists = true
|
320
|
+
end
|
321
|
+
created_bucket = bucket_exists
|
322
|
+
if bucket_exists
|
323
|
+
@bucket_name = bucket_name
|
324
|
+
else
|
325
|
+
UI.error("It looks like the bucket '#{bucket_name}' doesn't exist. Make sure to create it first.")
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
def check_bucket_permissions
|
331
|
+
bucket = nil
|
332
|
+
while bucket.nil?
|
333
|
+
begin
|
334
|
+
bucket = self.gc_storage.bucket(self.bucket_name)
|
335
|
+
rescue Google::Cloud::PermissionDeniedError
|
336
|
+
bucket = nil
|
304
337
|
end
|
338
|
+
return if bucket.nil? == false
|
339
|
+
UI.error("Looks like your Google Cloud account for the project ID '#{self.google_cloud_project_id}' doesn't")
|
340
|
+
UI.error("have access to the storage bucket '#{self.bucket_name}'. Please visit the following URL:")
|
341
|
+
UI.message("")
|
342
|
+
UI.message("\t\thttps://console.cloud.google.com/storage/browser".cyan)
|
343
|
+
UI.message("")
|
344
|
+
UI.message("You need to give your account the correct permissions:")
|
345
|
+
UI.message("")
|
346
|
+
UI.message("\t\t 1. Click on your bucket to open it".cyan)
|
347
|
+
UI.message("\t\t 2. Click 'Permissions'".cyan)
|
348
|
+
UI.message("\t\t 3. Click 'Add members'".cyan)
|
349
|
+
UI.message("\t\t 4. Enter the email of your service account".cyan)
|
350
|
+
UI.message("\t\t 5. Set the role to 'Storage Admin'".cyan)
|
351
|
+
UI.message("\t\t 6. Click 'Save'".cyan)
|
352
|
+
UI.message("")
|
353
|
+
UI.input("Confirm with [Enter] once you're finished")
|
305
354
|
end
|
306
355
|
end
|
307
356
|
end
|
@@ -192,6 +192,9 @@ module Spaceship
|
|
192
192
|
# @return (Hash) Represents the trailers of this app version (read-only)
|
193
193
|
attr_reader :trailers
|
194
194
|
|
195
|
+
# @return (Hash) A hash representing all in-app purchases that can get submitted with this version
|
196
|
+
attr_reader :in_app_purchases
|
197
|
+
|
195
198
|
# @return (Hash) Represents the phased_release hash (read-only)
|
196
199
|
# For now, please use the `toggle_phased_release` method and call `.save!`
|
197
200
|
# as the API will probably change in the future
|
@@ -233,6 +236,7 @@ module Spaceship
|
|
233
236
|
'supportsAppleWatch' => :supports_apple_watch,
|
234
237
|
'versionId' => :version_id,
|
235
238
|
'version.value' => :version,
|
239
|
+
'submittableAddOns.value' => :in_app_purchases,
|
236
240
|
'phasedRelease' => :phased_release,
|
237
241
|
|
238
242
|
# GeoJson
|
@@ -9,12 +9,20 @@ module Spaceship
|
|
9
9
|
# @return (String) the family name
|
10
10
|
attr_accessor :name
|
11
11
|
|
12
|
-
# @return (Intger) the
|
12
|
+
# @return (Intger) the family id
|
13
13
|
attr_accessor :family_id
|
14
14
|
|
15
|
+
# @return (Array) all linked in-app purchases of this family
|
16
|
+
attr_accessor :linked_iaps
|
17
|
+
|
18
|
+
# @return (Intger) amount of linked in-app purchases of this family (read-only)
|
19
|
+
attr_accessor :iap_count
|
20
|
+
|
15
21
|
attr_mapping({
|
16
22
|
'id' => :family_id,
|
17
|
-
'name.value' => :name
|
23
|
+
'name.value' => :name,
|
24
|
+
'activeAddOns' => :linked_iaps,
|
25
|
+
'totalActiveAddOns' => :iap_count
|
18
26
|
})
|
19
27
|
|
20
28
|
def versions=(value = {})
|
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.132.0.beta.
|
4
|
+
version: 2.132.0.beta.20190922200014
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew McBurney
|
@@ -27,7 +27,7 @@ authors:
|
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
30
|
-
date: 2019-09-
|
30
|
+
date: 2019-09-22 00:00:00.000000000 Z
|
31
31
|
dependencies:
|
32
32
|
- !ruby/object:Gem::Dependency
|
33
33
|
name: slack-notifier
|
@@ -1747,24 +1747,24 @@ metadata:
|
|
1747
1747
|
post_install_message:
|
1748
1748
|
rdoc_options: []
|
1749
1749
|
require_paths:
|
1750
|
-
-
|
1751
|
-
- deliver/lib
|
1752
|
-
- fastlane_core/lib
|
1753
|
-
- spaceship/lib
|
1754
|
-
- produce/lib
|
1755
|
-
- fastlane/lib
|
1756
|
-
- gym/lib
|
1757
|
-
- match/lib
|
1758
|
-
- sigh/lib
|
1750
|
+
- precheck/lib
|
1759
1751
|
- credentials_manager/lib
|
1760
1752
|
- cert/lib
|
1761
|
-
- frameit/lib
|
1762
|
-
- pem/lib
|
1763
1753
|
- supply/lib
|
1754
|
+
- deliver/lib
|
1755
|
+
- sigh/lib
|
1756
|
+
- match/lib
|
1757
|
+
- pem/lib
|
1758
|
+
- produce/lib
|
1764
1759
|
- screengrab/lib
|
1765
|
-
-
|
1766
|
-
-
|
1760
|
+
- gym/lib
|
1761
|
+
- spaceship/lib
|
1767
1762
|
- snapshot/lib
|
1763
|
+
- frameit/lib
|
1764
|
+
- fastlane_core/lib
|
1765
|
+
- fastlane/lib
|
1766
|
+
- pilot/lib
|
1767
|
+
- scan/lib
|
1768
1768
|
required_ruby_version: !ruby/object:Gem::Requirement
|
1769
1769
|
requirements:
|
1770
1770
|
- - ">="
|