fastlane-plugin-appcenter 1.8.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
|