fastlane 2.110.0 → 2.111.0.beta.20181211193027

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: ecf5c535346cd0fad0d5e2de96f0939a22ffd18c
4
- data.tar.gz: 056a8d34a3e55426e4d22879979ff0e54ef08168
3
+ metadata.gz: 521ad6f2779decbee1053eeb8246c05c6c83e312
4
+ data.tar.gz: 8e1d82ac4f6e4954930ae949f26c2be99737eb5c
5
5
  SHA512:
6
- metadata.gz: af2c55548c9a922734aeac5539ebadada203854344c909fb34cd5fbd016051fdaeffdc1085d230f5725f5b187c2d38a2cb317ae3355e706b86ae9ccb6467e1ec
7
- data.tar.gz: 2be46350521f8e099965d29cafcbf71c5c32c412ab62ebde332971e41d1be7670404154382c11dcabe2dcb14764e3e974c2b2d2061a3946101eb0adb0d2f120a
6
+ metadata.gz: 30674c9a28d82a5699a39db72ffe6233fa5bb899fe44c98f1731158bf1d760226176192e86105f35655041ba86adf00a2f1363c5bc69b7d4dcd6710291a7e645
7
+ data.tar.gz: ebcc40e3478f7c55abc94d68ca3bcde812b44a5e78a18328329d60f7f336cd00141d1329fd3aa5176ae2f45872ba53a79bb1944d028a5269a53cb859f4cd5b47
@@ -74,7 +74,13 @@ fastlane match init
74
74
 
75
75
  <img src="/img/actions/match_init.gif" width="550" />
76
76
 
77
- You'll be asked to enter the URL to your Git repo. This can be either a `https://` or a `git` URL. (If your machine is currently using SSH to authenticate with GitHub, you'll want to use a `git` URL, otherwise you may see an authentication error when you attempt to use match.) `fastlane match init` won't read or modify your certificates or profiles.
77
+ You'll be asked if you want to store your code signing identities inside a Git repo, or on Google Cloud.
78
+
79
+ #### Git Storage
80
+
81
+ Use Git Storage to store all code signing identities in a private git repo, owned and operated by you. The files will be encrypted using OpenSSL.
82
+
83
+ First, enter the URL to your Git repo. This can be either a `https://` or a `git` URL. (If your machine is currently using SSH to authenticate with GitHub, you'll want to use a `git` URL, otherwise you may see an authentication error when you attempt to use match.) `fastlane match init` won't read or modify your certificates or profiles yet, and also won't validate your git URL.
78
84
 
79
85
  This will create a `Matchfile` in your current directory (or in your `./fastlane/` folder).
80
86
 
@@ -87,15 +93,33 @@ app_identifier("tools.fastlane.app")
87
93
  username("user@fastlane.tools")
88
94
  ```
89
95
 
90
- #### Important: Use one git branch per team
96
+ #### Google Cloud Storage
97
+
98
+ Use [Google Cloud Storage](https://cloud.google.com/storage/) for a fully hosted solution for your code signing identities. Certificates are stored on Google Cloud, encrypted using Google managed keys. Everything will be stored on your Google account, inside a storage bucket you provide. You can also directly access the files using the web console.
99
+
100
+ This will create a `Matchfile` in your current directory (or in your `./fastlane/` folder).
101
+
102
+ Example content (for more advanced setups check out the [fastlane section](#fastlane)):
103
+
104
+ ```ruby-skip-tests
105
+ google_cloud_bucket_name("major-key-certificates")
106
+ ```
107
+
108
+ ### Multiple teams
109
+
110
+ #### Git Storage
91
111
 
92
- _match_ also supports storing certificates of multiple teams in one repo, by using separate git branches. If you work in multiple teams, make sure to set the `git_branch` parameter to a unique value per team. From there, _match_ will automatically create and use the specified branch for you.
112
+ Use one git branch per team. _match_ also supports storing certificates of multiple teams in one repo, by using separate git branches. If you work in multiple teams, make sure to set the `git_branch` parameter to a unique value per team. From there, _match_ will automatically create and use the specified branch for you.
93
113
 
94
114
  ```ruby
95
115
  match(git_branch: "team1", username: "user@team1.com")
96
116
  match(git_branch: "team2", username: "user@team2.com")
97
117
  ```
98
118
 
119
+ #### Google Cloud Storage
120
+
121
+ 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.
122
+
99
123
  ### Run
100
124
 
101
125
  > Before running _match_ for the first time, you should consider clearing your existing profiles and certificates using the [match nuke command](#nuke).
@@ -112,7 +136,7 @@ fastlane match development
112
136
 
113
137
  <img src="/img/actions/match_appstore_small.gif" width="550" />
114
138
 
115
- This will create a new certificate and provisioning profile (if required) and store them in your Git repo. If you previously ran _match_ it will automatically install the existing profiles from the Git repo.
139
+ This will create a new certificate and provisioning profile (if required) and store them in your selected storage. If you previously ran _match_ it will automatically install the existing profiles from storage.
116
140
 
117
141
  The provisioning profiles are installed in `~/Library/MobileDevice/Provisioning Profiles` while the certificates and private keys are installed in your Keychain.
118
142
 
@@ -130,7 +154,7 @@ fastlane action match
130
154
 
131
155
  #### Handle multiple targets
132
156
 
133
- If you have several targets with different bundle identifiers, supply them as a comma-separated list to :
157
+ If you have several targets with different bundle identifiers, supply them as a comma-separated list to:
134
158
 
135
159
  ```no-highlight
136
160
  fastlane match appstore -a tools.fastlane.app,tools.fastlane.app.watchkitapp
@@ -140,16 +164,17 @@ You can make this even easier using [_fastlane_](https://fastlane.tools) by crea
140
164
 
141
165
  ```ruby
142
166
  lane :certificates do
143
- match(app_identifier: ["com.krausefx.app1", "com.krausefx.app2", "com.krausefx.app3"], readonly: true)
167
+ match(app_identifier: ["com.krausefx.app1", "com.krausefx.app2", "com.krausefx.app3"])
144
168
  end
145
169
  ```
146
170
 
147
171
  Then all your team has to do is `fastlane certificates` and keys, certs and profiles for all targets will be synced.
148
172
 
149
173
  #### Handle multiple apps per developer/distribution certificate
174
+
150
175
  If you want to use a single developer and/or distribution certificate for multiple apps belonging to the same development team, you may use the same signing identities repository and branch to store the signing identities for your apps:
151
176
 
152
- Matchfile for both App #1 and #2:
177
+ `Matchfile` example for both App #1 and #2:
153
178
 
154
179
  ```ruby-skip-tests
155
180
  git_url("https://github.com/example/example-repo.git")
@@ -160,10 +185,30 @@ _match_ will reuse certificates and will create separate provisioning profiles f
160
185
 
161
186
  #### Passphrase
162
187
 
188
+ *Git Repo storage only*
189
+
163
190
  When running _match_ for the first time on a new machine, it will ask you for the passphrase for the Git repository. This is an additional layer of security: each of the files will be encrypted using `openssl`. Make sure to remember the password, as you'll need it when you run match on a different machine.
164
191
 
165
192
  To set the passphrase to decrypt your profiles using an environment variable, use `MATCH_PASSWORD`.
166
193
 
194
+ #### Migrate from Git Repo to Google Cloud
195
+
196
+ If you're already using a Git Repo, but would like to switch to using Google Cloud Storage, just run the following command to automatically migrate all your existing code signing identities and provisioning profiles
197
+
198
+ ```no-highlight
199
+ fastlane match migrate
200
+ ```
201
+
202
+ After a successful migration you can safely delete your git repo.
203
+
204
+ #### Google Cloud `gc_keys.json`
205
+
206
+ *Google Cloud Storage only*
207
+
208
+ When running `fastlane match init` the first time, the setup process will help you 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.
209
+
210
+ We recommend adding `gc_keys.json` to your `.gitignore` and manually add the file to all your work machines. Every developer should create their own `gc_keys.json` file, which 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.
211
+
167
212
  #### New machine
168
213
 
169
214
  To set up the certificates and provisioning profiles on a new machine, you just run the same command using:
@@ -178,22 +223,32 @@ You can also run _match_ in a `readonly` mode to be sure it won't create any new
178
223
  fastlane match development --readonly
179
224
  ```
180
225
 
226
+ We recommend to always use `readonly` mode when running _fastlane_ on CI systems. This can be done using
227
+
228
+ ```ruby
229
+ lane :beta do
230
+ match(type: "appstore", readonly: is_ci)
231
+
232
+ gym(scheme: "Release")
233
+ end
234
+ ```
235
+
181
236
  #### Access Control
182
237
 
183
238
  A benefit of using _match_ is that it enables you to give the developers of your team access to the code signing certificates without having to give everyone access to the Developer Portal:
184
239
 
185
- 1. Run _match_ to store the certificates in a Git repo
186
- 2. Grant access to the Git repo to your developers and give them the passphrase
187
- 3. The developers can now run _match_ which will install the latest code signing profiles so they can build and sign the application without having to have access to the developer portal
240
+ 1. Run _match_ to store the certificates in a Git repo or Google Cloud Storage
241
+ 2. Grant access to the Git repo / Google Cloud Storage Bucket to your developers and give them the passphrase (for git storage)
242
+ 3. The developers can now run _match_ which will install the latest code signing profiles so they can build and sign the application without having to have access to the Developer Portal
188
243
  4. Every time you run _match_ to update the profiles (e.g. add a new device), all your developers will automatically get the latest profiles when running _match_
189
244
 
190
- If you decide to run _match_ without access to the developer portal, make sure to use the `--readonly` option so that the commands don't ask you for the password to the developer portal.
245
+ If you decide to run _match_ without access to the Developer Portal, make sure to use the `--readonly` option so that the commands don't ask you for the password to the Developer Portal.
191
246
 
192
- The advantage of this approach is that no one in your team will revoke a certificate by mistake. Additionally it is recommended to install the [FixCode Xcode Plugin](https://github.com/neonichu/FixCode) to disable the `Fix Issue` button.
247
+ The advantage of this approach is that no one in your team will revoke a certificate by mistake, while having all code signing secrets in one location.
193
248
 
194
- #### Git Repo
249
+ #### Folder structure
195
250
 
196
- After running _match_ for the first time, your Git repo will contain 2 directories:
251
+ After running _match_ for the first time, your Git repo or Google Cloud bucket will contain 2 directories:
197
252
 
198
253
  - The `certs` folder contains all certificates with their private keys
199
254
  - The `profiles` folder contains all provisioning profiles
@@ -204,6 +259,8 @@ Additionally, _match_ creates a nice repo `README.md` for you, making it easy to
204
259
  <img src="/img/actions/github_repo.png" width="700" />
205
260
  </p>
206
261
 
262
+ In the case of Google Cloud, the top level folder will be the team ID.
263
+
207
264
  #### fastlane
208
265
 
209
266
  Add _match_ to your `Fastfile` to automatically fetch the latest code signing certificates with [_fastlane_](https://fastlane.tools).
@@ -211,15 +268,12 @@ Add _match_ to your `Fastfile` to automatically fetch the latest code signing ce
211
268
  ```
212
269
  match(type: "appstore")
213
270
 
214
- match(git_url: "https://github.com/fastlane/certificates",
215
- type: "development")
271
+ match(type: "development")
216
272
 
217
- match(git_url: "https://github.com/fastlane/certificates",
218
- type: "adhoc",
273
+ match(type: "adhoc",
219
274
  app_identifier: "tools.fastlane.app")
220
275
 
221
- match(git_url: "https://github.com/fastlane/certificates",
222
- type: "enterprise",
276
+ match(type: "enterprise",
223
277
  app_identifier: "tools.fastlane.app")
224
278
 
225
279
  # _match_ should be called before building the app with _gym_
@@ -250,21 +304,20 @@ fastlane match adhoc --force_for_new_devices
250
304
 
251
305
  ##### Multiple Targets
252
306
 
253
- If your app has multiple targets (e.g. Today Widget or WatchOS Extension)
307
+ If your app has multiple targets (e.g. Today Widget or watchOS Extension)
254
308
 
255
309
  ```ruby
256
310
  match(app_identifier: ["tools.fastlane.app", "tools.fastlane.app.today_widget"], type: "appstore")
257
311
  ```
258
312
 
259
- _match_ can even use the same one Git repository for all bundle identifiers.
313
+ _match_ can use the same one Git repository or Google Cloud Storage for all bundle identifiers.
260
314
 
261
315
  ##### Templates (aka: custom entitlements)
262
316
 
263
317
  Match can generate profiles that contain custom entitlements by passing in the entitlement's name with the `template_name` parameter.
264
318
 
265
319
  ```
266
- match(git_url: "https://github.com/fastlane/certificates",
267
- type: "development",
320
+ match(type: "development",
268
321
  template_name: "Apple Pay Pass Suppression Development")
269
322
  ```
270
323
 
@@ -288,7 +341,8 @@ You can statically select the right provisioning profile in your Xcode project (
288
341
 
289
342
  ### Continuous Integration
290
343
 
291
- #### Repo access
344
+ #### Git repo access
345
+
292
346
  There is one tricky part of setting up a CI system to work with _match_, which is enabling the CI to access the repo. Usually you'd just add your CI's public ssh key as a deploy key to your _match_ repo, but since your CI will already likely be using its public ssh key to access the codebase repo, [you won't be able to do that](https://help.github.com/articles/error-key-already-in-use/).
293
347
 
294
348
  Some repo hosts might allow you to use the same deploy key for different repos, but GitHub will not. If your host does, you don't need to worry about this, just add your CI's public ssh key as a deploy key for your _match_ repo and scroll down to "_Encryption password_".
@@ -300,9 +354,14 @@ There are a few ways around this:
300
354
 
301
355
  Neither solution is pretty. It's one of those _trade-off_ things. Do you care more about **not** having an extra account sitting around, or do you care more about having the :sparkles: of auto-syncing of credentials.
302
356
 
303
- #### Encryption password
357
+ #### Git repo encryption password
358
+
304
359
  Once you've decided which approach to take, all that's left to do is to set your encryption password as secret environment variable named `MATCH_PASSWORD`. _match_ will pick this up when it's run.
305
360
 
361
+ #### Google Cloud Storage access
362
+
363
+ Accessing Google Cloud Storage from your CI system requires you to provide the `gc_keys.json` file as part of your build. How you implement this is your decision. You can inject that file during build time.
364
+
306
365
  ### Nuke
307
366
 
308
367
  If you never really cared about code signing and have a messy Apple Developer account with a lot of invalid, expired or Xcode managed profiles/certificates, you can use the `match nuke` command to revoke your certificates and provisioning profiles. Don't worry, apps that are already available in the App Store / TestFlight will still work. Builds distributed via Ad Hoc or Enterprise will be disabled after nuking your account, so you'll have to re-upload a new build. After clearing your account you'll start from a clean state, and you can run _match_ to generate your certificates and profiles again.
@@ -319,6 +378,8 @@ fastlane match nuke enterprise
319
378
 
320
379
  You'll have to confirm a list of profiles / certificates that will be deleted.
321
380
 
381
+ ## Advanced Git Storage features
382
+
322
383
  ### Change Password
323
384
 
324
385
  To change the password of your repo and therefore decrypting and encrypting all files run:
@@ -362,34 +423,40 @@ openssl pkcs12 -export -out "cert.p12" -inkey "key.pem" -in "cert.pem" -password
362
423
 
363
424
  ## Is this secure?
364
425
 
426
+ ### Git
427
+
365
428
  Both your keys and provisioning profiles are encrypted using OpenSSL using a passphrase.
366
429
 
367
- Storing your private keys in a Git repo may sound off-putting at first. We did an in-depth analysis of potential security issues and came to the following conclusions:
430
+ Storing your private keys in a Git repo may sound off-putting at first. We did an analysis of potential security issues, see section below.
431
+
432
+ ### Google Cloud Storage
433
+
434
+ All your keys and provisioning profiles are encrypted using Google managed keys.
368
435
 
369
- #### What could happen if someone stole a private key?
436
+ ### What could happen if someone stole a private key?
370
437
 
371
438
  If attackers would have your certificate and provisioning profile, they could codesign an application with the same bundle identifier.
372
439
 
373
440
  What's the worst that could happen for each of the profile types?
374
441
 
375
- ##### App Store Profiles
442
+ #### App Store Profiles
376
443
 
377
444
  An App Store profile can't be used for anything as long as it's not re-signed by Apple. The only way to get an app resigned is to submit an app for review which could take anywhere from 24 hours to a few days (checkout [appreviewtimes.com](http://appreviewtimes.com) for up-to-date expectations). Attackers could only submit an app for review, if they also got access to your App Store Connect credentials (which are not stored in git, but in your local keychain). Additionally you get an email notification every time a build gets uploaded to cancel the submission even before your app gets into the review stage.
378
445
 
379
- ##### Development and Ad Hoc Profiles
446
+ #### Development and Ad Hoc Profiles
380
447
 
381
448
  In general those profiles are harmless as they can only be used to install a signed application on a small subset of devices. To add new devices, the attacker would also need your Apple Developer Portal credentials (which are not stored in git, but in your local keychain).
382
449
 
383
- ##### Enterprise Profiles
450
+ #### Enterprise Profiles
384
451
 
385
452
  Attackers could use an In-House profile to distribute signed application to a potentially unlimited number of devices. All this would run under your company name and it could eventually lead to Apple revoking your In-House account. However it is very easy to revoke a certificate to remotely break the app on all devices.
386
453
 
387
454
  Because of the potentially dangerous nature of In-House profiles please use _match_ with enterprise profiles with caution, ensure your git repository is private and use a secure password.
388
455
 
389
- ##### To sum up
456
+ #### To sum up
390
457
 
391
458
  - You have full control over the access list of your Git repo, no third party service involved
392
459
  - Even if your certificates are leaked, they can't be used to cause any harm without your App Store Connect login credentials
393
460
  - Use In-House enterprise profile with _match_ with caution
394
461
  - If you use GitHub or Bitbucket we encourage enabling 2 factor authentication for all accounts that have access to the certificates repo
395
- - The complete source code of _match_ is fully open source on [GitHub](https://docs.fastlane.tools/actions/match/)
462
+ - The complete source code of _match_ is fully open source on [GitHub](https://github.com/fastlane/fastlane/)
@@ -88,12 +88,6 @@ To get a list of available options run
88
88
  fastlane action deliver
89
89
  ```
90
90
 
91
- Select a previously uploaded build and submit it for review.
92
-
93
- ```no-highlight
94
- fastlane deliver submit_build --build_number 830
95
- ```
96
-
97
91
  ### Use in a `Fastfile`
98
92
 
99
93
  ```ruby
@@ -393,6 +387,32 @@ The english name of the secondary first sub category you want to set
393
387
  The english name of the secondary second sub category you want to set
394
388
  </details>
395
389
 
390
+ # Submit Build
391
+ _deliver_ allows you to promote an existing build to production. Below are examples to select a previously uploaded build and submit it for review.
392
+
393
+ ```no-highlight
394
+ fastlane deliver submit_build --build_number 830
395
+ ```
396
+
397
+ ### Submit build in a `Fastfile`
398
+
399
+ ```ruby
400
+ lane :submit_review do
401
+ deliver(
402
+ build_number: '830',
403
+ submit_for_review: true,
404
+ automatic_release: true,
405
+ force: true, # Skip HTMl report verification
406
+ skip_metadata: true,
407
+ skip_screenshots: true,
408
+ skip_binary_upload: true
409
+ )
410
+ end
411
+ ```
412
+
413
+ Omit `build_number` to let _fastlane_ automatically select the latest build number for the current version being edited for release from App Store Connect.
414
+
415
+
396
416
  # Credentials
397
417
 
398
418
  A detailed description about how your credentials are handled is available in a [credentials_manager](https://github.com/fastlane/fastlane/tree/master/credentials_manager).
@@ -122,7 +122,7 @@ Note that these will replace the current images and screenshots on the play stor
122
122
 
123
123
  ## Changelogs (What's new)
124
124
 
125
- You can add changelog files under the `changelogs/` directory for each locale. The filename should exactly match the version code of the APK that it represents. `fastlane supply init` will populate changelog files from existing data on Google Play if no `metadata/` directory exists when it is run.
125
+ You can add changelog files under the `changelogs/` directory for each locale. The filename should exactly match the [version code](https://developer.android.com/studio/publish/versioning#appversioning) of the APK that it represents. `fastlane supply init` will populate changelog files from existing data on Google Play if no `metadata/` directory exists when it is run.
126
126
 
127
127
  ```no-highlight
128
128
  └── fastlane
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.110.0'.freeze
2
+ VERSION = '2.111.0.beta.20181211193027'.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
@@ -197,6 +197,10 @@ module Match
197
197
  UI.input("Confirm with enter")
198
198
  end
199
199
 
200
+ UI.important("Please never add the #{DEFAULT_KEYS_FILE_NAME.cyan} file in version control.")
201
+ UI.important("Instead please add the file to your .gitignore")
202
+ UI.input("Confirm with enter")
203
+
200
204
  return DEFAULT_KEYS_FILE_NAME
201
205
  end
202
206
 
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.110.0
4
+ version: 2.111.0.beta.20181211193027
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
@@ -923,7 +923,6 @@ files:
923
923
  - deliver/lib/assets/ScreenshotsHelp
924
924
  - deliver/lib/assets/summary.html.erb
925
925
  - deliver/lib/deliver.rb
926
- - deliver/lib/deliver/.options.rb.swp
927
926
  - deliver/lib/deliver/app_screenshot.rb
928
927
  - deliver/lib/deliver/commands_generator.rb
929
928
  - deliver/lib/deliver/detect_values.rb
@@ -1280,7 +1279,6 @@ files:
1280
1279
  - fastlane/swift/Fastlane.swift
1281
1280
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj
1282
1281
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
1283
- - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate
1284
1282
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme
1285
1283
  - fastlane/swift/FastlaneSwiftRunner/README.txt
1286
1284
  - fastlane/swift/Gymfile.swift
@@ -1558,8 +1556,6 @@ files:
1558
1556
  - spaceship/lib/assets/languageMapping.json
1559
1557
  - spaceship/lib/assets/languageMappingReadable.json
1560
1558
  - spaceship/lib/spaceship.rb
1561
- - spaceship/lib/spaceship/api/.DS_Store
1562
- - spaceship/lib/spaceship/api/.base.rb.swp
1563
1559
  - spaceship/lib/spaceship/babosa_fix.rb
1564
1560
  - spaceship/lib/spaceship/base.rb
1565
1561
  - spaceship/lib/spaceship/client.rb
@@ -1707,12 +1703,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
1707
1703
  version: 2.0.0
1708
1704
  required_rubygems_version: !ruby/object:Gem::Requirement
1709
1705
  requirements:
1710
- - - ">="
1706
+ - - ">"
1711
1707
  - !ruby/object:Gem::Version
1712
- version: '0'
1708
+ version: 1.3.1
1713
1709
  requirements: []
1714
1710
  rubyforge_project:
1715
- rubygems_version: 2.5.2.3
1711
+ rubygems_version: 2.6.8
1716
1712
  signing_key:
1717
1713
  specification_version: 4
1718
1714
  summary: The easiest way to automate beta deployments and releases for your iOS and
Binary file
Binary file