gitlab_quality-test_tooling 1.5.2 → 1.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/gitlab_quality/test_tooling/report/relate_failure_issue.rb +3 -1
- data/lib/gitlab_quality/test_tooling/report/report_as_issue.rb +1 -1
- data/lib/gitlab_quality/test_tooling/report/slow_test_issue.rb +52 -0
- data/lib/gitlab_quality/test_tooling/report/update_screenshot_path.rb +5 -5
- data/lib/gitlab_quality/test_tooling/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: acc009f4f6d5f4be05fa85cd3fffc68778d415d970ca96f22ace03c8a86f9488
|
4
|
+
data.tar.gz: 5c31655a8245c632e595431fb99ec14852bfd4f9b9778d09e8b8d0ae3393dbc1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 754b2ed722bc050515ceb9f4691bc49da1e63c27c1ff44b3cd97bc597d6691f947a2390b63b41e980b4229332817671bc9cad351fee4455d424ce66f1d54cf03
|
7
|
+
data.tar.gz: ff2b356903435078c53b6234e69d57e272c9f367cd01518158fda38a94372ceeb1fe1e2f2cebec16e2aaa0dd4db9c98592c36631c858119d3340cf4bcd961bda
|
data/Gemfile.lock
CHANGED
@@ -86,7 +86,9 @@ module GitlabQuality
|
|
86
86
|
begin
|
87
87
|
issue = find_issue_and_update_reports(test)
|
88
88
|
|
89
|
-
create_issue(test) unless issue || test.quarantine?
|
89
|
+
issue = create_issue(test) unless issue || test.quarantine?
|
90
|
+
|
91
|
+
issue
|
90
92
|
rescue MultipleIssuesFound => e
|
91
93
|
warn(e.message)
|
92
94
|
end
|
@@ -160,7 +160,7 @@ module GitlabQuality
|
|
160
160
|
when 'customers-gitlab-com'
|
161
161
|
'found:customers.stg.gitlab.com'
|
162
162
|
else
|
163
|
-
|
163
|
+
puts " => [DEBUG] No `found:*` label for the `#{pipeline}` pipeline!"
|
164
164
|
end
|
165
165
|
end
|
166
166
|
|
@@ -16,6 +16,9 @@ module GitlabQuality
|
|
16
16
|
NEW_ISSUE_LABELS = Set.new(['test', 'type::maintenance', 'maintenance::performance', 'priority::3', 'severity::3', 'rspec profiling', 'rspec:slow test']).freeze
|
17
17
|
SEARCH_LABELS = %w[test maintenance::performance].freeze
|
18
18
|
|
19
|
+
JOB_URL_REGEX = %r{(?<job_url>https://(?<host>[\w.]+)/(?<project_path>[\w\-./]+)/-/jobs/\d+)}
|
20
|
+
REPORT_ITEM_REGEX = /^1\. \d{4}-\d{2}-\d{2}: #{JOB_URL_REGEX} \((?<pipeline_url>.+)\)$/
|
21
|
+
|
19
22
|
MultipleIssuesFound = Class.new(StandardError)
|
20
23
|
|
21
24
|
private
|
@@ -45,9 +48,23 @@ module GitlabQuality
|
|
45
48
|
to improve them. More context available about this issue in the [top slow tests guide](https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#top-slow-tests).
|
46
49
|
|
47
50
|
Add `allowed_to_be_slow: true` to the RSpec test if this is a legit slow test and close the issue.
|
51
|
+
|
52
|
+
#{reports_section(test)}
|
48
53
|
DESCRIPTION
|
49
54
|
end
|
50
55
|
|
56
|
+
def reports_section(test)
|
57
|
+
<<~REPORTS
|
58
|
+
### Reports (1)
|
59
|
+
|
60
|
+
#{report_list_item(test)}
|
61
|
+
REPORTS
|
62
|
+
end
|
63
|
+
|
64
|
+
def report_list_item(test)
|
65
|
+
"1. #{Time.new.utc.strftime('%F')}: #{test.ci_job_url} (#{ENV.fetch('CI_PIPELINE_URL', 'pipeline url is missing')})"
|
66
|
+
end
|
67
|
+
|
51
68
|
def create_slow_issue(test)
|
52
69
|
puts " => Finding existing issues for slow test '#{test.name}' (run time: #{test.run_time} seconds)..."
|
53
70
|
|
@@ -58,6 +75,8 @@ module GitlabQuality
|
|
58
75
|
else
|
59
76
|
issues.each do |issue|
|
60
77
|
puts " => Existing issue link #{issue['web_url']}"
|
78
|
+
|
79
|
+
update_reports(issue, test)
|
61
80
|
end
|
62
81
|
end
|
63
82
|
|
@@ -65,6 +84,39 @@ module GitlabQuality
|
|
65
84
|
rescue MultipleIssuesFound => e
|
66
85
|
warn(e.message)
|
67
86
|
end
|
87
|
+
|
88
|
+
def update_reports(issue, test)
|
89
|
+
# We reopen closed issues to not lose any history
|
90
|
+
state_event = issue.state == 'closed' ? 'reopen' : nil
|
91
|
+
|
92
|
+
issue_attrs = {
|
93
|
+
description: up_to_date_issue_description(issue.description, test)
|
94
|
+
}
|
95
|
+
|
96
|
+
issue_attrs[:state_event] = state_event if state_event
|
97
|
+
|
98
|
+
gitlab.edit_issue(iid: issue.iid, options: issue_attrs)
|
99
|
+
puts " => Added a report in '#{issue.title}': #{issue.web_url}!"
|
100
|
+
end
|
101
|
+
|
102
|
+
def up_to_date_issue_description(issue_description, test)
|
103
|
+
new_issue_description =
|
104
|
+
if issue_description.include?('### Reports')
|
105
|
+
# We count the number of existing reports.
|
106
|
+
reports_count = issue_description
|
107
|
+
.scan(REPORT_ITEM_REGEX)
|
108
|
+
.size.to_i + 1
|
109
|
+
issue_description.sub(/^### Reports.*$/, "### Reports (#{reports_count})")
|
110
|
+
else # For issue with the legacy format, we add the Reports section
|
111
|
+
reports_count = issue_description
|
112
|
+
.scan(JOB_URL_REGEX)
|
113
|
+
.size.to_i + 1
|
114
|
+
|
115
|
+
"#{issue_description}\n\n### Reports (#{reports_count})"
|
116
|
+
end
|
117
|
+
|
118
|
+
"#{new_issue_description}\n#{report_list_item(test)}"
|
119
|
+
end
|
68
120
|
end
|
69
121
|
end
|
70
122
|
end
|
@@ -16,8 +16,8 @@ module GitlabQuality
|
|
16
16
|
|
17
17
|
def invoke!
|
18
18
|
Dir.glob(input_files).each do |input_file|
|
19
|
-
|
20
|
-
|
19
|
+
rewrite_screenshot_paths_in_junit_file(input_file)
|
20
|
+
rewrite_screenshot_paths_in_json_file(input_file.gsub('.xml', '.json'))
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -25,7 +25,7 @@ module GitlabQuality
|
|
25
25
|
|
26
26
|
attr_reader :input_files
|
27
27
|
|
28
|
-
def
|
28
|
+
def rewrite_screenshot_paths_in_junit_file(junit_file)
|
29
29
|
File.write(
|
30
30
|
junit_file,
|
31
31
|
rewrite_each_junit_screenshot_path(junit_file).to_s
|
@@ -34,7 +34,7 @@ module GitlabQuality
|
|
34
34
|
puts "Saved #{junit_file}"
|
35
35
|
end
|
36
36
|
|
37
|
-
def
|
37
|
+
def rewrite_screenshot_paths_in_json_file(json_file)
|
38
38
|
File.write(
|
39
39
|
json_file,
|
40
40
|
JSON.pretty_generate(
|
@@ -58,7 +58,7 @@ module GitlabQuality
|
|
58
58
|
examples = report['examples']
|
59
59
|
|
60
60
|
examples.each do |example|
|
61
|
-
next unless example['screenshot'].present?
|
61
|
+
next unless example['screenshot'].present? && example['screenshot']['image'].present?
|
62
62
|
|
63
63
|
example['screenshot']['image'] =
|
64
64
|
remove_container_absolute_path_prefix(example.dig('screenshot', 'image'), test_artifacts_directory(json_file))
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitlab_quality-test_tooling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitLab Quality
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: climate_control
|