fastlane-plugin-appcenter 1.8.0 → 1.8.1
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
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3383c94635e8212980d620bf95d5e61eca5a3bbacfeea4875e8128884670d66
|
4
|
+
data.tar.gz: 12d16a1669fb1f2c0239d3d0e5feba0e7a076d48c109047ba474b7e59672be5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b8e7acb6b7dc353a0aa443e9d0737b08a634f88e8f311cd78be834d38ceb23d15e81038d8cfba88aca7e09be3f83431fb2681829b969c3f074fe21601b67fdb
|
7
|
+
data.tar.gz: 0f143cb13db8034eca974c0c7a4a6c773c1a9faa3b11c29cf9419397957124f331bfa642ecaad475c4fa6cd41d5d11a53145035de16157b10e239c39573683bd
|
data/README.md
CHANGED
@@ -31,7 +31,6 @@ To get started, first, [obtain an API token](https://appcenter.ms/settings/apito
|
|
31
31
|
appcenter_fetch_devices(
|
32
32
|
api_token: "<appcenter token>",
|
33
33
|
owner_name: "<appcenter account name of the owner of the app (username or organization URL name)>",
|
34
|
-
owner_type: "user", # Default is user - set to organization for appcenter organizations
|
35
34
|
app_name: "<appcenter app name>",
|
36
35
|
destinations: "*", # Default is 'Collaborators', use '*' for all distribution groups
|
37
36
|
devices_file: "devices.txt" # Default. If you customize, the extension must be .txt
|
@@ -90,7 +89,6 @@ Here is the list of all existing parameters:
|
|
90
89
|
| Key & Env Var | Description |
|
91
90
|
|-----------------|--------------------|
|
92
91
|
| `api_token` <br/> `APPCENTER_API_TOKEN` | API Token for App Center |
|
93
|
-
| `owner_type` <br/> `APPCENTER_OWNER_TYPE` | Owner type, either 'user' or 'organization' (default: `user`) |
|
94
92
|
| `owner_name` <br/> `APPCENTER_OWNER_NAME` | Owner name, as found in the App's URL in App Center |
|
95
93
|
| `destinations` <br/> `APPCENTER_DISTRIBUTE_DESTINATIONS` | Comma separated list of distribution group names. Default is 'Collaborators', use '*' for all distribution groups |
|
96
94
|
| `devices_file` <br/> `FL_REGISTER_DEVICES_FILE` | File to save the devices list to. Same environment variable as _fastlane_'s `register_devices` action |
|
@@ -104,7 +102,7 @@ Here is the list of all existing parameters:
|
|
104
102
|
| `owner_name` <br/> `APPCENTER_OWNER_NAME` | Owner name as found in the App's URL in App Center |
|
105
103
|
| `app_name` <br/> `APPCENTER_APP_NAME` | App name as found in the App's URL in App Center. If there is no app with such name, you will be prompted to create one |
|
106
104
|
| `app_display_name` <br/> `APPCENTER_APP_DISPLAY_NAME` | App display name to use when creating a new app |
|
107
|
-
| `app_os` <br/> `APPCENTER_APP_OS` | App OS. Used for new app creation, if app 'app_name' was not found |
|
105
|
+
| `app_os` <br/> `APPCENTER_APP_OS` | App OS can be Android, iOS, macOS, Windows, Custom. Used for new app creation, if app 'app_name' was not found |
|
108
106
|
| `app_platform` <br/> `APPCENTER_APP_PLATFORM` | App Platform. Used for new app creation, if app 'app_name' was not found |
|
109
107
|
| `file` <br/> `APPCENTER_DISTRIBUTE_FILE` | File path to the release build to publish |
|
110
108
|
| `upload_build_only` <br/> `APPCENTER_DISTRIBUTE_UPLOAD_BUILD_ONLY` | Flag to upload only the build to App Center. Skips uploading symbols or mapping (default: `false`) |
|
@@ -116,7 +114,7 @@ Here is the list of all existing parameters:
|
|
116
114
|
| `destination_type` <br/> `APPCENTER_DISTRIBUTE_DESTINATION_TYPE` | Destination type of distribution destination. 'group' and 'store' are supported (default: `group`) |
|
117
115
|
| `mandatory_update` <br/> `APPCENTER_DISTRIBUTE_MANDATORY_UPDATE` | Require users to update to this release. Ignored if destination type is 'store' (default: `false`) |
|
118
116
|
| `notify_testers` <br/> `APPCENTER_DISTRIBUTE_NOTIFY_TESTERS` | Send email notification about release. Ignored if destination type is 'store' (default: `false`) |
|
119
|
-
| `release_notes` <br/> `APPCENTER_DISTRIBUTE_RELEASE_NOTES` | Release notes
|
117
|
+
| `release_notes` <br/> `APPCENTER_DISTRIBUTE_RELEASE_NOTES` | Release notes (default: `No changelog given`) |
|
120
118
|
| `should_clip` <br/> `APPCENTER_DISTRIBUTE_RELEASE_NOTES_CLIPPING` | Clip release notes if its length is more then 5000, true by default (default: `true`) |
|
121
119
|
| `release_notes_link` <br/> `APPCENTER_DISTRIBUTE_RELEASE_NOTES_LINK` | Additional release notes link |
|
122
120
|
| `build_number` <br/> `APPCENTER_DISTRIBUTE_BUILD_NUMBER` | The build number, required for macOS .pkg and .dmg builds, as well as Android ProGuard `mapping.txt` when using `upload_mapping_only` |
|
@@ -185,4 +183,4 @@ Check out [SECURITY.md](SECURITY.md) for any security concern with this project.
|
|
185
183
|
|
186
184
|
## Contact
|
187
185
|
|
188
|
-
We're on Twitter as [@vsappcenter](https://www.twitter.com/vsappcenter). Additionally you can reach out to us on the [App Center](https://appcenter.ms/apps) portal
|
186
|
+
We're on Twitter as [@vsappcenter](https://www.twitter.com/vsappcenter). Additionally you can reach out to us on the [App Center](https://appcenter.ms/apps) portal. Open the "?" menu on the top right corner of screen, then use "Contact support" to file a support ticket. Our support team is there to answer your questions and help you solve your problems.
|
@@ -180,7 +180,7 @@ module Fastlane
|
|
180
180
|
File.delete zip_file
|
181
181
|
end
|
182
182
|
UI.message("Creating zip archive: #{zip_file}")
|
183
|
-
file = Actions::ZipAction.run(path: file, output_path: zip_file)
|
183
|
+
file = Actions::ZipAction.run(path: file, output_path: zip_file, symlinks: true)
|
184
184
|
end
|
185
185
|
|
186
186
|
UI.message("Starting release upload...")
|
@@ -252,10 +252,11 @@ module Fastlane
|
|
252
252
|
app_platform = params[:app_platform]
|
253
253
|
|
254
254
|
platforms = {
|
255
|
-
Android: %w[Java React-Native Xamarin],
|
256
|
-
iOS: %w[Objective-C-Swift React-Native Xamarin],
|
255
|
+
Android: %w[Java React-Native Xamarin Unity],
|
256
|
+
iOS: %w[Objective-C-Swift React-Native Xamarin Unity],
|
257
257
|
macOS: %w[Objective-C-Swift],
|
258
|
-
Windows: %w[UWP WPF WinForms Unity]
|
258
|
+
Windows: %w[UWP WPF WinForms Unity],
|
259
|
+
Custom: %w[Custom]
|
259
260
|
}
|
260
261
|
|
261
262
|
begin
|
@@ -284,6 +285,30 @@ module Fastlane
|
|
284
285
|
end
|
285
286
|
end
|
286
287
|
|
288
|
+
def self.add_app_to_distribution_group_if_needed(params)
|
289
|
+
return unless params[:destination_type] == 'group' && params[:owner_type] == 'organization' && params[:destinations] != '*'
|
290
|
+
|
291
|
+
app_distribution_groups = Helper::AppcenterHelper.fetch_distribution_groups(
|
292
|
+
api_token: params[:api_token],
|
293
|
+
owner_name: params[:owner_name],
|
294
|
+
app_name: params[:app_name]
|
295
|
+
)
|
296
|
+
|
297
|
+
group_names = app_distribution_groups.map { |g| g['name'] }
|
298
|
+
destination_names = params[:destinations].split(',').map(&:strip)
|
299
|
+
|
300
|
+
destination_names.each do |destination_name|
|
301
|
+
unless group_names.include? destination_name
|
302
|
+
Helper::AppcenterHelper.add_new_app_to_distribution_group(
|
303
|
+
api_token: params[:api_token],
|
304
|
+
owner_name: params[:owner_name],
|
305
|
+
app_name: params[:app_name],
|
306
|
+
destination_name: destination_name
|
307
|
+
)
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
287
312
|
def self.run(params)
|
288
313
|
values = params.values
|
289
314
|
upload_build_only = params[:upload_build_only]
|
@@ -294,6 +319,7 @@ module Fastlane
|
|
294
319
|
|
295
320
|
# if app found or successfully created
|
296
321
|
if self.get_or_create_app(params)
|
322
|
+
self.add_app_to_distribution_group_if_needed(params)
|
297
323
|
release = self.run_release_upload(params) unless upload_dsym_only || upload_mapping_only
|
298
324
|
params[:version] = release['short_version'] if release
|
299
325
|
params[:build_number] = release['version'] if release
|
@@ -368,7 +394,7 @@ module Fastlane
|
|
368
394
|
|
369
395
|
FastlaneCore::ConfigItem.new(key: :app_os,
|
370
396
|
env_name: "APPCENTER_APP_OS",
|
371
|
-
description: "App OS. Used for new app creation, if app 'app_name' was not found",
|
397
|
+
description: "App OS can be Android, iOS, macOS, Windows, Custom. Used for new app creation, if app 'app_name' was not found",
|
372
398
|
optional: true,
|
373
399
|
type: String),
|
374
400
|
|
@@ -18,10 +18,17 @@ module Fastlane
|
|
18
18
|
require 'faraday'
|
19
19
|
require 'faraday_middleware'
|
20
20
|
|
21
|
+
default_api_url = "https://api.appcenter.ms"
|
22
|
+
if ENV['APPCENTER_ENV']&.upcase == 'INT'
|
23
|
+
default_api_url = "https://api-gateway-core-integration.dev.avalanch.es"
|
24
|
+
end
|
25
|
+
|
21
26
|
options = {
|
22
|
-
url: upload_url ||
|
27
|
+
url: upload_url || default_api_url
|
23
28
|
}
|
24
29
|
|
30
|
+
UI.message("DEBUG: BASE URL #{options[:url]}") if ENV['DEBUG']
|
31
|
+
|
25
32
|
Faraday.new(options) do |builder|
|
26
33
|
if upload_url
|
27
34
|
builder.request :multipart unless dsym
|
@@ -42,15 +49,22 @@ module Fastlane
|
|
42
49
|
def self.create_release_upload(api_token, owner_name, app_name, body)
|
43
50
|
connection = self.connection
|
44
51
|
|
45
|
-
|
52
|
+
url = "v0.1/apps/#{owner_name}/#{app_name}/release_uploads"
|
53
|
+
body ||= {}
|
54
|
+
|
55
|
+
UI.message("DEBUG: POST #{url}") if ENV['DEBUG']
|
56
|
+
UI.message("DEBUG: POST body: #{JSON.pretty_generate(body)}\n") if ENV['DEBUG']
|
57
|
+
|
58
|
+
response = connection.post(url) do |req|
|
46
59
|
req.headers['X-API-Token'] = api_token
|
47
60
|
req.headers['internal-request-source'] = "fastlane"
|
48
|
-
req.body = body
|
61
|
+
req.body = body
|
49
62
|
end
|
50
63
|
|
64
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
65
|
+
|
51
66
|
case response.status
|
52
67
|
when 200...300
|
53
|
-
UI.message("DEBUG: #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
54
68
|
response.body
|
55
69
|
when 401
|
56
70
|
UI.user_error!("Auth Error, provided invalid token")
|
@@ -59,7 +73,7 @@ module Fastlane
|
|
59
73
|
UI.error("Not found, invalid owner or application name")
|
60
74
|
false
|
61
75
|
when 500...600
|
62
|
-
UI.
|
76
|
+
UI.abort_with_message!("Internal Service Error, please try again later")
|
63
77
|
else
|
64
78
|
UI.error("Error #{response.status}: #{response.body}")
|
65
79
|
false
|
@@ -74,20 +88,27 @@ module Fastlane
|
|
74
88
|
def self.create_mapping_upload(api_token, owner_name, app_name, file_name, build_number, version)
|
75
89
|
connection = self.connection
|
76
90
|
|
77
|
-
|
91
|
+
url = "v0.1/apps/#{owner_name}/#{app_name}/symbol_uploads"
|
92
|
+
body = {
|
93
|
+
symbol_type: "AndroidProguard",
|
94
|
+
file_name: file_name,
|
95
|
+
build: build_number,
|
96
|
+
version: version,
|
97
|
+
}
|
98
|
+
|
99
|
+
UI.message("DEBUG: POST #{url}") if ENV['DEBUG']
|
100
|
+
UI.message("DEBUG: POST body #{JSON.pretty_generate(body)}\n") if ENV['DEBUG']
|
101
|
+
|
102
|
+
response = connection.post(url) do |req|
|
78
103
|
req.headers['X-API-Token'] = api_token
|
79
104
|
req.headers['internal-request-source'] = "fastlane"
|
80
|
-
req.body =
|
81
|
-
symbol_type: "AndroidProguard",
|
82
|
-
file_name: file_name,
|
83
|
-
build: build_number,
|
84
|
-
version: version,
|
85
|
-
}
|
105
|
+
req.body = body
|
86
106
|
end
|
87
107
|
|
108
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
109
|
+
|
88
110
|
case response.status
|
89
111
|
when 200...300
|
90
|
-
UI.message("DEBUG: #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
91
112
|
response.body
|
92
113
|
when 401
|
93
114
|
UI.user_error!("Auth Error, provided invalid token")
|
@@ -109,17 +130,24 @@ module Fastlane
|
|
109
130
|
def self.create_dsym_upload(api_token, owner_name, app_name)
|
110
131
|
connection = self.connection
|
111
132
|
|
112
|
-
|
133
|
+
url = "v0.1/apps/#{owner_name}/#{app_name}/symbol_uploads"
|
134
|
+
body = {
|
135
|
+
symbol_type: 'Apple'
|
136
|
+
}
|
137
|
+
|
138
|
+
UI.message("DEBUG: POST #{url}") if ENV['DEBUG']
|
139
|
+
UI.message("DEBUG: POST body #{JSON.pretty_generate(body)}\n") if ENV['DEBUG']
|
140
|
+
|
141
|
+
response = connection.post(url) do |req|
|
113
142
|
req.headers['X-API-Token'] = api_token
|
114
143
|
req.headers['internal-request-source'] = "fastlane"
|
115
|
-
req.body =
|
116
|
-
symbol_type: 'Apple'
|
117
|
-
}
|
144
|
+
req.body = body
|
118
145
|
end
|
119
146
|
|
147
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
148
|
+
|
120
149
|
case response.status
|
121
150
|
when 200...300
|
122
|
-
UI.message("DEBUG: #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
123
151
|
response.body
|
124
152
|
when 401
|
125
153
|
UI.user_error!("Auth Error, provided invalid token")
|
@@ -137,17 +165,24 @@ module Fastlane
|
|
137
165
|
def self.update_symbol_upload(api_token, owner_name, app_name, symbol_upload_id, status)
|
138
166
|
connection = self.connection
|
139
167
|
|
140
|
-
|
168
|
+
url = "v0.1/apps/#{owner_name}/#{app_name}/symbol_uploads/#{symbol_upload_id}"
|
169
|
+
body = {
|
170
|
+
status: status
|
171
|
+
}
|
172
|
+
|
173
|
+
UI.message("DEBUG: PATCH #{url}") if ENV['DEBUG']
|
174
|
+
UI.message("DEBUG: PATCH body #{JSON.pretty_generate(body)}\n") if ENV['DEBUG']
|
175
|
+
|
176
|
+
response = connection.patch(url) do |req|
|
141
177
|
req.headers['X-API-Token'] = api_token
|
142
178
|
req.headers['internal-request-source'] = "fastlane"
|
143
|
-
req.body =
|
144
|
-
"status" => status
|
145
|
-
}
|
179
|
+
req.body = body
|
146
180
|
end
|
147
181
|
|
182
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
183
|
+
|
148
184
|
case response.status
|
149
185
|
when 200...300
|
150
|
-
UI.message("DEBUG: #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
151
186
|
response.body
|
152
187
|
when 401
|
153
188
|
UI.user_error!("Auth Error, provided invalid token")
|
@@ -164,6 +199,9 @@ module Fastlane
|
|
164
199
|
def self.upload_symbol(api_token, owner_name, app_name, symbol, symbol_type, symbol_upload_id, upload_url)
|
165
200
|
connection = self.connection(upload_url, true)
|
166
201
|
|
202
|
+
UI.message("DEBUG: PUT #{upload_url}") if ENV['DEBUG']
|
203
|
+
UI.message("DEBUG: PUT body <data>\n") if ENV['DEBUG']
|
204
|
+
|
167
205
|
response = connection.put do |req|
|
168
206
|
req.headers['x-ms-blob-type'] = "BlockBlob"
|
169
207
|
req.headers['Content-Length'] = File.size(symbol).to_s
|
@@ -171,20 +209,22 @@ module Fastlane
|
|
171
209
|
req.body = Faraday::UploadIO.new(symbol, 'application/octet-stream') if symbol && File.exist?(symbol)
|
172
210
|
end
|
173
211
|
|
174
|
-
|
175
|
-
|
212
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
213
|
+
|
214
|
+
log_type = "dSYM" if symbol_type == "Apple"
|
215
|
+
log_type = "mapping" if symbol_type == "Android"
|
176
216
|
|
177
217
|
case response.status
|
178
218
|
when 200...300
|
179
219
|
self.update_symbol_upload(api_token, owner_name, app_name, symbol_upload_id, 'committed')
|
180
|
-
UI.success("#{
|
220
|
+
UI.success("#{log_type} uploaded")
|
181
221
|
when 401
|
182
222
|
UI.user_error!("Auth Error, provided invalid token")
|
183
223
|
false
|
184
224
|
else
|
185
|
-
UI.error("Error uploading #{
|
225
|
+
UI.error("Error uploading #{log_type} #{response.status}: #{response.body}")
|
186
226
|
self.update_symbol_upload(api_token, owner_name, app_name, symbol_upload_id, 'aborted')
|
187
|
-
UI.error("#{
|
227
|
+
UI.error("#{log_type} upload aborted")
|
188
228
|
false
|
189
229
|
end
|
190
230
|
end
|
@@ -200,12 +240,17 @@ module Fastlane
|
|
200
240
|
# ipa field is used for .apk, .aab and .ipa files
|
201
241
|
options[:ipa] = Faraday::UploadIO.new(file, 'application/octet-stream') if file && File.exist?(file)
|
202
242
|
|
243
|
+
UI.message("DEBUG: POST #{upload_url}") if ENV['DEBUG']
|
244
|
+
UI.message("DEBUG: POST body <data>\n") if ENV['DEBUG']
|
245
|
+
|
203
246
|
response = connection.post do |req|
|
204
247
|
req.options.timeout = timeout
|
205
248
|
req.headers['internal-request-source'] = "fastlane"
|
206
249
|
req.body = options
|
207
250
|
end
|
208
251
|
|
252
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
253
|
+
|
209
254
|
case response.status
|
210
255
|
when 200...300
|
211
256
|
UI.message("Binary uploaded")
|
@@ -225,23 +270,30 @@ module Fastlane
|
|
225
270
|
def self.update_release_upload(api_token, owner_name, app_name, upload_id, status)
|
226
271
|
connection = self.connection
|
227
272
|
|
228
|
-
|
273
|
+
url = "v0.1/apps/#{owner_name}/#{app_name}/release_uploads/#{upload_id}"
|
274
|
+
body = {
|
275
|
+
status: status
|
276
|
+
}
|
277
|
+
|
278
|
+
UI.message("DEBUG: PATCH #{url}") if ENV['DEBUG']
|
279
|
+
UI.message("DEBUG: PATCH body #{JSON.pretty_generate(body)}\n") if ENV['DEBUG']
|
280
|
+
|
281
|
+
response = connection.patch(url) do |req|
|
229
282
|
req.headers['X-API-Token'] = api_token
|
230
283
|
req.headers['internal-request-source'] = "fastlane"
|
231
|
-
req.body =
|
232
|
-
"status" => status
|
233
|
-
}
|
284
|
+
req.body = body
|
234
285
|
end
|
235
286
|
|
287
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
288
|
+
|
236
289
|
case response.status
|
237
290
|
when 200...300
|
238
|
-
UI.message("DEBUG: #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
239
291
|
response.body
|
240
292
|
when 401
|
241
293
|
UI.user_error!("Auth Error, provided invalid token")
|
242
294
|
false
|
243
295
|
when 500...600
|
244
|
-
UI.
|
296
|
+
UI.abort_with_message!("Internal Service Error, please try again later")
|
245
297
|
else
|
246
298
|
UI.error("Error #{response.status}: #{response.body}")
|
247
299
|
false
|
@@ -251,15 +303,21 @@ module Fastlane
|
|
251
303
|
# get existing release
|
252
304
|
def self.get_release(api_token, owner_name, app_name, release_id)
|
253
305
|
connection = self.connection
|
254
|
-
|
306
|
+
|
307
|
+
url = "v0.1/apps/#{owner_name}/#{app_name}/releases/#{release_id}"
|
308
|
+
|
309
|
+
UI.message("DEBUG: GET #{url}") if ENV['DEBUG']
|
310
|
+
|
311
|
+
response = connection.get(url) do |req|
|
255
312
|
req.headers['X-API-Token'] = api_token
|
256
313
|
req.headers['internal-request-source'] = "fastlane"
|
257
314
|
end
|
258
315
|
|
316
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
317
|
+
|
259
318
|
case response.status
|
260
319
|
when 200...300
|
261
320
|
release = response.body
|
262
|
-
UI.message("DEBUG: #{JSON.pretty_generate(release)}") if ENV['DEBUG']
|
263
321
|
release
|
264
322
|
when 404
|
265
323
|
UI.error("Not found, invalid release url")
|
@@ -277,15 +335,20 @@ module Fastlane
|
|
277
335
|
def self.get_destination(api_token, owner_name, app_name, destination_type, destination_name)
|
278
336
|
connection = self.connection
|
279
337
|
|
280
|
-
|
338
|
+
url = "v0.1/apps/#{owner_name}/#{app_name}/distribution_#{destination_type}s/#{ERB::Util.url_encode(destination_name)}"
|
339
|
+
|
340
|
+
UI.message("DEBUG: GET #{url}") if ENV['DEBUG']
|
341
|
+
|
342
|
+
response = connection.get(url) do |req|
|
281
343
|
req.headers['X-API-Token'] = api_token
|
282
344
|
req.headers['internal-request-source'] = "fastlane"
|
283
345
|
end
|
284
346
|
|
347
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
348
|
+
|
285
349
|
case response.status
|
286
350
|
when 200...300
|
287
351
|
destination = response.body
|
288
|
-
UI.message("DEBUG: received #{destination_type} #{JSON.pretty_generate(destination)}") if ENV['DEBUG']
|
289
352
|
destination
|
290
353
|
when 404
|
291
354
|
UI.error("Not found, invalid distribution #{destination_type} name")
|
@@ -303,14 +366,22 @@ module Fastlane
|
|
303
366
|
def self.update_release(api_token, owner_name, app_name, release_id, release_notes = '')
|
304
367
|
connection = self.connection
|
305
368
|
|
306
|
-
|
369
|
+
url = "v0.1/apps/#{owner_name}/#{app_name}/releases/#{release_id}"
|
370
|
+
body = {
|
371
|
+
release_notes: release_notes
|
372
|
+
}
|
373
|
+
|
374
|
+
UI.message("DEBUG: PUT #{url}") if ENV['DEBUG']
|
375
|
+
UI.message("DEBUG: PUT body #{JSON.pretty_generate(body)}\n") if ENV['DEBUG']
|
376
|
+
|
377
|
+
response = connection.put(url) do |req|
|
307
378
|
req.headers['X-API-Token'] = api_token
|
308
379
|
req.headers['internal-request-source'] = "fastlane"
|
309
|
-
req.body =
|
310
|
-
release_notes: release_notes
|
311
|
-
}
|
380
|
+
req.body = body
|
312
381
|
end
|
313
382
|
|
383
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
384
|
+
|
314
385
|
case response.status
|
315
386
|
when 200...300
|
316
387
|
# get full release info
|
@@ -319,8 +390,6 @@ module Fastlane
|
|
319
390
|
|
320
391
|
download_url = release['download_url']
|
321
392
|
|
322
|
-
UI.message("DEBUG: #{JSON.pretty_generate(release)}") if ENV['DEBUG']
|
323
|
-
|
324
393
|
Actions.lane_context[Fastlane::Actions::SharedValues::APPCENTER_DOWNLOAD_LINK] = download_url
|
325
394
|
Actions.lane_context[Fastlane::Actions::SharedValues::APPCENTER_BUILD_INFORMATION] = release
|
326
395
|
|
@@ -343,19 +412,25 @@ module Fastlane
|
|
343
412
|
def self.update_release_metadata(api_token, owner_name, app_name, release_id, dsa_signature)
|
344
413
|
return if dsa_signature.to_s == ''
|
345
414
|
|
346
|
-
|
347
|
-
|
415
|
+
url = "v0.1/apps/#{owner_name}/#{app_name}/releases/#{release_id}"
|
416
|
+
body = {
|
417
|
+
metadata: {
|
418
|
+
dsa_signature: dsa_signature
|
419
|
+
}
|
348
420
|
}
|
349
421
|
|
422
|
+
UI.message("DEBUG: PATCH #{url}") if ENV['DEBUG']
|
423
|
+
UI.message("DEBUG: PATCH body #{JSON.pretty_generate(body)}\n") if ENV['DEBUG']
|
424
|
+
|
350
425
|
connection = self.connection
|
351
|
-
response = connection.patch(
|
426
|
+
response = connection.patch(url) do |req|
|
352
427
|
req.headers['X-API-Token'] = api_token
|
353
428
|
req.headers['internal-request-source'] = "fastlane"
|
354
|
-
req.body =
|
355
|
-
metadata: release_metadata
|
356
|
-
}
|
429
|
+
req.body = body
|
357
430
|
end
|
358
431
|
|
432
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
433
|
+
|
359
434
|
case response.status
|
360
435
|
when 200...300
|
361
436
|
UI.message("Release Metadata was successfully updated for release '#{release_id}'")
|
@@ -375,20 +450,27 @@ module Fastlane
|
|
375
450
|
def self.add_to_destination(api_token, owner_name, app_name, release_id, destination_type, destination_id, mandatory_update = false, notify_testers = false)
|
376
451
|
connection = self.connection
|
377
452
|
|
378
|
-
|
453
|
+
url = "v0.1/apps/#{owner_name}/#{app_name}/releases/#{release_id}/#{destination_type}s"
|
454
|
+
body = {
|
455
|
+
id: destination_id
|
456
|
+
}
|
379
457
|
|
380
|
-
body = { "id" => destination_id }
|
381
458
|
if destination_type == "group"
|
382
459
|
body["mandatory_update"] = mandatory_update
|
383
460
|
body["notify_testers"] = notify_testers
|
384
461
|
end
|
385
462
|
|
386
|
-
|
463
|
+
UI.message("DEBUG: POST #{url}") if ENV['DEBUG']
|
464
|
+
UI.message("DEBUG: POST body #{JSON.pretty_generate(body)}\n") if ENV['DEBUG']
|
465
|
+
|
466
|
+
response = connection.post(url) do |req|
|
387
467
|
req.headers['X-API-Token'] = api_token
|
388
468
|
req.headers['internal-request-source'] = "fastlane"
|
389
469
|
req.body = body
|
390
470
|
end
|
391
471
|
|
472
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
473
|
+
|
392
474
|
case response.status
|
393
475
|
when 200...300
|
394
476
|
# get full release info
|
@@ -397,8 +479,6 @@ module Fastlane
|
|
397
479
|
|
398
480
|
download_url = release['download_url']
|
399
481
|
|
400
|
-
UI.message("DEBUG: received release #{JSON.pretty_generate(release)}") if ENV['DEBUG']
|
401
|
-
|
402
482
|
Actions.lane_context[Fastlane::Actions::SharedValues::APPCENTER_DOWNLOAD_LINK] = download_url
|
403
483
|
Actions.lane_context[Fastlane::Actions::SharedValues::APPCENTER_BUILD_INFORMATION] = release
|
404
484
|
|
@@ -421,11 +501,17 @@ module Fastlane
|
|
421
501
|
def self.get_app(api_token, owner_name, app_name)
|
422
502
|
connection = self.connection
|
423
503
|
|
424
|
-
|
504
|
+
url = "v0.1/apps/#{owner_name}/#{app_name}"
|
505
|
+
|
506
|
+
UI.message("DEBUG: GET #{url}") if ENV['DEBUG']
|
507
|
+
|
508
|
+
response = connection.get(url) do |req|
|
425
509
|
req.headers['X-API-Token'] = api_token
|
426
510
|
req.headers['internal-request-source'] = "fastlane"
|
427
511
|
end
|
428
512
|
|
513
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
514
|
+
|
429
515
|
case response.status
|
430
516
|
when 200...300
|
431
517
|
UI.message("DEBUG: #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
@@ -446,23 +532,28 @@ module Fastlane
|
|
446
532
|
def self.create_app(api_token, owner_type, owner_name, app_name, app_display_name, os, platform)
|
447
533
|
connection = self.connection
|
448
534
|
|
449
|
-
|
535
|
+
url = owner_type == "user" ? "v0.1/apps" : "v0.1/orgs/#{owner_name}/apps"
|
536
|
+
body = {
|
537
|
+
display_name: app_display_name,
|
538
|
+
name: app_name,
|
539
|
+
os: os,
|
540
|
+
platform: platform
|
541
|
+
}
|
542
|
+
|
543
|
+
UI.message("DEBUG: POST #{url}") if ENV['DEBUG']
|
544
|
+
UI.message("DEBUG: POST body #{JSON.pretty_generate(body)}\n") if ENV['DEBUG']
|
450
545
|
|
451
|
-
response = connection.post(
|
546
|
+
response = connection.post(url) do |req|
|
452
547
|
req.headers['X-API-Token'] = api_token
|
453
548
|
req.headers['internal-request-source'] = "fastlane"
|
454
|
-
req.body =
|
455
|
-
"display_name" => app_display_name,
|
456
|
-
"name" => app_name,
|
457
|
-
"os" => os,
|
458
|
-
"platform" => platform
|
459
|
-
}
|
549
|
+
req.body = body
|
460
550
|
end
|
461
551
|
|
552
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
553
|
+
|
462
554
|
case response.status
|
463
555
|
when 200...300
|
464
556
|
created = response.body
|
465
|
-
UI.message("DEBUG: #{JSON.pretty_generate(created)}") if ENV['DEBUG']
|
466
557
|
UI.success("Created #{os}/#{platform} app with name \"#{created['name']}\" and display name \"#{created['display_name']}\" for #{owner_type} \"#{owner_name}\"")
|
467
558
|
true
|
468
559
|
when 401
|
@@ -477,16 +568,19 @@ module Fastlane
|
|
477
568
|
def self.fetch_distribution_groups(api_token:, owner_name:, app_name:)
|
478
569
|
connection = self.connection
|
479
570
|
|
480
|
-
|
571
|
+
url = "/v0.1/apps/#{owner_name}/#{app_name}/distribution_groups"
|
572
|
+
|
573
|
+
UI.message("DEBUG: GET #{url}") if ENV['DEBUG']
|
481
574
|
|
482
|
-
response = connection.get(
|
575
|
+
response = connection.get(url) do |req|
|
483
576
|
req.headers['X-API-Token'] = api_token
|
484
577
|
req.headers['internal-request-source'] = "fastlane"
|
485
578
|
end
|
486
579
|
|
580
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
581
|
+
|
487
582
|
case response.status
|
488
583
|
when 200...300
|
489
|
-
UI.message("DEBUG: #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
490
584
|
response.body
|
491
585
|
when 401
|
492
586
|
UI.user_error!("Auth Error, provided invalid token")
|
@@ -503,16 +597,19 @@ module Fastlane
|
|
503
597
|
def self.fetch_devices(api_token:, owner_name:, app_name:, distribution_group:)
|
504
598
|
connection = self.connection(nil, false, true)
|
505
599
|
|
506
|
-
|
600
|
+
url = "/v0.1/apps/#{owner_name}/#{app_name}/distribution_groups/#{ERB::Util.url_encode(distribution_group)}/devices/download_devices_list"
|
601
|
+
|
602
|
+
UI.message("DEBUG: GET #{url}") if ENV['DEBUG']
|
507
603
|
|
508
|
-
response = connection.get(
|
604
|
+
response = connection.get(url) do |req|
|
509
605
|
req.headers['X-API-Token'] = api_token
|
510
606
|
req.headers['internal-request-source'] = "fastlane"
|
511
607
|
end
|
512
608
|
|
609
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
610
|
+
|
513
611
|
case response.status
|
514
612
|
when 200...300
|
515
|
-
UI.message("DEBUG: #{response.body.inspect}") if ENV['DEBUG']
|
516
613
|
response.body
|
517
614
|
when 401
|
518
615
|
UI.user_error!("Auth Error, provided invalid token")
|
@@ -529,16 +626,19 @@ module Fastlane
|
|
529
626
|
def self.fetch_releases(api_token:, owner_name:, app_name:)
|
530
627
|
connection = self.connection(nil, false, true)
|
531
628
|
|
532
|
-
|
629
|
+
url = "/v0.1/apps/#{owner_name}/#{app_name}/releases"
|
533
630
|
|
534
|
-
|
631
|
+
UI.message("DEBUG: GET #{url}") if ENV['DEBUG']
|
632
|
+
|
633
|
+
response = connection.get(url) do |req|
|
535
634
|
req.headers['X-API-Token'] = api_token
|
536
635
|
req.headers['internal-request-source'] = "fastlane"
|
537
636
|
end
|
538
637
|
|
638
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
639
|
+
|
539
640
|
case response.status
|
540
641
|
when 200...300
|
541
|
-
UI.message("DEBUG: #{response.body.inspect}") if ENV['DEBUG']
|
542
642
|
JSON.parse(response.body)
|
543
643
|
when 401
|
544
644
|
UI.user_error!("Auth Error, provided invalid token")
|
@@ -552,17 +652,58 @@ module Fastlane
|
|
552
652
|
end
|
553
653
|
end
|
554
654
|
|
555
|
-
# Note: This does not support testing environment (INT)
|
556
655
|
def self.get_release_url(owner_type, owner_name, app_name, release_id)
|
557
656
|
owner_path = owner_type == "user" ? "users/#{owner_name}" : "orgs/#{owner_name}"
|
657
|
+
if ENV['APPCENTER_ENV']&.upcase == 'INT'
|
658
|
+
return "https://portal-server-core-integration.dev.avalanch.es/#{owner_path}/apps/#{app_name}/distribute/releases/#{release_id}"
|
659
|
+
end
|
660
|
+
|
558
661
|
return "https://appcenter.ms/#{owner_path}/apps/#{app_name}/distribute/releases/#{release_id}"
|
559
662
|
end
|
560
663
|
|
561
|
-
# Note: This does not support testing environment (INT)
|
562
664
|
def self.get_install_url(owner_type, owner_name, app_name)
|
563
665
|
owner_path = owner_type == "user" ? "users/#{owner_name}" : "orgs/#{owner_name}"
|
666
|
+
if ENV['APPCENTER_ENV']&.upcase == 'INT'
|
667
|
+
return "https://install.portal-server-core-integration.dev.avalanch.es/#{owner_path}/apps/#{app_name}"
|
668
|
+
end
|
669
|
+
|
564
670
|
return "https://install.appcenter.ms/#{owner_path}/apps/#{app_name}"
|
565
671
|
end
|
672
|
+
|
673
|
+
# add new created app to existing distribution group
|
674
|
+
def self.add_new_app_to_distribution_group(api_token:, owner_name:, app_name:, destination_name:)
|
675
|
+
url = URI.escape("/v0.1/orgs/#{owner_name}/distribution_groups/#{destination_name}/apps")
|
676
|
+
body = {
|
677
|
+
apps: [
|
678
|
+
{ name: app_name }
|
679
|
+
]
|
680
|
+
}
|
681
|
+
|
682
|
+
UI.message("DEBUG: POST #{url}") if ENV['DEBUG']
|
683
|
+
UI.message("DEBUG: POST body #{JSON.pretty_generate(body)}\n") if ENV['DEBUG']
|
684
|
+
|
685
|
+
response = connection.post(url) do |req|
|
686
|
+
req.headers['X-API-Token'] = api_token
|
687
|
+
req.headers['internal-request-source'] = "fastlane"
|
688
|
+
req.body = body
|
689
|
+
end
|
690
|
+
|
691
|
+
UI.message("DEBUG: #{response.status} #{JSON.pretty_generate(response.body)}\n") if ENV['DEBUG']
|
692
|
+
|
693
|
+
case response.status
|
694
|
+
when 200...300
|
695
|
+
created = response.body
|
696
|
+
UI.success("Added new app #{app_name} to distribution group #{destination_name}")
|
697
|
+
when 401
|
698
|
+
UI.user_error!("Auth Error, provided invalid token")
|
699
|
+
when 404
|
700
|
+
UI.error("Not found, invalid distribution group name #{destination_name}")
|
701
|
+
when 409
|
702
|
+
UI.success("App already added to distribution group #{destination_name}")
|
703
|
+
else
|
704
|
+
UI.error("Error adding app to distribution group #{response.status}: #{response.body}")
|
705
|
+
end
|
706
|
+
end
|
566
707
|
end
|
567
708
|
end
|
568
709
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-appcenter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.8.
|
4
|
+
version: 1.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Microsoft Corporation
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 0.77.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: webmock
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
description:
|
112
126
|
email:
|
113
127
|
executables: []
|
@@ -141,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
141
155
|
- !ruby/object:Gem::Version
|
142
156
|
version: '0'
|
143
157
|
requirements: []
|
144
|
-
rubygems_version: 3.0.
|
158
|
+
rubygems_version: 3.0.8
|
145
159
|
signing_key:
|
146
160
|
specification_version: 4
|
147
161
|
summary: Fastlane plugin for App Center
|