fastlane-plugin-waldo 1.2.0 → 1.6.0
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
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 930bf4de096a32ef717f5f4e9a488cf85e13ec1a8c58058ace10ebf583948302
|
4
|
+
data.tar.gz: 1d044beebccaaf38e426370990f046fd3fbc59d08d657bccfa8321cf757fa733
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df074478d0982a2851bc5d2e936859d5843735002dfb505bd12c60a3e5db091618894db725d0734a23540b4106ff254134534b42e2a3f003301429bd4fd52cb2
|
7
|
+
data.tar.gz: 533d8fae7a307686e93af2908bc11d3e858f8b6f8cd7ef1136e97851873e425103bf7a85015ce455989685147d7222075289cfe82e724fa8e3762bf54e61e2c9
|
@@ -2,34 +2,26 @@ module Fastlane
|
|
2
2
|
module Actions
|
3
3
|
class WaldoAction < Action
|
4
4
|
def self.run(params)
|
5
|
-
|
5
|
+
mparams = Helper::WaldoHelper.filter_parameters(params)
|
6
6
|
|
7
|
-
|
7
|
+
return unless Helper::WaldoHelper.validate_parameters(mparams)
|
8
8
|
|
9
|
-
|
10
|
-
UI.error("You must pass an APK path to the Waldo action") and return unless params[:apk_path]
|
11
|
-
elsif platform == :ios || platform.nil?
|
12
|
-
UI.error("You must pass an IPA or app path to the Waldo action") and return unless params[:ipa_path] || params[:app_path]
|
13
|
-
end
|
14
|
-
|
15
|
-
UI.error("You must pass an upload token to the Waldo action") and return unless params[:upload_token]
|
16
|
-
|
17
|
-
FastlaneCore::PrintTable.print_values(config: params,
|
9
|
+
FastlaneCore::PrintTable.print_values(config: mparams,
|
18
10
|
title: "Summary for waldo #{Fastlane::Waldo::VERSION.to_s}")
|
19
11
|
|
20
|
-
Helper::WaldoHelper.upload_build
|
12
|
+
Helper::WaldoHelper.upload_build
|
13
|
+
Helper::WaldoHelper.upload_symbols
|
21
14
|
end
|
22
15
|
|
23
16
|
def self.authors
|
24
|
-
[
|
17
|
+
['eBardX']
|
25
18
|
end
|
26
19
|
|
27
20
|
def self.available_options
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
elsif platform == :ios || platform.nil?
|
21
|
+
case Helper::WaldoHelper.get_platform
|
22
|
+
when :android
|
23
|
+
apk_path_default = Dir["*.apk"].last || Dir[File.join('app', 'build', 'outputs', 'apk', 'app-release.apk')].last
|
24
|
+
when :ios
|
33
25
|
app_path_default = Dir["*.app"].sort_by { |x| File.mtime(x) }.last
|
34
26
|
ipa_path_default = Dir["*.ipa"].sort_by { |x| File.mtime(x) }.last
|
35
27
|
end
|
@@ -37,50 +29,45 @@ module Fastlane
|
|
37
29
|
[
|
38
30
|
# iOS-specific
|
39
31
|
FastlaneCore::ConfigItem.new(key: :app_path,
|
40
|
-
env_name:
|
41
|
-
description:
|
32
|
+
env_name: 'WALDO_APP_PATH',
|
33
|
+
description: 'Path to your app file',
|
42
34
|
default_value: app_path_default,
|
43
35
|
default_value_dynamic: true,
|
44
|
-
optional: true,
|
45
|
-
verify_block: proc do |value|
|
46
|
-
UI.error("Unable to find app file at path '#{value.to_s}'") unless File.exist?(value)
|
47
|
-
end),
|
36
|
+
optional: true),
|
48
37
|
FastlaneCore::ConfigItem.new(key: :ipa_path,
|
49
|
-
env_name:
|
50
|
-
description:
|
38
|
+
env_name: 'WALDO_IPA_PATH',
|
39
|
+
description: 'Path to your IPA file (optional if you use the _gym_ or _xcodebuild_ action)',
|
51
40
|
default_value: Actions.lane_context[Actions::SharedValues::IPA_OUTPUT_PATH] || ipa_path_default,
|
52
41
|
default_value_dynamic: true,
|
42
|
+
optional: true),
|
43
|
+
FastlaneCore::ConfigItem.new(key: :dsym_path,
|
44
|
+
env_name: 'WALDO_DSYM_PATH',
|
45
|
+
description: 'Path to your dSYM file(s)',
|
46
|
+
optional: true),
|
47
|
+
FastlaneCore::ConfigItem.new(key: :include_symbols,
|
48
|
+
env_name: 'WALDO_INCLUDE_SYMBOLS',
|
49
|
+
description: 'Include symbols in upload if true',
|
53
50
|
optional: true,
|
54
|
-
|
55
|
-
|
56
|
-
end),
|
51
|
+
default_value: false,
|
52
|
+
is_string: false),
|
57
53
|
# Android-specific
|
58
54
|
FastlaneCore::ConfigItem.new(key: :apk_path,
|
59
|
-
env_name:
|
60
|
-
description:
|
55
|
+
env_name: 'WALDO_APK_PATH',
|
56
|
+
description: 'Path to your APK file (optional if you use the _gradle_ action)',
|
61
57
|
default_value: Actions.lane_context[Actions::SharedValues::GRADLE_APK_OUTPUT_PATH] || apk_path_default,
|
62
58
|
default_value_dynamic: true,
|
63
|
-
optional: true,
|
64
|
-
verify_block: proc do |value|
|
65
|
-
UI.error("Unable to find APK file at path '#{value.to_s}'") unless File.exist?(value)
|
66
|
-
end),
|
59
|
+
optional: true),
|
67
60
|
# General
|
68
61
|
FastlaneCore::ConfigItem.new(key: :upload_token,
|
69
|
-
env_name:
|
70
|
-
description:
|
62
|
+
env_name: 'WALDO_UPLOAD_TOKEN',
|
63
|
+
description: 'Waldo upload token',
|
71
64
|
optional: true,
|
72
|
-
sensitive: true,
|
73
|
-
verify_block: proc do |value|
|
74
|
-
UI.error("No upload token for Waldo given, pass using `upload_token: 'value'`") unless value && !value.empty?
|
75
|
-
end),
|
65
|
+
sensitive: true),
|
76
66
|
FastlaneCore::ConfigItem.new(key: :variant_name,
|
77
|
-
env_name:
|
78
|
-
description:
|
67
|
+
env_name: 'WALDO_VARIANT_NAME',
|
68
|
+
description: 'Waldo variant name',
|
79
69
|
optional: true,
|
80
|
-
sensitive: true
|
81
|
-
verify_block: proc do |value|
|
82
|
-
UI.error("No variant name for Waldo given, pass using `variant_name: 'value'`") unless value && !value.empty?
|
83
|
-
end)
|
70
|
+
sensitive: true)
|
84
71
|
]
|
85
72
|
end
|
86
73
|
|
@@ -89,27 +76,27 @@ module Fastlane
|
|
89
76
|
end
|
90
77
|
|
91
78
|
def self.description
|
92
|
-
|
79
|
+
'Upload a new build to [Waldo](https://www.waldo.io)'
|
93
80
|
end
|
94
81
|
|
95
82
|
def self.example_code
|
96
83
|
[
|
97
84
|
'waldo',
|
98
|
-
|
99
|
-
upload_token:
|
100
|
-
)
|
101
|
-
|
102
|
-
apk_path:
|
103
|
-
upload_token:
|
104
|
-
)
|
105
|
-
|
106
|
-
ipa_path:
|
107
|
-
upload_token:
|
108
|
-
)
|
109
|
-
|
110
|
-
app_path:
|
111
|
-
upload_token:
|
112
|
-
)
|
85
|
+
"waldo(
|
86
|
+
upload_token: '...'
|
87
|
+
)",
|
88
|
+
"waldo(
|
89
|
+
apk_path: './YourApp.apk',
|
90
|
+
upload_token: '...'
|
91
|
+
)",
|
92
|
+
"waldo(
|
93
|
+
ipa_path: './YourApp.ipa',
|
94
|
+
upload_token: '...'
|
95
|
+
)",
|
96
|
+
"waldo(
|
97
|
+
app_path: './YourApp.app',
|
98
|
+
upload_token: '...'
|
99
|
+
)"
|
113
100
|
]
|
114
101
|
end
|
115
102
|
|
@@ -1,65 +1,229 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'json'
|
1
3
|
require 'net/http'
|
2
4
|
|
3
5
|
module Fastlane
|
4
6
|
module Helper
|
5
7
|
class WaldoHelper
|
6
|
-
def self.
|
7
|
-
|
8
|
+
def self.convert_commit(sha)
|
9
|
+
puts "Entering convert_commit(#{sha})"
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
uri_string = 'https://api.waldo.io/versions'
|
11
|
+
prefix = 'remotes/origin/'
|
12
|
+
pfxlen = prefix.length
|
12
13
|
|
13
|
-
|
14
|
+
full_name = get_git_commit_name(sha)
|
14
15
|
|
15
|
-
|
16
|
+
if full_name.start_with?(prefix)
|
17
|
+
abbr_name = full_name[pfxlen..-1]
|
18
|
+
else
|
19
|
+
abbr_name = "local:#{full_name}"
|
20
|
+
end
|
16
21
|
|
17
|
-
|
22
|
+
%("#{sha[0..7]}-#{abbr_name}")
|
23
|
+
end
|
18
24
|
|
19
|
-
|
25
|
+
def self.dump_request(request)
|
26
|
+
len = request.body ? request.body.length : 0
|
20
27
|
|
21
|
-
|
22
|
-
http.read_timeout = 120 # 2 minutes
|
28
|
+
puts "Request: #{request.method} #{request.path} (#{len} bytes)"
|
23
29
|
|
24
|
-
|
25
|
-
|
26
|
-
rescue Net::ReadTimeout
|
27
|
-
UI.error("Upload to Waldo timed out!")
|
28
|
-
rescue => exc
|
29
|
-
UI.error("Something went wrong uploading to Waldo: #{exc.inspect.to_s}")
|
30
|
-
ensure
|
31
|
-
request.body_stream.close if request && request.body_stream
|
30
|
+
request.each_capitalized do |key, value|
|
31
|
+
puts " #{key}: #{value}"
|
32
32
|
end
|
33
|
+
|
34
|
+
puts '-------'
|
33
35
|
end
|
34
36
|
|
35
|
-
def self.
|
36
|
-
|
37
|
+
def self.dump_response(response)
|
38
|
+
puts "Response: #{response.code} #{response.message} (#{response.body.length} bytes)"
|
39
|
+
|
40
|
+
response.each_capitalized do |key, value|
|
41
|
+
puts " #{key}: #{value}"
|
42
|
+
end
|
43
|
+
|
44
|
+
puts "#{response.body}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.filter_parameters(in_params)
|
48
|
+
out_params = {}
|
49
|
+
|
50
|
+
apk_path = in_params[:apk_path]
|
51
|
+
app_path = in_params[:app_path]
|
52
|
+
dsym_path = in_params[:dsym_path]
|
53
|
+
include_symbols = in_params[:include_symbols]
|
54
|
+
ipa_path = in_params[:ipa_path]
|
55
|
+
upload_token = in_params[:upload_token]
|
56
|
+
variant_name = in_params[:variant_name]
|
57
|
+
|
58
|
+
apk_path.gsub!("\\ ", ' ') if apk_path
|
59
|
+
app_path.gsub!("\\ ", ' ') if app_path
|
60
|
+
dsym_path.gsub!("\\ ", ' ') if dsym_path
|
61
|
+
ipa_path.gsub!("\\ ", ' ') if ipa_path
|
62
|
+
|
63
|
+
out_params[:apk_path] = apk_path if apk_path
|
64
|
+
|
65
|
+
if app_path && ipa_path
|
66
|
+
if !File.exist?(app_path)
|
67
|
+
out_params[:ipa_path] = ipa_path
|
68
|
+
|
69
|
+
app_path = nil
|
70
|
+
elsif !File.exist?(ipa_path)
|
71
|
+
out_params[:app_path] = app_path
|
37
72
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
elsif platform == :ios || platform.nil?
|
42
|
-
if params[:app_path]
|
43
|
-
app_dir_path = File.dirname(params[:app_path])
|
44
|
-
app_name = File.basename(params[:app_path])
|
45
|
-
body_path = File.join(Dir.tmpdir, "#{app_name}.zip")
|
73
|
+
ipa_path = nil
|
74
|
+
elsif File.mtime(app_path) < File.mtime(ipa_path)
|
75
|
+
out_params[:ipa_path] = ipa_path
|
46
76
|
|
47
|
-
|
77
|
+
app_path = nil
|
48
78
|
else
|
49
|
-
|
79
|
+
out_params[:app_path] = app_path
|
80
|
+
|
81
|
+
ipa_path = nil
|
82
|
+
end
|
83
|
+
else
|
84
|
+
out_params[:app_path] = app_path if app_path
|
85
|
+
out_params[:ipa_path] = ipa_path if ipa_path
|
86
|
+
end
|
87
|
+
|
88
|
+
if app_path
|
89
|
+
if include_symbols
|
90
|
+
if !dsym_path
|
91
|
+
tmp_path = "#{app_path}.dSYM.zip"
|
92
|
+
dsym_path = tmp_path if File.exist?(tmp_path)
|
93
|
+
end
|
94
|
+
|
95
|
+
if !dsym_path
|
96
|
+
tmp_path = "#{app_path}.dSYM"
|
97
|
+
dsym_path = tmp_path if File.exist?(tmp_path)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
out_params[:dsym_path] = dsym_path if dsym_path
|
102
|
+
else
|
103
|
+
out_params[:dsym_path] = dsym_path if dsym_path && ipa_path
|
104
|
+
end
|
105
|
+
|
106
|
+
out_params[:upload_token] = upload_token if upload_token && !upload_token.empty?
|
107
|
+
out_params[:variant_name] = variant_name if variant_name
|
108
|
+
|
109
|
+
out_params
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.get_authorization
|
113
|
+
"Upload-Token #{@upload_token}"
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.get_flavor
|
117
|
+
case get_platform
|
118
|
+
when :android
|
119
|
+
"Android"
|
120
|
+
when :ios
|
121
|
+
"iOS"
|
122
|
+
else
|
123
|
+
"unknown"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def self.get_git_commit_name(sha)
|
128
|
+
cmd = %(git name-rev --exclude='tags/*' --name-only "#{sha}")
|
129
|
+
|
130
|
+
puts "Calling: #{cmd}" if FastlaneCore::Globals.verbose?
|
131
|
+
|
132
|
+
result = Actions.sh(cmd, log: false).chomp
|
133
|
+
|
134
|
+
puts "#{cmd} => #{result}" if FastlaneCore::Globals.verbose?
|
135
|
+
|
136
|
+
result
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.get_git_commits
|
140
|
+
cmd = %(git log --format=%H -50)
|
141
|
+
|
142
|
+
result = Actions.sh(cmd, log: false).chomp
|
143
|
+
|
144
|
+
puts "#{cmd} => #{result}" if FastlaneCore::Globals.verbose?
|
145
|
+
|
146
|
+
result.split(' ')
|
147
|
+
end
|
148
|
+
|
149
|
+
def self.get_history
|
150
|
+
history = get_git_commits
|
151
|
+
|
152
|
+
return '' unless !history.empty?
|
153
|
+
|
154
|
+
history = history.map { |sha| convert_commit(sha) }
|
155
|
+
|
156
|
+
Base64.strict_encode64("[#{history.join(',')}]")
|
157
|
+
end
|
158
|
+
|
159
|
+
def self.get_platform
|
160
|
+
Actions.lane_context[Actions::SharedValues::PLATFORM_NAME] || :ios
|
161
|
+
end
|
162
|
+
|
163
|
+
def self.get_user_agent
|
164
|
+
"Waldo fastlane/#{get_flavor} v#{Fastlane::Waldo::VERSION}"
|
165
|
+
end
|
166
|
+
|
167
|
+
def self.handle_error(message)
|
168
|
+
UI.error(message)
|
169
|
+
|
170
|
+
UI.error('No token for error report upload to Waldo!') unless @upload_token
|
171
|
+
|
172
|
+
upload_error(message) if @upload_token
|
173
|
+
end
|
174
|
+
|
175
|
+
def self.has_git_command?
|
176
|
+
cmd = %(which git)
|
177
|
+
|
178
|
+
result = Actions.sh(cmd, log: false).chomp
|
179
|
+
|
180
|
+
puts "#{cmd} => #{result}" if FastlaneCore::Globals.verbose?
|
181
|
+
|
182
|
+
!result.empty?
|
183
|
+
end
|
184
|
+
|
185
|
+
def self.is_git_repository?
|
186
|
+
cmd = %(git rev-parse)
|
187
|
+
|
188
|
+
result = true
|
189
|
+
|
190
|
+
Actions.sh(cmd,
|
191
|
+
log: false,
|
192
|
+
error_callback: ->(ignore) { result = false }
|
193
|
+
).chomp
|
194
|
+
|
195
|
+
puts "#{cmd} => #{result}" if FastlaneCore::Globals.verbose?
|
196
|
+
|
197
|
+
result
|
198
|
+
end
|
199
|
+
|
200
|
+
def self.make_build_request(uri)
|
201
|
+
if @apk_path
|
202
|
+
body_path = @apk_path
|
203
|
+
elsif @ipa_path
|
204
|
+
body_path = @ipa_path
|
205
|
+
else
|
206
|
+
app_basename = File.basename(@app_path)
|
207
|
+
app_dirname = File.dirname(@app_path)
|
208
|
+
|
209
|
+
body_path = File.join(Dir.tmpdir, "#{app_basename}.zip")
|
210
|
+
|
211
|
+
unless zip(src_path: app_basename,
|
212
|
+
zip_path: body_path,
|
213
|
+
cd_path: app_dirname)
|
214
|
+
return nil
|
50
215
|
end
|
51
|
-
flavor = "iOS"
|
52
216
|
end
|
53
217
|
|
54
218
|
request = Net::HTTP::Post.new(uri.request_uri)
|
55
219
|
|
56
|
-
request['Authorization'] =
|
220
|
+
request['Authorization'] = get_authorization
|
57
221
|
request['Transfer-Encoding'] = 'chunked'
|
58
|
-
request['User-Agent'] =
|
222
|
+
request['User-Agent'] = get_user_agent
|
59
223
|
|
60
224
|
request.body_stream = WaldoReadIO.new(body_path)
|
61
225
|
|
62
|
-
if
|
226
|
+
if @app_path
|
63
227
|
request.content_type = 'application/zip'
|
64
228
|
else
|
65
229
|
request.content_type = 'application/octet-stream'
|
@@ -68,39 +232,324 @@ module Fastlane
|
|
68
232
|
request
|
69
233
|
end
|
70
234
|
|
71
|
-
def self.
|
72
|
-
|
235
|
+
def self.make_build_uri
|
236
|
+
if !has_git_command?
|
237
|
+
history_error = "noGitCommandFound"
|
238
|
+
elsif !is_git_repository?
|
239
|
+
history_error = "notGitRepository"
|
240
|
+
else
|
241
|
+
history = get_history
|
242
|
+
end
|
73
243
|
|
74
|
-
|
244
|
+
query = ''
|
75
245
|
|
76
|
-
|
77
|
-
|
246
|
+
if history
|
247
|
+
query += "&history=#{history}"
|
248
|
+
elsif history_error
|
249
|
+
query += "&historyError=#{history_error}"
|
78
250
|
end
|
79
251
|
|
80
|
-
|
252
|
+
query += "&variantName=#{@variant_name}" if @variant_name
|
253
|
+
|
254
|
+
uri_string = 'https://api.waldo.io/versions'
|
255
|
+
|
256
|
+
uri_string += "?#{query[1..-1]}" if !query.empty?
|
257
|
+
|
258
|
+
URI(uri_string)
|
81
259
|
end
|
82
260
|
|
83
|
-
def self.
|
84
|
-
|
261
|
+
def self.make_error_request(uri, message)
|
262
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
85
263
|
|
86
|
-
|
87
|
-
|
264
|
+
request['Authorization'] = get_authorization
|
265
|
+
request['User-Agent'] = get_user_agent
|
266
|
+
|
267
|
+
request.body = { "message": message }.to_json
|
268
|
+
request.content_type = 'application/json'
|
269
|
+
|
270
|
+
request
|
271
|
+
end
|
272
|
+
|
273
|
+
def self.make_error_uri
|
274
|
+
uri_string = 'https://api.waldo.io/uploadError'
|
275
|
+
|
276
|
+
URI(uri_string)
|
277
|
+
end
|
278
|
+
|
279
|
+
def self.make_symbols_request(uri)
|
280
|
+
if File.file?(@dsym_path)
|
281
|
+
body_path = @dsym_path
|
282
|
+
else
|
283
|
+
dsym_basename = File.basename(@dsym_path)
|
284
|
+
dsym_dirname = File.dirname(@dsym_path)
|
285
|
+
|
286
|
+
body_path = File.join(Dir.tmpdir, "#{dsym_basename}.zip")
|
287
|
+
|
288
|
+
unless zip(src_path: dsym_basename,
|
289
|
+
zip_path: body_path,
|
290
|
+
cd_path: dsym_dirname)
|
291
|
+
return nil
|
292
|
+
end
|
88
293
|
end
|
89
294
|
|
90
|
-
|
295
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
296
|
+
|
297
|
+
request['Authorization'] = get_authorization
|
298
|
+
request['Transfer-Encoding'] = 'chunked'
|
299
|
+
request['User-Agent'] = get_user_agent
|
300
|
+
|
301
|
+
request.body_stream = WaldoReadIO.new(body_path)
|
302
|
+
request.content_type = 'application/zip'
|
303
|
+
|
304
|
+
request
|
305
|
+
end
|
306
|
+
|
307
|
+
def self.make_symbols_uri
|
308
|
+
uri_string = 'https://api.waldo.io/versions/'
|
309
|
+
|
310
|
+
uri_string += @build_upload_id
|
311
|
+
uri_string += '/symbols'
|
312
|
+
|
313
|
+
URI(uri_string)
|
91
314
|
end
|
92
315
|
|
93
|
-
def self.
|
316
|
+
def self.parse_build_response(response)
|
94
317
|
dump_response(response) if FastlaneCore::Globals.verbose?
|
95
318
|
|
96
319
|
case response.code.to_i
|
97
320
|
when 200..299
|
98
321
|
UI.success('Build successfully uploaded to Waldo!')
|
99
322
|
when 401
|
100
|
-
|
323
|
+
handle_error('Token is invalid or missing for build upload to Waldo!')
|
324
|
+
else
|
325
|
+
handle_error("Build failed to upload to Waldo: #{response.code} #{response.message}")
|
326
|
+
end
|
327
|
+
|
328
|
+
result = JSON.parse(response.body)
|
329
|
+
|
330
|
+
@build_upload_id = result["id"]
|
331
|
+
end
|
332
|
+
|
333
|
+
def self.parse_error_response(response)
|
334
|
+
dump_response(response) if FastlaneCore::Globals.verbose?
|
335
|
+
|
336
|
+
case response.code.to_i
|
337
|
+
when 200..299
|
338
|
+
UI.success('Error report successfully uploaded to Waldo!')
|
339
|
+
when 401
|
340
|
+
UI.error('Token is invalid or missing for error report upload to Waldo!')
|
341
|
+
else
|
342
|
+
UI.error("Error report failed to upload to Waldo: #{response.code} #{response.message}")
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
def self.parse_symbols_response(response)
|
347
|
+
dump_response(response) if FastlaneCore::Globals.verbose?
|
348
|
+
|
349
|
+
case response.code.to_i
|
350
|
+
when 200..299
|
351
|
+
UI.success('Symbols successfully uploaded to Waldo!')
|
352
|
+
when 401
|
353
|
+
UI.error('Token is invalid or missing for symbols upload to Waldo!')
|
354
|
+
else
|
355
|
+
UI.error("Symbols failed to upload to Waldo: #{response.code} #{response.message}")
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
def self.upload_build
|
360
|
+
begin
|
361
|
+
@variant_name ||= Actions.lane_context[Actions::SharedValues::GRADLE_BUILD_TYPE]
|
362
|
+
|
363
|
+
uri = make_build_uri
|
364
|
+
|
365
|
+
request = make_build_request(uri)
|
366
|
+
|
367
|
+
return unless request
|
368
|
+
|
369
|
+
UI.success('Uploading build to Waldo')
|
370
|
+
|
371
|
+
dump_request(request) if FastlaneCore::Globals.verbose?
|
372
|
+
|
373
|
+
Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
|
374
|
+
http.read_timeout = 120 # 2 minutes
|
375
|
+
|
376
|
+
parse_build_response(http.request(request))
|
377
|
+
end
|
378
|
+
rescue Net::ReadTimeout => exc
|
379
|
+
handle_error('Build upload to Waldo timed out!')
|
380
|
+
rescue => exc
|
381
|
+
handle_error("Something went wrong uploading build to Waldo: #{exc.inspect.to_s}")
|
382
|
+
ensure
|
383
|
+
request.body_stream.close if request && request.body_stream
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
def self.upload_error(message)
|
388
|
+
begin
|
389
|
+
uri = make_error_uri
|
390
|
+
|
391
|
+
request = make_error_request(uri, message)
|
392
|
+
|
393
|
+
UI.error('Uploading error report to Waldo')
|
394
|
+
|
395
|
+
dump_request(request) if FastlaneCore::Globals.verbose?
|
396
|
+
|
397
|
+
Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
|
398
|
+
http.read_timeout = 30 # seconds
|
399
|
+
|
400
|
+
parse_error_response(http.request(request))
|
401
|
+
end
|
402
|
+
rescue Net::ReadTimeout => exc
|
403
|
+
UI.error('Error report upload to Waldo timed out!')
|
404
|
+
rescue => exc
|
405
|
+
UI.error("Something went wrong uploading error report to Waldo: #{exc.inspect.to_s}")
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
def self.upload_symbols
|
410
|
+
begin
|
411
|
+
return unless @dsym_path
|
412
|
+
|
413
|
+
uri = make_symbols_uri
|
414
|
+
|
415
|
+
request = make_symbols_request(uri)
|
416
|
+
|
417
|
+
return unless request
|
418
|
+
|
419
|
+
UI.success('Uploading symbols to Waldo')
|
420
|
+
|
421
|
+
dump_request(request) if FastlaneCore::Globals.verbose?
|
422
|
+
|
423
|
+
Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
|
424
|
+
http.read_timeout = 120 # 2 minutes
|
425
|
+
|
426
|
+
parse_symbols_response(http.request(request))
|
427
|
+
end
|
428
|
+
rescue Net::ReadTimeout => exc
|
429
|
+
handle_error('Symbols upload to Waldo timed out!')
|
430
|
+
rescue => exc
|
431
|
+
handle_error("Something went wrong uploading symbols to Waldo: #{exc.inspect.to_s}")
|
432
|
+
ensure
|
433
|
+
request.body_stream.close if request && request.body_stream
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
437
|
+
def self.validate_parameters(params)
|
438
|
+
@apk_path = params[:apk_path]
|
439
|
+
@app_path = params[:app_path]
|
440
|
+
@dsym_path = params[:dsym_path]
|
441
|
+
@ipa_path = params[:ipa_path]
|
442
|
+
@upload_token = params[:upload_token]
|
443
|
+
@variant_name = params[:variant_name]
|
444
|
+
|
445
|
+
unless @upload_token
|
446
|
+
handle_error('You must pass a nonempty upload token to the Waldo action')
|
447
|
+
|
448
|
+
return false
|
449
|
+
end
|
450
|
+
|
451
|
+
case get_platform
|
452
|
+
when :android
|
453
|
+
unless @apk_path
|
454
|
+
handle_error('You must pass an APK path to the Waldo action')
|
455
|
+
|
456
|
+
return false
|
457
|
+
end
|
458
|
+
|
459
|
+
unless File.exist?(@apk_path)
|
460
|
+
handle_error("Unable to find APK at path '#{@apk_path.to_s}'")
|
461
|
+
|
462
|
+
return false
|
463
|
+
end
|
464
|
+
|
465
|
+
unless File.file?(@apk_path) && File.readable?(@apk_path)
|
466
|
+
handle_error("Unable to read APK at path '#{@apk_path.to_s}'")
|
467
|
+
|
468
|
+
return false
|
469
|
+
end
|
470
|
+
when :ios
|
471
|
+
unless @app_path || @ipa_path
|
472
|
+
handle_error('You must pass an IPA or app path to the Waldo action')
|
473
|
+
|
474
|
+
return false
|
475
|
+
end
|
476
|
+
|
477
|
+
if @app_path
|
478
|
+
unless File.exist?(@app_path)
|
479
|
+
handle_error("Unable to find app at path '#{@app_path.to_s}'")
|
480
|
+
|
481
|
+
return false
|
482
|
+
end
|
483
|
+
|
484
|
+
unless File.directory?(@app_path) && File.readable?(@app_path)
|
485
|
+
handle_error("Unable to read app at path '#{@app_path.to_s}'")
|
486
|
+
|
487
|
+
return false
|
488
|
+
end
|
489
|
+
elsif @ipa_path
|
490
|
+
unless File.exist?(@ipa_path)
|
491
|
+
handle_error("Unable to find IPA at path '#{@ipa_path.to_s}'")
|
492
|
+
|
493
|
+
return false
|
494
|
+
end
|
495
|
+
|
496
|
+
unless File.file?(@ipa_path) && File.readable?(@ipa_path)
|
497
|
+
handle_error("Unable to read IPA at path '#{@ipa_path.to_s}'")
|
498
|
+
|
499
|
+
return false
|
500
|
+
end
|
501
|
+
end
|
502
|
+
|
503
|
+
if @dsym_path
|
504
|
+
unless File.exist?(@dsym_path)
|
505
|
+
handle_error("Unable to find symbols at path '#{@dsym_path.to_s}'")
|
506
|
+
|
507
|
+
return false
|
508
|
+
end
|
509
|
+
|
510
|
+
unless (File.directory?(@dsym_path) || File.file?(@dsym_path)) && File.readable?(@dsym_path)
|
511
|
+
handle_error("Unable to read symbols at path '#{@dsym_path.to_s}'")
|
512
|
+
|
513
|
+
return false
|
514
|
+
end
|
515
|
+
end
|
101
516
|
else
|
102
|
-
|
517
|
+
handle_error("Unsupported platform: '#{get_platform.to_s}'")
|
518
|
+
|
519
|
+
return false
|
520
|
+
end
|
521
|
+
|
522
|
+
if @variant_name && @variant_name.empty?
|
523
|
+
handle_error('Empty variant name for Waldo given')
|
524
|
+
|
525
|
+
return false
|
526
|
+
end
|
527
|
+
|
528
|
+
return true
|
529
|
+
end
|
530
|
+
|
531
|
+
def self.zip(src_path:, zip_path:, cd_path:)
|
532
|
+
unless FastlaneCore::CommandExecutor.which('zip')
|
533
|
+
handle_error("Command not found: 'zip'")
|
534
|
+
|
535
|
+
return false
|
103
536
|
end
|
537
|
+
|
538
|
+
FileUtils.cd(cd_path) do
|
539
|
+
cmd = %(zip -qry "#{zip_path}" "#{src_path}")
|
540
|
+
|
541
|
+
result = Actions.sh(cmd, log: false)
|
542
|
+
|
543
|
+
puts "#{cmd} => #{result}" if FastlaneCore::Globals.verbose?
|
544
|
+
|
545
|
+
unless result.empty?
|
546
|
+
handle_error("Unable to zip folder at path '#{src_path.to_s}' into '#{zip_path.to_s}'")
|
547
|
+
|
548
|
+
return false
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
552
|
+
return true
|
104
553
|
end
|
105
554
|
end
|
106
555
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-waldo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- J. G. Pusey
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -97,8 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
version: '0'
|
99
99
|
requirements: []
|
100
|
-
|
101
|
-
rubygems_version: 2.5.2.3
|
100
|
+
rubygems_version: 3.1.2
|
102
101
|
signing_key:
|
103
102
|
specification_version: 4
|
104
103
|
summary: Upload build to Waldo
|