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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a9a1370c917620f6b6c1343a7c77d36be8f56b48
4
- data.tar.gz: 6b12512f2c5a89b7a44f7d488f9a76924603ebcf
3
+ metadata.gz: 9a1ca53c03f79a2ab3085b365d28c70023b6b30a
4
+ data.tar.gz: 73dc05ecd0c1da1b68098c0aae53893297f5918c
5
5
  SHA512:
6
- metadata.gz: cb7b0fbdcfc4223bedb37c6cebba6e6df517f200bcf26089e2ce7af8a470975ad8ff7b9465738b683c5051a2cf6b3711dbcdd08a72da240c2169d256629c12b3
7
- data.tar.gz: 017fdafd04e914ffc94f1572a30bd2b7c0f0c8077de032f80f8d7697e9fddb491bce20d4e0f14e6767280bb12925235720afc5fa6bd8d436ee5a45f47c21b001
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 [https://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
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 auth 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`
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.20190921200021'.freeze
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. First, open the following website")
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 enter once you're logged in")
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/apis/credentials".cyan)
254
+ UI.message("\t\thttps://console.cloud.google.com/projectcreate".cyan)
255
255
  UI.message("")
256
- UI.input("Ensure the right project is selected on top of the page and confirm with enter")
256
+ UI.input("Press [Enter] once you selected the right project")
257
257
 
258
- UI.message("Now create a new JSON auth file by clicking on")
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. Create credentials".cyan)
261
- UI.message("\t\t 2. Service account key".cyan)
262
- UI.message("\t\t 3. App Engine default service account".cyan)
263
- UI.message("\t\t 4. JSON".cyan)
264
- UI.message("\t\t 5. Create".cyan)
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 enter once you created and download the JSON file")
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 enter")
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.input("Confirm with enter")
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 .gitignore")
280
- UI.input("Confirm with enter")
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
- # In case the user didn't provide a bucket name yet, they will
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
- # Have a nice selection of the available buckets here
290
- # This can only happen after we went through auth of Google Cloud
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("and make sure to have the right project selected on top of the page")
301
- UI.message("click on " + "Create Bucket".cyan + ", choose a name and confirm")
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("Once you're finished, please confirm with enter")
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 Family Id
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.20190921200021
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-21 00:00:00.000000000 Z
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
- - scan/lib
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
- - pilot/lib
1766
- - precheck/lib
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
  - - ">="