fastlane-plugin-try_scan 0.1.1 → 0.2.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
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12d650730323d7c47cfcf510d28238dd5e4864bb4cf169e65139d14c909c33a0
|
4
|
+
data.tar.gz: c5fceb554ef538e90917244e5ef303b79102289908aedd005e53a1b0a4d056d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0eaea36a94853fb1c5ba8eec440ba5329744c671c1970f6edc36df3db69cadb647e64023b3abfbcdf327b30813d69bef6b70566b2951323f6f0afd98574d9888
|
7
|
+
data.tar.gz: 3bdfc6aede5d51e8ba1ae4089fc17be7e2cd6aa7ada7e0a09e696dfbf9412e001559d9341a7ee5ad659ae737460c00d7511e5064457416b06035fe3b356708e8
|
@@ -2,6 +2,7 @@ module Fastlane
|
|
2
2
|
module Actions
|
3
3
|
|
4
4
|
require 'json'
|
5
|
+
require 'nokogiri'
|
5
6
|
require 'fastlane/actions/scan'
|
6
7
|
require_relative '../helper/scan_helper'
|
7
8
|
require_relative '../helper/try_scan_runner'
|
@@ -90,7 +91,7 @@ module Fastlane
|
|
90
91
|
description: "The number of times to retry running tests via scan",
|
91
92
|
type: Integer,
|
92
93
|
is_string: false,
|
93
|
-
default_value:
|
94
|
+
default_value: 1
|
94
95
|
)
|
95
96
|
]
|
96
97
|
end
|
@@ -88,18 +88,6 @@ module TryScanManager
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
91
|
-
|
92
|
-
def self.update_xctestrun_after_build(scan_options)
|
93
|
-
xctestrun_files = Dir.glob("#{Scan.config[:derived_data_path]}/Build/Products/*.xctestrun")
|
94
|
-
FastlaneCore::UI.verbose("After building, found xctestrun files #{xctestrun_files} (choosing 1st)")
|
95
|
-
scan_options[:xctestrun] = xctestrun_files.first
|
96
|
-
end
|
97
|
-
|
98
|
-
def self.remove_preexisting_xctestrun_files
|
99
|
-
xctestrun_files = Dir.glob("#{Scan.config[:derived_data_path]}/Build/Products/*.xctestrun")
|
100
|
-
FastlaneCore::UI.verbose("Before building, removing pre-existing xctestrun files: #{xctestrun_files}")
|
101
|
-
FileUtils.rm_rf(xctestrun_files)
|
102
|
-
end
|
103
91
|
end
|
104
92
|
end
|
105
93
|
end
|
@@ -10,18 +10,26 @@ module TryScanManager
|
|
10
10
|
def run
|
11
11
|
update_scan_config
|
12
12
|
print_summary
|
13
|
-
attempt = 1
|
13
|
+
@attempt = 1
|
14
14
|
begin
|
15
|
-
warn_of_performing_attempts
|
15
|
+
warn_of_performing_attempts
|
16
16
|
clear_preexisting_data
|
17
17
|
Scan::Runner.new.run
|
18
|
+
print_parallel_scan_result
|
18
19
|
return true
|
19
|
-
rescue FastlaneCore::Interface::
|
20
|
-
|
21
|
-
|
20
|
+
rescue FastlaneCore::Interface::FastlaneTestFailure => _
|
21
|
+
failed_tests = extract_failed_tests
|
22
|
+
print_parallel_scan_result(failed_tests_count: failed_tests.size)
|
23
|
+
update_scan_junit_report
|
24
|
+
return false if @attempt >= @options[:try_count]
|
25
|
+
|
26
|
+
@attempt += 1
|
27
|
+
update_scan_options(failed_tests)
|
28
|
+
retry
|
29
|
+
rescue FastlaneCore::Interface::FastlaneBuildFailure => _
|
30
|
+
return false if @attempt >= @options[:try_count]
|
22
31
|
|
23
|
-
attempt += 1
|
24
|
-
update_scan_options
|
32
|
+
@attempt += 1
|
25
33
|
retry
|
26
34
|
end
|
27
35
|
end
|
@@ -32,7 +40,7 @@ module TryScanManager
|
|
32
40
|
output_types << 'junit'
|
33
41
|
Scan.config[:output_types] = output_types.join(',')
|
34
42
|
end
|
35
|
-
@options[:try_count] =
|
43
|
+
@options[:try_count] = 1 if @options[:try_count] < 1
|
36
44
|
end
|
37
45
|
|
38
46
|
def print_summary
|
@@ -51,8 +59,8 @@ module TryScanManager
|
|
51
59
|
)
|
52
60
|
end
|
53
61
|
|
54
|
-
def warn_of_performing_attempts
|
55
|
-
FastlaneCore::UI.important("TryScan
|
62
|
+
def warn_of_performing_attempts
|
63
|
+
FastlaneCore::UI.important("TryScan: Getting started #{ordinalized_attempt} shot\n")
|
56
64
|
end
|
57
65
|
|
58
66
|
def clear_preexisting_data
|
@@ -62,15 +70,34 @@ module TryScanManager
|
|
62
70
|
FastlaneScanHelper.remove_report_files
|
63
71
|
end
|
64
72
|
|
65
|
-
def
|
66
|
-
|
73
|
+
def print_parallel_scan_result(failed_tests_count: 0)
|
74
|
+
return unless parallel_running?
|
75
|
+
|
76
|
+
FastlaneCore::UI.important("TryScan: result after #{ordinalized_attempt} shot 👇")
|
77
|
+
FastlaneCore::PrintTable.print_values(
|
78
|
+
config: {"Number of tests" => tests_count_from_xcresult_report, "Number of failures" => failed_tests_count},
|
79
|
+
title: "Test Results"
|
80
|
+
)
|
67
81
|
end
|
68
82
|
|
69
|
-
def
|
83
|
+
def ordinalized_attempt
|
84
|
+
case @attempt
|
85
|
+
when 1
|
86
|
+
"#{@attempt}st"
|
87
|
+
when 2
|
88
|
+
"#{@attempt}nd"
|
89
|
+
when 3
|
90
|
+
"#{@attempt}rd"
|
91
|
+
else
|
92
|
+
"#{@attempt}th"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def update_scan_options(failed_tests)
|
70
97
|
scan_options = @options.select { |key, _|
|
71
98
|
FastlaneScanHelper.valid_scan_keys.include?(key)
|
72
99
|
}.merge(plugin_scan_options)
|
73
|
-
scan_options[:only_testing] =
|
100
|
+
scan_options[:only_testing] = failed_tests
|
74
101
|
scan_options[:skip_build] = true
|
75
102
|
scan_options[:test_without_building] = true
|
76
103
|
scan_options[:build_for_testing] = false
|
@@ -99,9 +126,9 @@ module TryScanManager
|
|
99
126
|
|
100
127
|
def extract_failed_tests
|
101
128
|
if parallel_running?
|
102
|
-
|
129
|
+
failed_tests_from_xcresult_report
|
103
130
|
else
|
104
|
-
|
131
|
+
failed_tests_from_junit_report
|
105
132
|
end
|
106
133
|
end
|
107
134
|
|
@@ -111,7 +138,7 @@ module TryScanManager
|
|
111
138
|
(@options[:xcargs] && (@options[:xcargs] =~ /-parallel-testing-enabled(=|\s+)YES/ || @options[:xcargs].split('-destination').size > 2))
|
112
139
|
end
|
113
140
|
|
114
|
-
def
|
141
|
+
def failed_tests_from_junit_report
|
115
142
|
report = junit_report
|
116
143
|
suite_name = report.xpath('testsuites/@name').to_s.split('.')[0]
|
117
144
|
test_cases = report.xpath('//testcase')
|
@@ -123,7 +150,6 @@ module TryScanManager
|
|
123
150
|
test_name = test_case.xpath('@name')
|
124
151
|
only_testing << "#{suite_name}/#{test_class}/#{test_name}"
|
125
152
|
end
|
126
|
-
FastlaneCore::UI.verbose("Extracted tests to retry: #{only_testing}")
|
127
153
|
only_testing
|
128
154
|
end
|
129
155
|
|
@@ -139,7 +165,9 @@ module TryScanManager
|
|
139
165
|
@cached_junit_report
|
140
166
|
end
|
141
167
|
|
142
|
-
def
|
168
|
+
def update_scan_junit_report
|
169
|
+
return if @attempt == 1 || parallel_running?
|
170
|
+
|
143
171
|
old_junit_report = junit_report(cached: true)
|
144
172
|
new_junit_report = junit_report(cached: false)
|
145
173
|
|
@@ -169,7 +197,7 @@ module TryScanManager
|
|
169
197
|
JSON.parse(`xcrun xcresulttool get --format json --path #{xcresult_report_files.first}`)
|
170
198
|
end
|
171
199
|
|
172
|
-
def
|
200
|
+
def failed_tests_from_xcresult_report
|
173
201
|
only_testing = []
|
174
202
|
parse_xcresult_report['issues']['testFailureSummaries']['_values'].each do |failed_test|
|
175
203
|
suite_name = failed_test['producingTarget']['_value']
|
@@ -177,8 +205,11 @@ module TryScanManager
|
|
177
205
|
test_name = failed_test['testCaseName']['_value'].split('.')[1].split('(').first
|
178
206
|
only_testing << "#{suite_name}/#{test_class}/#{test_name}"
|
179
207
|
end
|
180
|
-
FastlaneCore::UI.verbose("Extracted tests to retry: #{only_testing}")
|
181
208
|
only_testing
|
182
209
|
end
|
210
|
+
|
211
|
+
def tests_count_from_xcresult_report
|
212
|
+
parse_xcresult_report['metrics']['testsCount']['_value']
|
213
|
+
end
|
183
214
|
end
|
184
215
|
end
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-try_scan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexey Alter-Pesotskiy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nokogiri
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: pry
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,20 +150,6 @@ dependencies:
|
|
122
150
|
- - ">="
|
123
151
|
- !ruby/object:Gem::Version
|
124
152
|
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: nokogiri
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: fastlane
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|