gitlab-qa 7.7.1 → 7.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: b1ca7555b9f98741e143d9fc7e4a0b2cf222dc6f09358f39d23a793ff0e68afa
4
- data.tar.gz: 1a114120fb17750c0e3a1ecdb64e0e04a1aba706df0677ae245887e2a67558cb
3
+ metadata.gz: 3d5db8c8b0acf394172a0def237d3049c42c04a811204589d6052fb3fda32eb2
4
+ data.tar.gz: ae97cccc20dce22ce593a1d5a9690d6375b68fcd8ca1d2c4f854803c92dc17d2
5
5
  SHA512:
6
- metadata.gz: '04937666da2a6ebbdc99a5f4f121eff130dbf1540447a51691736243c93e1eb3ce5bbd63f17ede7d293fe77789f6f72bf5c9ab2ca556217d4c34821f40ba4ac0'
7
- data.tar.gz: 6dac435397a5de6d3aba5596dc7b3faa0eba15076f957d6d268d5be88547e670ee97db24f00b58d33fc48547d9eda4c0eb0769fada06f2837cebdd947573c00c
6
+ metadata.gz: 9f13f3e88a045994996a2664e0efedc7dadac3ac53e7cd52b0338cf95b33224bd28d92dbe1909dd0ba66f60b4de1b41dd407c1fd1604b72b295c9368a8526710
7
+ data.tar.gz: aed74598a8cb77c86822ceb2dc457641e4092aa764dba0bbcb3cd281d4a85abe329a8ecda6670e325655afd0470730b9e7699f5be5b0517dec66866f7adcca04
@@ -196,7 +196,7 @@ module Gitlab
196
196
  if testcase && !passed
197
197
  # Workaround for reducing system notes on testcase issues
198
198
  # The first regex extracts the link to the issues list page from a link to a single issue show page by removing the issue id.
199
- "[#{text}](#{testcase.match(%r{[\s\S]+\/[^\/\d]+})}?state=opened&search=#{encoded_text}) (testcase_id=#{testcase.match(/\d+/)})"
199
+ "[#{text}](#{testcase.match(%r{[\s\S]+\/[^\/\d]+})}?state=opened&search=#{encoded_text})"
200
200
  else
201
201
  text
202
202
  end
@@ -49,7 +49,7 @@ module Gitlab
49
49
  select ||= :itself
50
50
 
51
51
  handle_gitlab_client_exceptions do
52
- return [Gitlab.issue(project, iid)] if iid
52
+ return [Gitlab.issue(project, iid)].select(&select) if iid
53
53
 
54
54
  Gitlab.issues(project, options)
55
55
  .auto_paginate
@@ -63,8 +63,8 @@ module Gitlab
63
63
  end
64
64
  end
65
65
 
66
- def create_issue(title:, description:, labels:)
67
- attrs = { description: description, labels: labels }
66
+ def create_issue(title:, description:, labels:, issue_type: 'issue')
67
+ attrs = { issue_type: issue_type, description: description, labels: labels }
68
68
 
69
69
  handle_gitlab_client_exceptions do
70
70
  Gitlab.create_issue(project, title, attrs)
@@ -4,10 +4,10 @@ module Gitlab
4
4
  module QA
5
5
  module Report
6
6
  class GitlabIssueDryClient < GitlabIssueClient
7
- def create_issue(title:, description:, labels:)
7
+ def create_issue(title:, description:, labels:, issue_type: 'issue')
8
8
  attrs = { description: description, labels: labels }
9
9
 
10
- puts "The following issue would have been created:"
10
+ puts "The following #{issue_type} would have been created:"
11
11
  puts "project: #{project}, title: #{title}, attrs: #{attrs}"
12
12
  end
13
13
 
@@ -150,10 +150,10 @@ module Gitlab
150
150
  end
151
151
 
152
152
  def new_issue_labels(test)
153
- NEW_ISSUE_LABELS + up_to_date_labels(test: test)
153
+ up_to_date_labels(test: test, new_labels: NEW_ISSUE_LABELS)
154
154
  end
155
155
 
156
- def up_to_date_labels(test:, issue: nil)
156
+ def up_to_date_labels(test:, issue: nil, new_labels: Set.new)
157
157
  super << pipeline_name_label
158
158
  end
159
159
 
@@ -88,17 +88,18 @@ module Gitlab
88
88
  issue&.labels&.to_set || Set.new
89
89
  end
90
90
 
91
- def update_labels(issue, test)
92
- new_labels = up_to_date_labels(test: test, issue: issue)
91
+ def update_labels(issue, test, new_labels = Set.new)
92
+ labels = up_to_date_labels(test: test, issue: issue, new_labels: new_labels)
93
93
 
94
- return if issue_labels(issue) == new_labels
94
+ return if issue_labels(issue) == labels
95
95
 
96
- gitlab.edit_issue(iid: issue.iid, options: { labels: new_labels.to_a })
96
+ gitlab.edit_issue(iid: issue.iid, options: { labels: labels.to_a })
97
97
  end
98
98
 
99
- def up_to_date_labels(test:, issue: nil)
99
+ def up_to_date_labels(test:, issue: nil, new_labels: Set.new)
100
100
  labels = issue_labels(issue)
101
- labels << "Enterprise Edition" if ee_test?(test)
101
+ labels |= new_labels
102
+ ee_test?(test) ? labels << "Enterprise Edition" : labels.delete("Enterprise Edition")
102
103
  quarantine_job? ? labels << "quarantine" : labels.delete("quarantine")
103
104
 
104
105
  labels
@@ -10,6 +10,8 @@ module Gitlab
10
10
  class ResultsInIssues < ReportAsIssue
11
11
  private
12
12
 
13
+ RESULTS_SECTION_TEMPLATE = "\n\n### DO NOT EDIT BELOW THIS LINE\n\nActive and historical test results:"
14
+
13
15
  def run!
14
16
  puts "Reporting test results in `#{files.join(',')}` as issues in project `#{project}` via the API at `#{Runtime::Env.gitlab_api_base}`."
15
17
 
@@ -17,7 +19,7 @@ module Gitlab
17
19
  puts "Reporting tests in #{test_results.path}"
18
20
 
19
21
  test_results.each do |test|
20
- report_test(test)
22
+ report_test(test) unless test.skipped
21
23
  end
22
24
 
23
25
  test_results.write
@@ -27,56 +29,138 @@ module Gitlab
27
29
  def report_test(test)
28
30
  puts "Reporting test: #{test.file} | #{test.name}"
29
31
 
30
- issue = find_issue(test)
32
+ testcase = find_testcase(test) || create_testcase(test)
33
+ test.testcase ||= testcase.web_url.sub('/issues/', '/quality/test_cases/')
34
+
35
+ issue = find_issue_by_iid(testcase, test)
36
+
37
+ unless issue
38
+ puts "No valid issue link found"
39
+ issue = find_or_create_issue(test)
40
+
41
+ add_issue_to_testcase(testcase, issue)
42
+ puts "Added issue #{issue.web_url} to testcase #{testcase.web_url}"
43
+ end
44
+
45
+ update_labels(testcase, test)
46
+ update_issue(issue, test)
47
+ end
48
+
49
+ def find_testcase(test)
50
+ iid = iid_from_testcase_url(test.testcase)
51
+
52
+ testcases = search_issues(test: test, issue_type: 'test_case', iid: iid)
53
+
54
+ if iid && testcases.blank?
55
+ warn(%(Test case url "#{test.testcase}" not valid))
56
+ testcases = search_issues(test: test, issue_type: 'test_case')
57
+ end
58
+
59
+ warn(%(Too many test cases found with the file path "#{test.file}" and name "#{test.name}")) if testcases&.many?
60
+
61
+ testcases.first
62
+ end
63
+
64
+ def create_testcase(test)
65
+ title = title_from_test(test)
66
+ puts "Creating test case '#{title}' ..."
67
+
68
+ gitlab.create_issue(
69
+ title: title,
70
+ description: new_testcase_description(test),
71
+ labels: new_issue_labels(test),
72
+ issue_type: 'test_case'
73
+ )
74
+ end
75
+
76
+ def iid_from_testcase_url(url)
77
+ return warn(%(\nPlease update #{url} to test case url")) if url&.include?('/-/issues/')
78
+
79
+ url && url.split('/').last.to_i
80
+ end
81
+
82
+ def new_testcase_description(test)
83
+ "#{new_issue_description(test)}#{RESULTS_SECTION_TEMPLATE}"
84
+ end
85
+
86
+ def issue_iid_from_testcase(testcase)
87
+ results = testcase.description.partition(RESULTS_SECTION_TEMPLATE).last if testcase.description.include?(RESULTS_SECTION_TEMPLATE)
88
+
89
+ return puts "No issue link found" unless results
90
+
91
+ issue_iid = results.split('/').last
92
+
93
+ issue_iid&.to_i
94
+ end
95
+
96
+ def find_or_create_issue(test)
97
+ issue = find_issue(test, 'issue')
31
98
 
32
99
  if issue
33
100
  puts "Found existing issue: #{issue.web_url}"
34
101
  else
35
- # Don't create new issues for skipped tests
36
- return if test.skipped
37
-
38
102
  issue = create_issue(test)
39
103
  puts "Created new issue: #{issue.web_url}"
40
104
  end
41
105
 
42
- test.testcase ||= issue.web_url
106
+ issue
107
+ end
43
108
 
44
- labels_updated = update_labels(issue, test)
45
- note_posted = note_status(issue, test)
109
+ def find_issue_by_iid(testcase, test)
110
+ iid = issue_iid_from_testcase(testcase)
46
111
 
47
- if labels_updated || note_posted
48
- puts "Issue updated."
49
- else
50
- puts "Test passed, no update needed."
51
- end
112
+ return unless iid
113
+
114
+ issues = search_issues(test: test, issue_type: 'issue', iid: iid)
115
+
116
+ warn(%(Issue iid "#{iid}" not valid)) if issues.empty?
117
+
118
+ issues.first
52
119
  end
53
120
 
54
- def find_issue(test)
55
- title = title_from_test(test)
56
- issues =
57
- gitlab.find_issues(
58
- iid: iid_from_testcase_url(test.testcase),
59
- options: { search: search_term(test) }) do |issue|
60
- issue.state == 'opened' && issue.title.strip == title
61
- end
121
+ def find_issue(test, issue_type)
122
+ issues = search_issues(test: test, issue_type: 'issue')
62
123
 
63
124
  warn(%(Too many issues found with the file path "#{test.file}" and name "#{test.name}")) if issues.many?
64
125
 
65
126
  issues.first
66
127
  end
67
128
 
129
+ def add_issue_to_testcase(testcase, issue)
130
+ results_section = testcase.description.include?(RESULTS_SECTION_TEMPLATE) ? '' : RESULTS_SECTION_TEMPLATE
131
+
132
+ gitlab.edit_issue(iid: testcase.iid, options: { description: (testcase.description + results_section + "\n\n#{issue.web_url}") })
133
+ end
134
+
135
+ def update_issue(issue, test)
136
+ new_labels = issue_labels(issue)
137
+ new_labels |= ['Testcase Linked']
138
+
139
+ labels_updated = update_labels(issue, test, new_labels)
140
+ note_posted = note_status(issue, test)
141
+
142
+ if labels_updated || note_posted
143
+ puts "Issue updated."
144
+ else
145
+ puts "Test passed, no update needed."
146
+ end
147
+ end
148
+
68
149
  def new_issue_labels(test)
69
- %w[status::automated]
150
+ ['Quality', "devops::#{test.stage}", 'status::automated']
70
151
  end
71
152
 
72
- def up_to_date_labels(test:, issue: nil)
153
+ def up_to_date_labels(test:, issue: nil, new_labels: Set.new)
73
154
  labels = super
155
+ labels |= new_issue_labels(test).to_set
74
156
  labels.delete_if { |label| label.start_with?("#{pipeline}::") }
75
157
  labels << (test.failures.empty? ? "#{pipeline}::passed" : "#{pipeline}::failed")
76
158
  end
77
159
 
78
- def iid_from_testcase_url(url)
79
- url && url.split('/').last.to_i
160
+ def search_issues(test:, issue_type:, iid: nil)
161
+ gitlab.find_issues(iid: iid, options: { search: search_term(test) }) do |issue|
162
+ issue.state == 'opened' && issue.issue_type == issue_type && issue.title.strip == title_from_test(test)
163
+ end
80
164
  end
81
165
 
82
166
  def search_term(test)
@@ -107,9 +107,8 @@ module Gitlab
107
107
  praefect['database_password'] = 'SQL_PASSWORD';
108
108
  praefect['database_dbname'] = 'praefect_production';
109
109
  praefect['database_sslmode'] = 'disable';
110
- praefect['database_host_no_proxy'] = '#{@database}.#{@network}';
111
- praefect['database_port_no_proxy'] = 5432;
112
- praefect['failover_election_strategy'] = 'per_repository';
110
+ praefect['database_direct_host'] = '#{@database}.#{@network}';
111
+ praefect['database_direct_port'] = 5432;
113
112
  praefect['virtual_storages'] = {
114
113
  'default' => {
115
114
  'nodes' => {
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module QA
3
- VERSION = '7.7.1'.freeze
3
+ VERSION = '7.8.1'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-qa
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.7.1
4
+ version: 7.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab Quality
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-08-23 00:00:00.000000000 Z
11
+ date: 2021-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control