fastlane 2.96.0.beta.20180521050117 → 2.96.0

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: 0eca2d7ee206d4ee9fbb1a28d7be7d9ff251113e
4
- data.tar.gz: 268ab4d34cc6911896899576bf2f05d24ebb8b4e
3
+ metadata.gz: 4d6f2db45c6b7964ddef4cfffd143509b5041e39
4
+ data.tar.gz: c1a14a73094bd8c5d0ce552118993d34d6555836
5
5
  SHA512:
6
- metadata.gz: b8777c624c195ab99f3babcf08d21e94f7d826c147430a53b13856087bd3cffe68a5bfbfa98cb25f5e212e19222cbe808f5bde788e76cc70ba1ebdd97b59927a
7
- data.tar.gz: ec517ed66259aa1758522826b8ae514c9f03b6727a2c3a918552efd18923638b1cf9ea91fd1e5bbb81f0ed1d0ee80662c78b83b433c32ee53e6bba1717cdbc05
6
+ metadata.gz: c2750d952fa4da1517492acc4685ed1e9e86e5f74a9909f2c9f6994bf3413f2db6c13f335c43b7329584938d8fe8f9e4aa46c97f4b2a3729d005a35eff307f65
7
+ data.tar.gz: 40754777e16327ef27e2d0008d5e139f9466475f5927cd909dc8f2a1f4e4f45921d4f9686c86bd17d71a3c4ed4e0c98c777560a2c27cbe50f3819c383161457d
data/README.md CHANGED
@@ -32,17 +32,17 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
32
32
 
33
33
  <table id='team'>
34
34
  <tr>
35
- <td id='fumiya-nakamura'>
36
- <a href='https://github.com/nafu'>
37
- <img src='https://github.com/nafu.png?size=140'>
35
+ <td id='iulian-onofrei'>
36
+ <a href='https://github.com/revolter'>
37
+ <img src='https://github.com/revolter.png?size=140'>
38
38
  </a>
39
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
39
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
40
40
  </td>
41
- <td id='helmut-januschka'>
42
- <a href='https://github.com/hjanuschka'>
43
- <img src='https://github.com/hjanuschka.png?size=140'>
41
+ <td id='kohki-miki'>
42
+ <a href='https://github.com/giginet'>
43
+ <img src='https://github.com/giginet.png?size=140'>
44
44
  </a>
45
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
45
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
46
46
  </td>
47
47
  <td id='manu-wallner'>
48
48
  <a href='https://github.com/milch'>
@@ -50,25 +50,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
50
50
  </a>
51
51
  <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
52
52
  </td>
53
- <td id='olivier-halligon'>
54
- <a href='https://github.com/AliSoftware'>
55
- <img src='https://github.com/AliSoftware.png?size=140'>
53
+ <td id='jan-piotrowski'>
54
+ <a href='https://github.com/janpio'>
55
+ <img src='https://github.com/janpio.png?size=140'>
56
56
  </a>
57
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
57
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
58
58
  </td>
59
+ <td id='luka-mirosevic'>
60
+ <a href='https://github.com/lmirosevic'>
61
+ <img src='https://github.com/lmirosevic.png?size=140'>
62
+ </a>
63
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
64
+ </td>
65
+ </tr>
66
+ <tr>
59
67
  <td id='felix-krause'>
60
68
  <a href='https://github.com/KrauseFx'>
61
69
  <img src='https://github.com/KrauseFx.png?size=140'>
62
70
  </a>
63
71
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
64
72
  </td>
65
- </tr>
66
- <tr>
67
- <td id='joshua-liebowitz'>
68
- <a href='https://github.com/taquitos'>
69
- <img src='https://github.com/taquitos.png?size=140'>
73
+ <td id='olivier-halligon'>
74
+ <a href='https://github.com/AliSoftware'>
75
+ <img src='https://github.com/AliSoftware.png?size=140'>
70
76
  </a>
71
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
77
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
72
78
  </td>
73
79
  <td id='jimmy-dee'>
74
80
  <a href='https://github.com/jdee'>
@@ -76,11 +82,11 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
76
82
  </a>
77
83
  <h4 align='center'>Jimmy Dee</h4>
78
84
  </td>
79
- <td id='maksym-grebenets'>
80
- <a href='https://github.com/mgrebenets'>
81
- <img src='https://github.com/mgrebenets.png?size=140'>
85
+ <td id='josh-holtz'>
86
+ <a href='https://github.com/joshdholtz'>
87
+ <img src='https://github.com/joshdholtz.png?size=140'>
82
88
  </a>
83
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
89
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
84
90
  </td>
85
91
  <td id='aaron-brager'>
86
92
  <a href='https://github.com/getaaron'>
@@ -88,46 +94,46 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
88
94
  </a>
89
95
  <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
90
96
  </td>
91
- <td id='danielle-tomlinson'>
92
- <a href='https://github.com/DanToml'>
93
- <img src='https://github.com/DanToml.png?size=140'>
94
- </a>
95
- <h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
96
- </td>
97
97
  </tr>
98
98
  <tr>
99
- <td id='jan-piotrowski'>
100
- <a href='https://github.com/janpio'>
101
- <img src='https://github.com/janpio.png?size=140'>
99
+ <td id='maksym-grebenets'>
100
+ <a href='https://github.com/mgrebenets'>
101
+ <img src='https://github.com/mgrebenets.png?size=140'>
102
102
  </a>
103
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
103
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
104
104
  </td>
105
- <td id='josh-holtz'>
106
- <a href='https://github.com/joshdholtz'>
107
- <img src='https://github.com/joshdholtz.png?size=140'>
105
+ <td id='jorge-revuelta-h'>
106
+ <a href='https://github.com/minuscorp'>
107
+ <img src='https://github.com/minuscorp.png?size=140'>
108
108
  </a>
109
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
109
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
110
110
  </td>
111
- <td id='iulian-onofrei'>
112
- <a href='https://github.com/revolter'>
113
- <img src='https://github.com/revolter.png?size=140'>
111
+ <td id='jérôme-lacoste'>
112
+ <a href='https://github.com/lacostej'>
113
+ <img src='https://github.com/lacostej.png?size=140'>
114
114
  </a>
115
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
115
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
116
116
  </td>
117
- <td id='matthew-ellis'>
118
- <a href='https://github.com/matthewellis'>
119
- <img src='https://github.com/matthewellis.png?size=140'>
117
+ <td id='fumiya-nakamura'>
118
+ <a href='https://github.com/nafu'>
119
+ <img src='https://github.com/nafu.png?size=140'>
120
120
  </a>
121
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
121
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
122
122
  </td>
123
- <td id='jorge-revuelta-h'>
124
- <a href='https://github.com/minuscorp'>
125
- <img src='https://github.com/minuscorp.png?size=140'>
123
+ <td id='danielle-tomlinson'>
124
+ <a href='https://github.com/DanToml'>
125
+ <img src='https://github.com/DanToml.png?size=140'>
126
126
  </a>
127
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
127
+ <h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
128
128
  </td>
129
129
  </tr>
130
130
  <tr>
131
+ <td id='joshua-liebowitz'>
132
+ <a href='https://github.com/taquitos'>
133
+ <img src='https://github.com/taquitos.png?size=140'>
134
+ </a>
135
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
136
+ </td>
131
137
  <td id='stefan-natchev'>
132
138
  <a href='https://github.com/snatchev'>
133
139
  <img src='https://github.com/snatchev.png?size=140'>
@@ -140,23 +146,17 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
140
146
  </a>
141
147
  <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
142
148
  </td>
143
- <td id='jérôme-lacoste'>
144
- <a href='https://github.com/lacostej'>
145
- <img src='https://github.com/lacostej.png?size=140'>
146
- </a>
147
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
148
- </td>
149
- <td id='luka-mirosevic'>
150
- <a href='https://github.com/lmirosevic'>
151
- <img src='https://github.com/lmirosevic.png?size=140'>
149
+ <td id='matthew-ellis'>
150
+ <a href='https://github.com/matthewellis'>
151
+ <img src='https://github.com/matthewellis.png?size=140'>
152
152
  </a>
153
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
153
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
154
154
  </td>
155
- <td id='kohki-miki'>
156
- <a href='https://github.com/giginet'>
157
- <img src='https://github.com/giginet.png?size=140'>
155
+ <td id='helmut-januschka'>
156
+ <a href='https://github.com/hjanuschka'>
157
+ <img src='https://github.com/hjanuschka.png?size=140'>
158
158
  </a>
159
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
159
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
160
160
  </td>
161
161
  </tr>
162
162
  </table>
@@ -44,7 +44,7 @@ Key | Description | Default
44
44
  <%- (action.available_options || []).each do |config_item| -%>
45
45
  <%- next unless config_item.kind_of?(FastlaneCore::ConfigItem) -%>
46
46
  <%- next if config_item.description.to_s.length == 0 -%>
47
- `<%= config_item.key %>` | <%= config_item.description %> | <%= config_item.doc_default_value %>
47
+ `<%= config_item.key %>` | <%= config_item.description.gsub(/(?<!\\)\|/, "\\|") %> | <%= config_item.doc_default_value %>
48
48
  <%- end %>
49
49
  <em id="parameters-legend-dynamic">* = default value is dependent on the user's system</em>
50
50
  <% end %><%# End of action.available_options... %>
@@ -64,7 +64,7 @@ module Fastlane
64
64
  default_value: true),
65
65
  FastlaneCore::ConfigItem.new(key: :repo_update,
66
66
  env_name: "FL_COCOAPODS_REPO_UPDATE",
67
- description: "Run `pod repo update` before install",
67
+ description: "Add `--repo-update` flag to `pod install` command",
68
68
  is_string: false,
69
69
  default_value: false,
70
70
  conflicting_options: [:try_repo_update_on_error]),
@@ -30,64 +30,76 @@ _produce_ creates new iOS apps on both the Apple Developer Portal and iTunes Con
30
30
 
31
31
  ## Creating a new application
32
32
 
33
- fastlane produce
33
+ ```no-highlight
34
+ fastlane produce
35
+ ```
34
36
 
35
37
  To get a list of all available parameters:
36
38
 
37
- fastlane produce --help
38
-
39
- ```no-highlight
40
- Commands: (* default)
41
- associate_group Associate with a group, which is created if needed or simply located otherwise
42
- associate_merchant Associate with a merchant for use with Apple Pay. Apple Pay will be enabled for this app
43
- create * Creates a new app on iTunes Connect and the Apple Developer Portal
44
- disable_services Disable specific Application Services for a specific app on the Apple Developer Portal
45
- enable_services Enable specific Application Services for a specific app on the Apple Developer Portal
46
- group Ensure that a specific App Group exists
47
- help Display global or [command] help documentation
48
- merchant Ensure that a specific Merchant exists
49
-
50
- Global Options:
51
- --verbose
52
- -h, --help Display help documentation
53
- -v, --version Display version information
54
-
55
- Options for create:
56
- -u, --username STRING Your Apple ID Username (PRODUCE_USERNAME)
57
- -a, --app_identifier STRING App Identifier (Bundle ID, e.g. com.krausefx.app) (PRODUCE_APP_IDENTIFIER)
58
- -e, --bundle_identifier_suffix STRING App Identifier Suffix (Ignored if App Identifier does not ends with .*) (PRODUCE_APP_IDENTIFIER_SUFFIX)
59
- -q, --app_name STRING App Name (PRODUCE_APP_NAME)
60
- -z, --app_version STRING Initial version number (e.g. '1.0') (PRODUCE_VERSION)
61
- -y, --sku STRING SKU Number (e.g. '1234') (PRODUCE_SKU)
62
- -j, --platform STRING The platform to use (optional) (PRODUCE_PLATFORM)
63
- -m, --language STRING Primary Language (e.g. 'English', 'German') (PRODUCE_LANGUAGE)
64
- -c, --company_name STRING The name of your company. Only required if it's the first app you create (PRODUCE_COMPANY_NAME)
65
- -i, --skip_itc [VALUE] Skip the creation of the app on iTunes Connect (PRODUCE_SKIP_ITC)
66
- -d, --skip_devcenter [VALUE] Skip the creation of the app on the Apple Developer Portal (PRODUCE_SKIP_DEVCENTER)
67
- -s, --itc_users ARRAY Array of iTunes Connect users. If provided, you can limit access to this newly created app for users with the App Manager, Developer, Marketer or Sales roles (ITC_USERS)
68
- -b, --team_id STRING The ID of your Developer Portal team if you're in multiple teams (PRODUCE_TEAM_ID)
69
- -l, --team_name STRING The name of your Developer Portal team if you're in multiple teams (PRODUCE_TEAM_NAME)
70
- -k, --itc_team_id [VALUE] The ID of your iTunes Connect team if you're in multiple teams (PRODUCE_ITC_TEAM_ID)
71
- -p, --itc_team_name STRING The name of your iTunes Connect team if you're in multiple teams (PRODUCE_ITC_TEAM_NAME)
39
+ ```no-highlight
40
+ fastlane produce --help
41
+ ```
42
+
43
+ ```no-highlight
44
+ Commands: (* default)
45
+ associate_group Associate with a group, which is created if needed or simply located otherwise
46
+ associate_merchant Associate with a merchant for use with Apple Pay. Apple Pay will be enabled for this app
47
+ create * Creates a new app on iTunes Connect and the Apple Developer Portal
48
+ disable_services Disable specific Application Services for a specific app on the Apple Developer Portal
49
+ enable_services Enable specific Application Services for a specific app on the Apple Developer Portal
50
+ group Ensure that a specific App Group exists
51
+ help Display global or [command] help documentation
52
+ merchant Ensure that a specific Merchant exists
53
+
54
+ Global Options:
55
+ --verbose
56
+ -h, --help Display help documentation
57
+ -v, --version Display version information
58
+
59
+ Options for create:
60
+ -u, --username STRING Your Apple ID Username (PRODUCE_USERNAME)
61
+ -a, --app_identifier STRING App Identifier (Bundle ID, e.g. com.krausefx.app) (PRODUCE_APP_IDENTIFIER)
62
+ -e, --bundle_identifier_suffix STRING App Identifier Suffix (Ignored if App Identifier does not ends with .*) (PRODUCE_APP_IDENTIFIER_SUFFIX)
63
+ -q, --app_name STRING App Name (PRODUCE_APP_NAME)
64
+ -z, --app_version STRING Initial version number (e.g. '1.0') (PRODUCE_VERSION)
65
+ -y, --sku STRING SKU Number (e.g. '1234') (PRODUCE_SKU)
66
+ -j, --platform STRING The platform to use (optional) (PRODUCE_PLATFORM)
67
+ -m, --language STRING Primary Language (e.g. 'English', 'German') (PRODUCE_LANGUAGE)
68
+ -c, --company_name STRING The name of your company. Only required if it's the first app you create (PRODUCE_COMPANY_NAME)
69
+ -i, --skip_itc [VALUE] Skip the creation of the app on iTunes Connect (PRODUCE_SKIP_ITC)
70
+ -d, --skip_devcenter [VALUE] Skip the creation of the app on the Apple Developer Portal (PRODUCE_SKIP_DEVCENTER)
71
+ -s, --itc_users ARRAY Array of iTunes Connect users. If provided, you can limit access to this newly created app for users with the App Manager, Developer, Marketer or Sales roles (ITC_USERS)
72
+ -b, --team_id STRING The ID of your Developer Portal team if you're in multiple teams (PRODUCE_TEAM_ID)
73
+ -l, --team_name STRING The name of your Developer Portal team if you're in multiple teams (PRODUCE_TEAM_NAME)
74
+ -k, --itc_team_id [VALUE] The ID of your iTunes Connect team if you're in multiple teams (PRODUCE_ITC_TEAM_ID)
75
+ -p, --itc_team_name STRING The name of your iTunes Connect team if you're in multiple teams (PRODUCE_ITC_TEAM_NAME)
72
76
  ```
73
77
 
74
78
  ## Enabling / Disabling Application Services
75
79
 
76
80
  If you want to enable Application Services for an App ID (HomeKit and HealthKit in this example):
77
81
 
78
- fastlane produce enable_services --homekit --healthkit
82
+ ```no-highlight
83
+ fastlane produce enable_services --homekit --healthkit
84
+ ```
79
85
 
80
86
  If you want to disable Application Services for an App ID (iCloud in this case):
81
87
 
82
- fastlane produce disable_services --icloud
88
+ ```no-highlight
89
+ fastlane produce disable_services --icloud
90
+ ```
83
91
 
84
92
  If you want to create a new App Group:
85
93
 
86
- fastlane produce group -g group.krausefx -n "Example App Group"
94
+ ```no-highlight
95
+ fastlane produce group -g group.krausefx -n "Example App Group"
96
+ ```
87
97
 
88
98
  If you want to associate an app with an App Group:
89
99
 
90
- fastlane produce associate_group -a com.krausefx.app group.krausefx
100
+ ```no-highlight
101
+ fastlane produce associate_group -a com.krausefx.app group.krausefx
102
+ ```
91
103
 
92
104
  # Parameters
93
105
 
@@ -98,55 +110,55 @@ fastlane produce enable_services --help
98
110
  ```
99
111
 
100
112
  ```no-highlight
101
- --app-group Enable App Groups
102
- --apple-pay Enable Apple Pay
103
- --associated-domains Enable Associated Domains
104
- --data-protection STRING Enable Data Protection, suitable values are "complete", "unlessopen" and "untilfirstauth"
105
- --game-center Enable Game Center
106
- --healthkit Enable HealthKit
107
- --homekit Enable HomeKit
108
- --hotspot Enable Hotspot
109
- --icloud STRING Enable iCloud, suitable values are "legacy" and "cloudkit"
110
- --in-app-purchase Enable In-App Purchase
111
- --inter-app-audio Enable Inter-App-Audio
112
- --multipath Enable Multipath
113
- --network-extension Enable Network Extensions
114
- --nfc-tag-reading Enable NFC Tag Reading
115
- --personal-vpn Enable Personal VPN
116
- --passbook Enable Passbook (deprecated)
117
- --push-notification Enable Push notification (only enables the service, does not configure certificates)
118
- --sirikit Enable SiriKit
119
- --vpn-conf Enable VPN Configuration (deprecated)
120
- --wallet Enable Wallet
121
- --wireless-conf Enable Wireless Accessory Configuration
113
+ --app-group Enable App Groups
114
+ --apple-pay Enable Apple Pay
115
+ --associated-domains Enable Associated Domains
116
+ --data-protection STRING Enable Data Protection, suitable values are "complete", "unlessopen" and "untilfirstauth"
117
+ --game-center Enable Game Center
118
+ --healthkit Enable HealthKit
119
+ --homekit Enable HomeKit
120
+ --hotspot Enable Hotspot
121
+ --icloud STRING Enable iCloud, suitable values are "legacy" and "cloudkit"
122
+ --in-app-purchase Enable In-App Purchase
123
+ --inter-app-audio Enable Inter-App-Audio
124
+ --multipath Enable Multipath
125
+ --network-extension Enable Network Extensions
126
+ --nfc-tag-reading Enable NFC Tag Reading
127
+ --personal-vpn Enable Personal VPN
128
+ --passbook Enable Passbook (deprecated)
129
+ --push-notification Enable Push notification (only enables the service, does not configure certificates)
130
+ --sirikit Enable SiriKit
131
+ --vpn-conf Enable VPN Configuration (deprecated)
132
+ --wallet Enable Wallet
133
+ --wireless-conf Enable Wireless Accessory Configuration
122
134
  ```
123
135
 
124
136
  ```no-highlight
125
137
  fastlane produce disable_services --help
126
138
  ```
127
139
 
128
- ```
129
- --app-group Disable App Groups
130
- --apple-pay Disable Apple Pay
131
- --associated-domains Disable Associated Domains
132
- --data-protection Disable Data Protection
133
- --game-center Disable Game Center
134
- --healthkit Disable HealthKit
135
- --homekit Disable HomeKit
136
- --hotspot Disable Hotspot
137
- --icloud Disable iCloud
138
- --in-app-purchase Disable In-App Purchase
139
- --inter-app-audio Disable Inter-App-Audio
140
- --multipath Disable Multipath
141
- --network-extension Disable Network Extensions
142
- --nfc-tag-reading Disable NFC Tag Reading
143
- --personal-vpn Disable Personal VPN
144
- --passbook Disable Passbook (deprecated)
145
- --push-notification Disable Push notifications
146
- --sirikit Disable SiriKit
147
- --vpn-conf Disable VPN Configuration (deprecated)
148
- --wallet Disable Wallet
149
- --wireless-conf Disable Wireless Accessory Configuration
140
+ ```no-highlight
141
+ --app-group Disable App Groups
142
+ --apple-pay Disable Apple Pay
143
+ --associated-domains Disable Associated Domains
144
+ --data-protection Disable Data Protection
145
+ --game-center Disable Game Center
146
+ --healthkit Disable HealthKit
147
+ --homekit Disable HomeKit
148
+ --hotspot Disable Hotspot
149
+ --icloud Disable iCloud
150
+ --in-app-purchase Disable In-App Purchase
151
+ --inter-app-audio Disable Inter-App-Audio
152
+ --multipath Disable Multipath
153
+ --network-extension Disable Network Extensions
154
+ --nfc-tag-reading Disable NFC Tag Reading
155
+ --personal-vpn Disable Personal VPN
156
+ --passbook Disable Passbook (deprecated)
157
+ --push-notification Disable Push notifications
158
+ --sirikit Disable SiriKit
159
+ --vpn-conf Disable VPN Configuration (deprecated)
160
+ --wallet Disable Wallet
161
+ --wireless-conf Disable Wireless Accessory Configuration
150
162
  ```
151
163
 
152
164
  ## Creating Apple Pay merchants and associating them with an App ID
@@ -158,7 +170,8 @@ fastlane produce merchant -o merchant.com.example.production -r "Example Merchan
158
170
  ```
159
171
 
160
172
  Use `--help` for more information about all available parameters
161
- ```
173
+
174
+ ```no-highlight
162
175
  fastlane produce merchant --help
163
176
  ```
164
177
 
@@ -309,7 +309,7 @@ You'll have to confirm a list of profiles / certificates that will be deleted.
309
309
 
310
310
  ### Change Password
311
311
 
312
- To change the password of your repo and therefore decrypting and encrypting all files run
312
+ To change the password of your repo and therefore decrypting and encrypting all files run:
313
313
 
314
314
  ```no-highlight
315
315
  fastlane match change_password
@@ -327,20 +327,23 @@ openssl aes-256-cbc -k "<password>" -in "<fileYouWantToDecryptPath>" -out "<decr
327
327
 
328
328
  #### Export Distribution Certificate and Private Key as Single .p12 File
329
329
 
330
- _match_ stores the certificate (.cer) and the private key (.p12) files separately. The following steps will repackage the separate certificate and private key into a single .p12 file.
330
+ _match_ stores the certificate (`.cer`) and the private key (`.p12`) files separately. The following steps will repackage the separate certificate and private key into a single `.p12` file.
331
+
332
+ Decrypt your cert found in `certs/<type>/<unique-id>.cer` as a pem file:
331
333
 
332
- Decrypt your cert found in certs/`<type>`/`<unique-id>`.cer as a pem file
333
334
  ```no-highlight
334
335
  openssl aes-256-cbc -k "<password>" -in "certs/<type>/<unique-id>.cer" -out "cert.dem" -a -d
335
336
  openssl x509 -inform der -in cert.der -out cert.pem
336
337
  ```
337
338
 
338
- Decrypt your private key found in certs/`<type>`/`<unique-id>`.p12 as a pem file
339
+ Decrypt your private key found in `certs/<type>/<unique-id>.p12` as a pem file:
340
+
339
341
  ```no-highlight
340
342
  openssl aes-256-cbc -k "<password>" -in "certs/distribution/<unique-id>.p12" -out "key.pem" -a -d
341
343
  ```
342
344
 
343
- Generate an encrypted p12 file with the same or new password
345
+ Generate an encrypted p12 file with the same or new password:
346
+
344
347
  ```no-highlight
345
348
  openssl pkcs12 -export -out "cert.p12" -inkey "key.pem' -in "cert.pem" -password pass:<password>
346
349
  ```
@@ -4,7 +4,7 @@
4
4
 
5
5
  ###### Command line tool for updating Android apps and their metadata on the Google Play Store
6
6
 
7
- _supply_ uploads app metadata, screenshots and binaries to Google Play. You can also select tracks for builds and promote builds to production.
7
+ _supply_ uploads app metadata, screenshots, binaries, and app bundles to Google Play. You can also select tracks for builds and promote builds to production.
8
8
 
9
9
  -------
10
10
 
@@ -14,6 +14,7 @@ _supply_ uploads app metadata, screenshots and binaries to Google Play. You can
14
14
  <a href="#quick-start">Quick Start</a> &bull;
15
15
  <a href="#available-commands">Commands</a> &bull;
16
16
  <a href="#uploading-an-apk">Uploading an APK</a> &bull;
17
+ <a href="#uploading-an-aab">Uploading an AAB</a> &bull;
17
18
  <a href="#images-and-screenshots">Images</a>
18
19
  </p>
19
20
 
@@ -21,7 +22,7 @@ _supply_ uploads app metadata, screenshots and binaries to Google Play. You can
21
22
 
22
23
  ## Features
23
24
  - Update existing Android applications on Google Play via the command line
24
- - Upload new builds (APKs)
25
+ - Upload new builds (APKs and AABs)
25
26
  - Retrieve and edit metadata, such as title and description, for multiple languages
26
27
  - Upload the app icon, promo graphics and screenshots for multiple languages
27
28
  - Have a local copy of the metadata in your git repository
@@ -95,6 +96,22 @@ Expansion files (obbs) found under the same directory as your APK will also be u
95
96
  - they are identified as type 'main' or 'patch' (by containing 'main' or 'patch' in their file name)
96
97
  - you have at most one of each type
97
98
 
99
+ ## Uploading an AAB
100
+
101
+ To upload a new [Android application bundle](https://developer.android.com/guide/app-bundle/) to Google Play, simply run
102
+
103
+ ```no-highlight
104
+ fastlane supply --aab path/to/app.aab
105
+ ```
106
+
107
+ This will also upload app metadata if you previously ran `fastlane supply init`.
108
+
109
+ To gradually roll out a new build use
110
+
111
+ ```no-highlight
112
+ fastlane supply --aab path/app.aab --track rollout --rollout 0.5
113
+ ```
114
+
98
115
  ## Images and Screenshots
99
116
 
100
117
  After running `fastlane supply init`, you will have a metadata directory. This directory contains one or more locale directories (e.g. en-US, en-GB, etc.), and inside this directory are text files such as `title.txt` and `short_description.txt`.
@@ -6,6 +6,8 @@ module Fastlane
6
6
  module SharedValues
7
7
  GRADLE_APK_OUTPUT_PATH = :GRADLE_APK_OUTPUT_PATH
8
8
  GRADLE_ALL_APK_OUTPUT_PATHS = :GRADLE_ALL_APK_OUTPUT_PATHS
9
+ GRADLE_AAB_OUTPUT_PATH = :GRADLE_AAB_OUTPUT_PATH
10
+ GRADLE_ALL_AAB_OUTPUT_PATHS = :GRADLE_ALL_AAB_OUTPUT_PATHS
9
11
  GRADLE_FLAVOR = :GRADLE_FLAVOR
10
12
  GRADLE_BUILD_TYPE = :GRADLE_BUILD_TYPE
11
13
  end
@@ -53,24 +55,33 @@ module Fastlane
53
55
  print_command: params[:print_command],
54
56
  print_command_output: params[:print_command_output])
55
57
 
56
- # If we didn't build, then we return now, as it makes no sense to search for apk's in a non-`assemble` scenario
57
- return result unless task =~ /\b(assemble)/
58
+ # If we didn't build, then we return now, as it makes no sense to search for apk's in a non-`assemble` or non-`build` scenario
59
+ return result unless task =~ /\b(assemble)/ || task =~ /\b(bundle)/
58
60
 
59
61
  apk_search_path = File.join(project_dir, '**', 'build', 'outputs', 'apk', '**', '*.apk')
62
+ aab_search_path = File.join(project_dir, '**', 'build', 'outputs', 'bundle', '**', '*.aab')
60
63
 
61
- # Our apk is now built, but there might actually be multiple ones that were built if a flavor was not specified in a multi-flavor project (e.g. `assembleRelease`), however we're not interested in unaligned apk's...
64
+ # Our apk/aab is now built, but there might actually be multiple ones that were built if a flavor was not specified in a multi-flavor project (e.g. `assembleRelease`)
65
+ # However, we're not interested in unaligned apk's...
62
66
  new_apks = Dir[apk_search_path].reject { |path| path =~ /^.*-unaligned.apk$/i }
63
67
  new_apks = new_apks.map { |path| File.expand_path(path) }
68
+ new_aabs = Dir[aab_search_path]
69
+ new_aabs = new_aabs.map { |path| File.expand_path(path) }
64
70
 
65
- # We expose all of these new apk's
71
+ # We expose all of these new apks and aabs
66
72
  Actions.lane_context[SharedValues::GRADLE_ALL_APK_OUTPUT_PATHS] = new_apks
73
+ Actions.lane_context[SharedValues::GRADLE_ALL_AAB_OUTPUT_PATHS] = new_aabs
67
74
 
68
- # We also take the most recent apk to return as SharedValues::GRADLE_APK_OUTPUT_PATH, this is the one that will be relevant for most projects that just build a single build variant (flavor + build type combo). In multi build variants this value is undefined
75
+ # We also take the most recent apk and aab to return as SharedValues::GRADLE_APK_OUTPUT_PATH and SharedValues::GRADLE_AAB_OUTPUT_PATH
76
+ # This is the one that will be relevant for most projects that just build a single build variant (flavor + build type combo).
77
+ # In multi build variants this value is undefined
69
78
  last_apk_path = new_apks.sort_by(&File.method(:mtime)).last
79
+ last_aab_path = new_aabs.sort_by(&File.method(:mtime)).last
70
80
  Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH] = File.expand_path(last_apk_path) if last_apk_path
81
+ Actions.lane_context[SharedValues::GRADLE_AAB_OUTPUT_PATH] = File.expand_path(last_aab_path) if last_aab_path
71
82
 
72
- # Give a helpful message in case there were no new apk's. Remember we're only running this code when assembling, in which case we certainly expect there to be an apk
73
- UI.message('Couldn\'t find any new signed apk files...') if new_apks.empty?
83
+ # Give a helpful message in case there were no new apks or aabs. Remember we're only running this code when assembling, in which case we certainly expect there to be an apk or aab
84
+ UI.message('Couldn\'t find any new signed apk files...') if new_apks.empty? && new_aabs.empty?
74
85
 
75
86
  return result
76
87
  end
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.96.0.beta.20180521050117'.freeze
2
+ VERSION = '2.96.0'.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
@@ -18,4 +18,4 @@ class Deliverfile: DeliverfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.95.0
21
+ // Generated with fastlane 2.96.0
@@ -1373,7 +1373,7 @@ func ensureNoDebugCode(text: String,
1373
1373
  RubyCommand.Argument(name: "exclude_dirs", value: excludeDirs)])
1374
1374
  _ = runner.executeCommand(command)
1375
1375
  }
1376
- func ensureXcodeVersion(version: String) {
1376
+ func ensureXcodeVersion(version: String? = nil) {
1377
1377
  let command = RubyCommand(commandID: "", methodName: "ensure_xcode_version", className: nil, args: [RubyCommand.Argument(name: "version", value: version)])
1378
1378
  _ = runner.executeCommand(command)
1379
1379
  }
@@ -3237,7 +3237,9 @@ func supply(packageName: String,
3237
3237
  jsonKeyData: String? = nil,
3238
3238
  apk: String? = nil,
3239
3239
  apkPaths: [String]? = nil,
3240
+ aab: String? = nil,
3240
3241
  skipUploadApk: Bool = false,
3242
+ skipUploadAab: Bool = false,
3241
3243
  skipUploadMetadata: Bool = false,
3242
3244
  skipUploadImages: Bool = false,
3243
3245
  skipUploadScreenshots: Bool = false,
@@ -3257,7 +3259,9 @@ func supply(packageName: String,
3257
3259
  RubyCommand.Argument(name: "json_key_data", value: jsonKeyData),
3258
3260
  RubyCommand.Argument(name: "apk", value: apk),
3259
3261
  RubyCommand.Argument(name: "apk_paths", value: apkPaths),
3262
+ RubyCommand.Argument(name: "aab", value: aab),
3260
3263
  RubyCommand.Argument(name: "skip_upload_apk", value: skipUploadApk),
3264
+ RubyCommand.Argument(name: "skip_upload_aab", value: skipUploadAab),
3261
3265
  RubyCommand.Argument(name: "skip_upload_metadata", value: skipUploadMetadata),
3262
3266
  RubyCommand.Argument(name: "skip_upload_images", value: skipUploadImages),
3263
3267
  RubyCommand.Argument(name: "skip_upload_screenshots", value: skipUploadScreenshots),
@@ -3510,7 +3514,7 @@ func updatePlist(plistPath: String? = nil,
3510
3514
  _ = runner.executeCommand(command)
3511
3515
  }
3512
3516
  func updateProjectCodeSigning(path: String,
3513
- udid: String,
3517
+ udid: String? = nil,
3514
3518
  uuid: String) {
3515
3519
  let command = RubyCommand(commandID: "", methodName: "update_project_code_signing", className: nil, args: [RubyCommand.Argument(name: "path", value: path),
3516
3520
  RubyCommand.Argument(name: "udid", value: udid),
@@ -3522,13 +3526,15 @@ func updateProjectProvisioning(xcodeproj: String? = nil,
3522
3526
  targetFilter: String? = nil,
3523
3527
  buildConfigurationFilter: String? = nil,
3524
3528
  buildConfiguration: String? = nil,
3525
- certificate: String = "/tmp/AppleIncRootCertificate.cer") {
3529
+ certificate: String = "/tmp/AppleIncRootCertificate.cer",
3530
+ codeSigningIdentity: String? = nil) {
3526
3531
  let command = RubyCommand(commandID: "", methodName: "update_project_provisioning", className: nil, args: [RubyCommand.Argument(name: "xcodeproj", value: xcodeproj),
3527
3532
  RubyCommand.Argument(name: "profile", value: profile),
3528
3533
  RubyCommand.Argument(name: "target_filter", value: targetFilter),
3529
3534
  RubyCommand.Argument(name: "build_configuration_filter", value: buildConfigurationFilter),
3530
3535
  RubyCommand.Argument(name: "build_configuration", value: buildConfiguration),
3531
- RubyCommand.Argument(name: "certificate", value: certificate)])
3536
+ RubyCommand.Argument(name: "certificate", value: certificate),
3537
+ RubyCommand.Argument(name: "code_signing_identity", value: codeSigningIdentity)])
3532
3538
  _ = runner.executeCommand(command)
3533
3539
  }
3534
3540
  func updateProjectTeam(path: String,
@@ -3713,7 +3719,9 @@ func uploadToPlayStore(packageName: String,
3713
3719
  jsonKeyData: String? = nil,
3714
3720
  apk: String? = nil,
3715
3721
  apkPaths: [String]? = nil,
3722
+ aab: String? = nil,
3716
3723
  skipUploadApk: Bool = false,
3724
+ skipUploadAab: Bool = false,
3717
3725
  skipUploadMetadata: Bool = false,
3718
3726
  skipUploadImages: Bool = false,
3719
3727
  skipUploadScreenshots: Bool = false,
@@ -3733,7 +3741,9 @@ func uploadToPlayStore(packageName: String,
3733
3741
  RubyCommand.Argument(name: "json_key_data", value: jsonKeyData),
3734
3742
  RubyCommand.Argument(name: "apk", value: apk),
3735
3743
  RubyCommand.Argument(name: "apk_paths", value: apkPaths),
3744
+ RubyCommand.Argument(name: "aab", value: aab),
3736
3745
  RubyCommand.Argument(name: "skip_upload_apk", value: skipUploadApk),
3746
+ RubyCommand.Argument(name: "skip_upload_aab", value: skipUploadAab),
3737
3747
  RubyCommand.Argument(name: "skip_upload_metadata", value: skipUploadMetadata),
3738
3748
  RubyCommand.Argument(name: "skip_upload_images", value: skipUploadImages),
3739
3749
  RubyCommand.Argument(name: "skip_upload_screenshots", value: skipUploadScreenshots),
@@ -4023,4 +4033,4 @@ let screengrabfile: Screengrabfile = Screengrabfile()
4023
4033
  let snapshotfile: Snapshotfile = Snapshotfile()
4024
4034
  // Please don't remove the lines below
4025
4035
  // They are used to detect outdated files
4026
- // FastlaneRunnerAPIVersion [0.9.17]
4036
+ // FastlaneRunnerAPIVersion [0.9.18]
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.95.0
21
+ // Generated with fastlane 2.96.0
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.95.0
21
+ // Generated with fastlane 2.96.0
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.95.0
21
+ // Generated with fastlane 2.96.0
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.95.0
21
+ // Generated with fastlane 2.96.0
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.95.0
21
+ // Generated with fastlane 2.96.0
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.95.0
21
+ // Generated with fastlane 2.96.0
@@ -111,7 +111,7 @@ module Gym
111
111
  end),
112
112
  FastlaneCore::ConfigItem.new(key: :export_options,
113
113
  env_name: "GYM_EXPORT_OPTIONS",
114
- description: "Specifies path to export options plist. Use 'xcodebuild -help' to print the full set of available options",
114
+ description: "Path to an export options plist or a hash with export options. Use 'xcodebuild -help' to print the full set of available options",
115
115
  is_string: false,
116
116
  optional: true,
117
117
  type: Hash,
@@ -193,6 +193,11 @@ module Spaceship
193
193
  end
194
194
  end
195
195
 
196
+ # @return (String) Fetches name from currently used team
197
+ def team_name
198
+ (team_information || {})['name']
199
+ end
200
+
196
201
  # Instantiates a client but with a cookie derived from another client.
197
202
  #
198
203
  # HACK: since the `@cookie` is not exposed, we use this hacky way of sharing the instance.
@@ -462,6 +467,10 @@ module Spaceship
462
467
  if (response.body || "").include?('invalid="true"')
463
468
  # User Credentials are wrong
464
469
  raise InvalidUserCredentialsError.new, "Invalid username and password combination. Used '#{user}' as the username."
470
+ elsif response.status == 412 &&
471
+ (response.body["authType"] == "sa" || response.body["authType"] == "hsa")
472
+ # Need to acknowledge Apple ID and Privacy statement - https://github.com/fastlane/fastlane/issues/12577
473
+ raise AppleIDAndPrivacyAcknowledgementNeeded.new, "Need to acknowledge to Apple's Apple ID and Privacy statement. Please manually log into https://appleid.apple.com (or https://itunesconnect.apple.com) to acknowledge the statement."
465
474
  elsif (response['Set-Cookie'] || "").include?("itctx")
466
475
  raise "Looks like your Apple ID is not enabled for iTunes Connect, make sure to be able to login online"
467
476
  else
@@ -22,6 +22,12 @@ module Spaceship
22
22
  end
23
23
  end
24
24
 
25
+ class AppleIDAndPrivacyAcknowledgementNeeded < BasicPreferredInfoError
26
+ def show_github_issues
27
+ false
28
+ end
29
+ end
30
+
25
31
  # User doesn't have enough permission for given action
26
32
  class InsufficientPermissions < BasicPreferredInfoError
27
33
  TITLE = 'Insufficient permissions for your Apple ID:'.freeze
@@ -236,6 +236,21 @@ module Supply
236
236
  end
237
237
  end
238
238
 
239
+ def upload_bundle(path_to_aab)
240
+ ensure_active_edit!
241
+
242
+ result_upload = call_google_api do
243
+ android_publisher.upload_edit_bundle(
244
+ current_package_name,
245
+ self.current_edit.id,
246
+ upload_source: path_to_aab,
247
+ content_type: "application/octet-stream"
248
+ )
249
+ end
250
+
251
+ return result_upload.version_code
252
+ end
253
+
239
254
  # Updates the track for the provided version code(s)
240
255
  def update_track(track, rollout, apk_version_code)
241
256
  ensure_active_edit!
@@ -3,6 +3,7 @@ require 'credentials_manager/appfile_config'
3
3
 
4
4
  module Supply
5
5
  class Options
6
+ # rubocop:disable Metrics/PerceivedComplexity
6
7
  def self.available_options
7
8
  default_tracks = %w(production beta alpha internal rollout)
8
9
  @options ||= [
@@ -91,7 +92,7 @@ module Supply
91
92
  env_name: "SUPPLY_APK",
92
93
  description: "Path to the APK file to upload",
93
94
  short_option: "-b",
94
- conflicting_options: [:apk_paths],
95
+ conflicting_options: [:apk_paths, :aab],
95
96
  code_gen_sensitive: true,
96
97
  default_value: Dir["*.apk"].last || Dir[File.join("app", "build", "outputs", "apk", "app-Release.apk")].last,
97
98
  default_value_dynamic: true,
@@ -102,7 +103,7 @@ module Supply
102
103
  end),
103
104
  FastlaneCore::ConfigItem.new(key: :apk_paths,
104
105
  env_name: "SUPPLY_APK_PATHS",
105
- conflicting_options: [:apk],
106
+ conflicting_options: [:apk, :aab],
106
107
  optional: true,
107
108
  type: Array,
108
109
  description: "An array of paths to APK files to upload",
@@ -114,12 +115,31 @@ module Supply
114
115
  UI.user_error!("file at path '#{path}' is not an apk") unless path.end_with?('.apk')
115
116
  end
116
117
  end),
118
+ FastlaneCore::ConfigItem.new(key: :aab,
119
+ env_name: "SUPPLY_AAB",
120
+ description: "Path to the AAB file to upload",
121
+ short_option: "-f",
122
+ conflicting_options: [:apk_path, :apk_paths],
123
+ code_gen_sensitive: true,
124
+ default_value: Dir["*.aab"].last || Dir[File.join("app", "build", "outputs", "bundle", "release", "bundle.aab")].last,
125
+ default_value_dynamic: true,
126
+ optional: true,
127
+ verify_block: proc do |value|
128
+ UI.user_error!("Could not find aab file at path '#{value}'") unless File.exist?(value)
129
+ UI.user_error!("aab file is not an aab") unless value.end_with?('.aab')
130
+ end),
117
131
  FastlaneCore::ConfigItem.new(key: :skip_upload_apk,
118
132
  env_name: "SUPPLY_SKIP_UPLOAD_APK",
119
133
  optional: true,
120
134
  description: "Whether to skip uploading APK",
121
135
  is_string: false,
122
136
  default_value: false),
137
+ FastlaneCore::ConfigItem.new(key: :skip_upload_aab,
138
+ env_name: "SUPPLY_SKIP_UPLOAD_AAB",
139
+ optional: true,
140
+ description: "Whether to skip uploading AAB",
141
+ is_string: false,
142
+ default_value: false),
123
143
  FastlaneCore::ConfigItem.new(key: :skip_upload_metadata,
124
144
  env_name: "SUPPLY_SKIP_UPLOAD_METADATA",
125
145
  optional: true,
@@ -186,5 +206,6 @@ module Supply
186
206
 
187
207
  ]
188
208
  end
209
+ # rubocop:enable Metrics/PerceivedComplexity
189
210
  end
190
211
  end
@@ -24,6 +24,7 @@ module Supply
24
24
  end
25
25
 
26
26
  upload_binaries unless Supply.config[:skip_upload_apk]
27
+ upload_bundles unless Supply.config[:skip_upload_aab]
27
28
 
28
29
  promote_track if Supply.config[:track_promote_to]
29
30
 
@@ -39,8 +40,17 @@ module Supply
39
40
  end
40
41
 
41
42
  def verify_config!
42
- unless metadata_path || Supply.config[:apk] || Supply.config[:apk_paths] || (Supply.config[:track] && Supply.config[:track_promote_to])
43
- UI.user_error!("No local metadata, apks, or track to promote were found, make sure to run `fastlane supply init` to setup supply")
43
+ unless metadata_path || Supply.config[:apk] || Supply.config[:apk_paths] || Supply.config[:aab] || (Supply.config[:track] && Supply.config[:track_promote_to])
44
+ UI.user_error!("No local metadata, apks, aab, or track to promote were found, make sure to run `fastlane supply init` to setup supply")
45
+ end
46
+
47
+ # Can't upload both at apk and aab at same time
48
+ # Need to error out users when there both apks and aabs are detected
49
+ apk_paths = [Supply.config[:apk], Supply.config[:apk_paths]].flatten.compact
50
+ could_upload_apk = !apk_paths.empty? && !Supply.config[:skip_upload_apk]
51
+ could_upload_aab = Supply.config[:aab] && !Supply.config[:skip_upload_aab]
52
+ if could_upload_apk && could_upload_aab
53
+ UI.user_error!("Cannot provide both apk(s) and aab - use `skip_upload_apk`, `skip_upload_aab`, or make sure to remove any existing .apk or .aab files that are no longer needed")
44
54
  end
45
55
  end
46
56
 
@@ -132,6 +142,18 @@ module Supply
132
142
  update_track(apk_version_codes) unless apk_version_codes.empty?
133
143
  end
134
144
 
145
+ def upload_bundles
146
+ aab_path = Supply.config[:aab]
147
+ return unless aab_path
148
+
149
+ UI.message("Preparing aab at path '#{aab_path}' for upload...")
150
+ apk_version_codes = [client.upload_bundle(aab_path)]
151
+
152
+ # Only update tracks if we have version codes
153
+ # Updating a track with empty version codes can completely clear out a track
154
+ update_track(apk_version_codes) unless apk_version_codes.empty?
155
+ end
156
+
135
157
  private
136
158
 
137
159
  ##
metadata CHANGED
@@ -1,33 +1,33 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.96.0.beta.20180521050117
4
+ version: 2.96.0
5
5
  platform: ruby
6
6
  authors:
7
- - Stefan Natchev
7
+ - Felix Krause
8
+ - Jérôme Lacoste
9
+ - Jimmy Dee
10
+ - Andrew McBurney
8
11
  - Fumiya Nakamura
9
- - Joshua Liebowitz
10
- - Iulian Onofrei
11
- - Manu Wallner
12
- - Jorge Revuelta H
12
+ - Danielle Tomlinson
13
+ - Kohki Miki
13
14
  - Olivier Halligon
15
+ - Stefan Natchev
16
+ - Manu Wallner
17
+ - Iulian Onofrei
18
+ - Aaron Brager
14
19
  - Luka Mirosevic
15
- - Jimmy Dee
16
20
  - Helmut Januschka
17
- - Jan Piotrowski
18
- - Kohki Miki
19
- - Andrew McBurney
20
- - Aaron Brager
21
+ - Joshua Liebowitz
21
22
  - Matthew Ellis
22
- - Felix Krause
23
- - Maksym Grebenets
24
- - Jérôme Lacoste
23
+ - Jan Piotrowski
25
24
  - Josh Holtz
26
- - Danielle Tomlinson
25
+ - Jorge Revuelta H
26
+ - Maksym Grebenets
27
27
  autorequire:
28
28
  bindir: bin
29
29
  cert_chain: []
30
- date: 2018-05-21 00:00:00.000000000 Z
30
+ date: 2018-05-22 00:00:00.000000000 Z
31
31
  dependencies:
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: slack-notifier
@@ -611,20 +611,20 @@ dependencies:
611
611
  requirements:
612
612
  - - ">="
613
613
  - !ruby/object:Gem::Version
614
- version: 0.13.1
614
+ version: 0.21.2
615
615
  - - "<"
616
616
  - !ruby/object:Gem::Version
617
- version: 0.14.0
617
+ version: 0.22.0
618
618
  type: :runtime
619
619
  prerelease: false
620
620
  version_requirements: !ruby/object:Gem::Requirement
621
621
  requirements:
622
622
  - - ">="
623
623
  - !ruby/object:Gem::Version
624
- version: 0.13.1
624
+ version: 0.21.2
625
625
  - - "<"
626
626
  - !ruby/object:Gem::Version
627
- version: 0.14.0
627
+ version: 0.22.0
628
628
  - !ruby/object:Gem::Dependency
629
629
  name: emoji_regex
630
630
  requirement: !ruby/object:Gem::Requirement
@@ -1262,6 +1262,7 @@ files:
1262
1262
  - fastlane/swift/Fastlane.swift
1263
1263
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj
1264
1264
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
1265
+ - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate
1265
1266
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme
1266
1267
  - fastlane/swift/FastlaneSwiftRunner/README.txt
1267
1268
  - fastlane/swift/Gymfile.swift
@@ -1652,24 +1653,24 @@ metadata:
1652
1653
  post_install_message:
1653
1654
  rdoc_options: []
1654
1655
  require_paths:
1655
- - precheck/lib
1656
- - gym/lib
1657
- - produce/lib
1658
- - fastlane_core/lib
1659
- - screengrab/lib
1660
- - fastlane/lib
1661
- - pilot/lib
1656
+ - credentials_manager/lib
1657
+ - pem/lib
1662
1658
  - snapshot/lib
1663
- - sigh/lib
1659
+ - frameit/lib
1660
+ - match/lib
1661
+ - fastlane_core/lib
1664
1662
  - deliver/lib
1663
+ - scan/lib
1665
1664
  - supply/lib
1666
- - spaceship/lib
1667
1665
  - cert/lib
1668
- - match/lib
1669
- - frameit/lib
1670
- - pem/lib
1671
- - credentials_manager/lib
1672
- - scan/lib
1666
+ - fastlane/lib
1667
+ - spaceship/lib
1668
+ - pilot/lib
1669
+ - gym/lib
1670
+ - precheck/lib
1671
+ - screengrab/lib
1672
+ - sigh/lib
1673
+ - produce/lib
1673
1674
  required_ruby_version: !ruby/object:Gem::Requirement
1674
1675
  requirements:
1675
1676
  - - ">="
@@ -1677,12 +1678,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
1677
1678
  version: 2.0.0
1678
1679
  required_rubygems_version: !ruby/object:Gem::Requirement
1679
1680
  requirements:
1680
- - - ">"
1681
+ - - ">="
1681
1682
  - !ruby/object:Gem::Version
1682
- version: 1.3.1
1683
+ version: '0'
1683
1684
  requirements: []
1684
1685
  rubyforge_project:
1685
- rubygems_version: 2.5.2.1
1686
+ rubygems_version: 2.5.2.3
1686
1687
  signing_key:
1687
1688
  specification_version: 4
1688
1689
  summary: The easiest way to automate beta deployments and releases for your iOS and