gitlab_quality-test_tooling 1.20.1 → 1.21.1
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/failed_jobs_table.rb +9 -7
- data/lib/gitlab_quality/test_tooling/report/results_in_test_cases.rb +1 -2
- data/lib/gitlab_quality/test_tooling/test_meta/processor/add_to_blocking_processor.rb +52 -44
- data/lib/gitlab_quality/test_tooling/test_meta/processor/add_to_quarantine_processor.rb +104 -54
- data/lib/gitlab_quality/test_tooling/test_meta/processor/meta_processor.rb +6 -4
- data/lib/gitlab_quality/test_tooling/test_meta/test_meta_updater.rb +9 -6
- 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: 3bd25aa86cb58d8b69f852509893b2d7f28a183474d6b4ac96732d8bd3efca23
|
4
|
+
data.tar.gz: f17357f3f9e1c97089ac675c918682341978a60ac40cace79557722c2ce4cdff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2d8710d330b9dd79a54ff78de39e15e76b014ce70de89791991723a6a272222edda6a751bb0449ba1a820163713046e617c9d45d4fa6a895f0eb4f8d86889bc
|
7
|
+
data.tar.gz: 2eda2f409021c5d8f8c710a66294266fcda7a8ef46d3580ab680175718d8468c62b4fea6c375cfcb51cd1fe899f9c83918962f767b9c534916cfcb68fab1c676
|
data/Gemfile.lock
CHANGED
@@ -21,13 +21,15 @@ module GitlabQuality
|
|
21
21
|
# @param [Array<Gitlab::ObjectifiedHash>] jobs
|
22
22
|
# @return [Array]
|
23
23
|
def collect_results(jobs)
|
24
|
-
jobs.sort_by(&:stage)
|
25
|
-
{
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
24
|
+
jobs.sort_by(&:stage)
|
25
|
+
.reject { |job| job.name.downcase.include?("quarantine") }
|
26
|
+
.map do |job|
|
27
|
+
{
|
28
|
+
"Job" => job.name,
|
29
|
+
"Stage" => job.stage,
|
30
|
+
"Failure Reason" => job.failure_reason
|
31
|
+
}
|
32
|
+
end
|
31
33
|
end
|
32
34
|
end
|
33
35
|
end
|
@@ -73,8 +73,7 @@ module GitlabQuality
|
|
73
73
|
<<~MKDOWN.strip
|
74
74
|
### Executions
|
75
75
|
|
76
|
-
All
|
77
|
-
<img src="https://dashboards.quality.gitlab.net/render/d-solo/cW0UMgv7k/spec-health?orgId=1&var-run_type=All&var-name=#{formatted_title}&panelId=4&width=1000&height=500" />
|
76
|
+
[Spec metrics on all environments](https://dashboards.quality.gitlab.net/d/cW0UMgv7k/single-spec-metrics?orgId=1&var-run_type=All&var-name=#{formatted_title})
|
78
77
|
MKDOWN
|
79
78
|
end
|
80
79
|
|
@@ -12,69 +12,36 @@ module GitlabQuality
|
|
12
12
|
# Creates the merge requests for promoting E2E tests to :blocking
|
13
13
|
#
|
14
14
|
# @param [TestMetaUpdater] context instance of TestMetaUpdater
|
15
|
-
|
16
|
-
def create_merge_requests(context) # rubocop:disable Metrics/AbcSize
|
15
|
+
def create_merge_requests(context)
|
17
16
|
@context = context
|
18
17
|
|
19
|
-
created_merge_requests = []
|
20
18
|
context.processed_commits.each_value do |record|
|
21
|
-
branch = record
|
22
|
-
first_spec = record[:commits].values.first
|
23
|
-
devops_stage = first_spec["stage"]
|
24
|
-
product_section = first_spec["section"]
|
25
|
-
product_group = first_spec["product_group"]
|
26
|
-
file = first_spec["file"]
|
19
|
+
branch, devops_stage, product_group, file, reviewer_id, assignee_handle = extract_data_from_record(record)
|
27
20
|
|
28
|
-
mr_title = format("%{prefix} %{file}", prefix: '[E2E PROMOTE TO BLOCKING
|
29
|
-
|
30
|
-
reviewer_id, assignee_handle = context.fetch_dri_id(product_group, devops_stage, product_section)
|
31
|
-
|
32
|
-
gitlab_bot_user_id = context.user_id_for_username(Runtime::Env.gitlab_bot_username)
|
21
|
+
mr_title = format("%{prefix} %{file}", prefix: '[E2E] PROMOTE TO BLOCKING:', file: file).truncate(72, omission: '')
|
33
22
|
|
34
23
|
merge_request = context.create_merge_request(mr_title, branch, gitlab_bot_user_id, [reviewer_id]) do
|
35
|
-
|
36
|
-
## What does this MR do?
|
37
|
-
|
38
|
-
Promotes the following e2e tests to the blocking bucket:
|
39
|
-
|
40
|
-
#{mr_spec_details_from_commits(record[:commits])}
|
41
|
-
|
42
|
-
This MR was created based on data from reliable e2e test report: #{context.report_issue}
|
43
|
-
|
44
|
-
/label ~"Quality" ~"QA" ~"type::maintenance"
|
45
|
-
/label ~"devops::#{devops_stage}"
|
46
|
-
#{context.label_from_product_group(product_group)}
|
47
|
-
|
48
|
-
<div align="center">
|
49
|
-
(This MR was automatically generated by [`gitlab_quality-test_tooling`](https://gitlab.com/gitlab-org/ruby/gems/gitlab_quality-test_tooling) at #{Time.now.utc})
|
50
|
-
</div>
|
51
|
-
MARKDOWN
|
24
|
+
merge_request_description(record, devops_stage, product_group)
|
52
25
|
end
|
53
26
|
|
54
|
-
context.post_note_on_merge_request(
|
55
|
-
@#{assignee_handle} Please review this MR, approve and assign it to a maintainer.
|
56
|
-
|
57
|
-
If you think this MR should not be merged, please close it and add a note of the reason to the blocking report: #{context.report_issue}
|
58
|
-
MARKDOWN
|
27
|
+
context.post_note_on_merge_request(maintainer_note_on_merge_request(assignee_handle), merge_request.iid)
|
59
28
|
|
60
29
|
if merge_request
|
61
30
|
Runtime::Logger.info(" Created MR for promotion to blocking: #{merge_request.web_url}")
|
62
|
-
|
31
|
+
record[:merge_request] = merge_request
|
63
32
|
end
|
64
33
|
end
|
65
|
-
|
66
|
-
created_merge_requests
|
67
34
|
end
|
68
35
|
|
69
|
-
# Performs post processing.
|
36
|
+
# Performs post processing. Posts a list of MRs in a note on report_issue
|
70
37
|
#
|
71
|
-
# @param [
|
72
|
-
def post_process(
|
73
|
-
web_urls =
|
38
|
+
# @param [TestMetaUpdater] context instance of TestMetaUpdater
|
39
|
+
def post_process(context)
|
40
|
+
web_urls = context.processed_commits.values.map { |value| "- #{value[:merge_request].web_url}\n" }.join
|
74
41
|
|
75
42
|
return if web_urls.empty?
|
76
43
|
|
77
|
-
context.
|
44
|
+
context.post_note_on_issue(<<~ISSUE_NOTE, context.report_issue)
|
78
45
|
The following merge requests have been created to promote stable specs to blocking:
|
79
46
|
|
80
47
|
#{web_urls}
|
@@ -108,6 +75,47 @@ module GitlabQuality
|
|
108
75
|
COMMIT_MESSAGE
|
109
76
|
end
|
110
77
|
|
78
|
+
def maintainer_note_on_merge_request(assignee_handle)
|
79
|
+
<<~MARKDOWN
|
80
|
+
@#{assignee_handle} Please review this MR, approve and assign it to a maintainer.
|
81
|
+
|
82
|
+
If you think this MR should not be merged, please close it and add a note of the reason to the blocking report: #{context.report_issue}
|
83
|
+
MARKDOWN
|
84
|
+
end
|
85
|
+
|
86
|
+
def merge_request_description(record, devops_stage, product_group)
|
87
|
+
<<~MARKDOWN
|
88
|
+
## What does this MR do?
|
89
|
+
|
90
|
+
Promotes the following e2e tests to the blocking bucket:
|
91
|
+
|
92
|
+
#{spec_details_from_commits(record[:commits])}
|
93
|
+
|
94
|
+
This MR was created based on data from reliable e2e test report: #{context.report_issue}
|
95
|
+
|
96
|
+
/label ~"Quality" ~"QA" ~"type::maintenance"
|
97
|
+
/label ~"devops::#{devops_stage}"
|
98
|
+
#{context.label_from_product_group(product_group)}
|
99
|
+
|
100
|
+
<div align="center">
|
101
|
+
(This MR was automatically generated by [`gitlab_quality-test_tooling`](https://gitlab.com/gitlab-org/ruby/gems/gitlab_quality-test_tooling) at #{Time.now.utc})
|
102
|
+
</div>
|
103
|
+
MARKDOWN
|
104
|
+
end
|
105
|
+
|
106
|
+
def extract_data_from_record(record)
|
107
|
+
first_spec = record[:commits].values.first
|
108
|
+
product_group = first_spec["product_group"]
|
109
|
+
devops_stage = first_spec["stage"]
|
110
|
+
reviewer_id, assignee_handle = context.fetch_dri_id(product_group, devops_stage, first_spec["section"])
|
111
|
+
|
112
|
+
[record[:branch], devops_stage, product_group, first_spec["file"], reviewer_id, assignee_handle]
|
113
|
+
end
|
114
|
+
|
115
|
+
def gitlab_bot_user_id
|
116
|
+
context.user_id_for_username(Runtime::Env.gitlab_bot_username)
|
117
|
+
end
|
118
|
+
|
111
119
|
# Add blocking metadata to the file content and replace it
|
112
120
|
#
|
113
121
|
# @return [Array<String, Integer>] first value holds the new content, the second value holds the line number of the test
|
@@ -18,19 +18,13 @@ module GitlabQuality
|
|
18
18
|
# Creates the merge requests to quarantine E2E tests
|
19
19
|
#
|
20
20
|
# @param [TestMetaUpdater] context instance of TestMetaUpdater
|
21
|
-
|
22
|
-
def create_merge_requests(context) # rubocop:disable Metrics/AbcSize
|
21
|
+
def create_merge_requests(context)
|
23
22
|
@context = context
|
24
23
|
|
25
|
-
created_merge_requests = []
|
26
24
|
context.processed_commits.each_value do |record|
|
27
|
-
branch = record
|
28
|
-
first_spec = record[:commits].values.first
|
29
|
-
devops_stage = first_spec["stage"]
|
30
|
-
product_group = first_spec["product_group"]
|
31
|
-
file = first_spec["file"]
|
25
|
+
branch, devops_stage, product_group, file = extract_data_from_record(record)
|
32
26
|
|
33
|
-
mr_title = format("%{prefix} %{file}", prefix: '[QUARANTINE
|
27
|
+
mr_title = format("%{prefix} %{file}", prefix: '[E2E] QUARANTINE:', file: file).truncate(72, omission: '')
|
34
28
|
|
35
29
|
gitlab_bot_user_id = context.user_id_for_username(Runtime::Env.gitlab_bot_username)
|
36
30
|
|
@@ -40,36 +34,27 @@ module GitlabQuality
|
|
40
34
|
|
41
35
|
if merge_request
|
42
36
|
Runtime::Logger.info(" Created MR for quarantine: #{merge_request.web_url}")
|
43
|
-
|
37
|
+
record[:merge_request] = merge_request
|
44
38
|
end
|
45
39
|
end
|
46
|
-
|
47
|
-
created_merge_requests
|
48
40
|
end
|
49
41
|
|
50
|
-
# Performs post processing.
|
42
|
+
# Performs post processing. Posts a list of MRs in a note on report_issue and Slack.
|
43
|
+
# Also posts note on failure issues for un-quarantining of the quarantined
|
51
44
|
#
|
52
|
-
# @param [
|
53
|
-
def post_process(
|
54
|
-
|
55
|
-
|
56
|
-
return if web_urls.empty?
|
57
|
-
|
58
|
-
context.post_note_on_report_issue(<<~ISSUE_NOTE)
|
45
|
+
# @param [TestMetaUpdater] context instance of TestMetaUpdater
|
46
|
+
def post_process(context)
|
47
|
+
@context = context
|
59
48
|
|
60
|
-
|
49
|
+
web_urls = context.processed_commits.values.map { |value| "- #{value[:merge_request].web_url}\n" }.join
|
61
50
|
|
62
|
-
|
63
|
-
ISSUE_NOTE
|
51
|
+
return if web_urls.empty?
|
64
52
|
|
65
|
-
context.
|
66
|
-
*Action Required!* The following merge requests have been created to quarantine the unstable tests identified
|
67
|
-
in the reliable test report: #{context.report_issue}
|
53
|
+
context.post_note_on_issue(mrs_created_note_for_report_issue(web_urls), context.report_issue)
|
68
54
|
|
69
|
-
|
55
|
+
context.post_message_on_slack(mrs_created_message_for_slack(web_urls))
|
70
56
|
|
71
|
-
|
72
|
-
MSG
|
57
|
+
post_unquarantine_note_on_failure_issue
|
73
58
|
end
|
74
59
|
|
75
60
|
private
|
@@ -99,41 +84,68 @@ module GitlabQuality
|
|
99
84
|
context.issue_scoped_label(failure_issue, 'failure')&.split('::')&.last == 'test-environment'
|
100
85
|
end
|
101
86
|
|
87
|
+
def extract_data_from_record(record)
|
88
|
+
first_spec = record[:commits].values.first
|
89
|
+
[record[:branch], first_spec["stage"], first_spec["product_group"], first_spec["file"]]
|
90
|
+
end
|
91
|
+
|
92
|
+
# Posts note on failure issue to un-quarantine the test
|
93
|
+
#
|
94
|
+
def post_unquarantine_note_on_failure_issue
|
95
|
+
context.processed_commits.each_value do |record|
|
96
|
+
merge_request = record[:merge_request]
|
97
|
+
next unless merge_request
|
98
|
+
|
99
|
+
record[:commits].each_value do |spec|
|
100
|
+
devops_stage = spec["stage"]
|
101
|
+
product_group = spec["product_group"]
|
102
|
+
failure_issue = spec["failure_issue"]
|
103
|
+
|
104
|
+
next unless failure_issue
|
105
|
+
|
106
|
+
note = context.post_note_on_issue(unquarantine_note_for_failure(spec, product_group, devops_stage, merge_request),
|
107
|
+
failure_issue)
|
108
|
+
|
109
|
+
Runtime::Logger.info(" Posted note on failure issue for un-quarantine: #{failure_issue}") if note
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
102
114
|
def merge_request_description(record, devops_stage, product_group)
|
103
115
|
<<~MARKDOWN
|
104
|
-
|
116
|
+
## What does this MR do?
|
105
117
|
|
106
|
-
|
118
|
+
Quarantines the following e2e tests:
|
107
119
|
|
108
|
-
|
120
|
+
#{spec_details_from_commits(record[:commits])}
|
109
121
|
|
110
|
-
|
122
|
+
This MR was created based on data from reliable e2e test report: #{context.report_issue}
|
111
123
|
|
112
|
-
|
124
|
+
### Check-list
|
113
125
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
126
|
+
- [ ] General code guidelines check-list
|
127
|
+
- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)
|
128
|
+
- [ ] [Style guides](https://docs.gitlab.com/ee/development/contributing/style_guides.html)
|
129
|
+
- [ ] Quarantine test check-list
|
130
|
+
- [ ] Follow the [Quarantining Tests guide](https://about.gitlab.com/handbook/engineering/infrastructure/test-platform/debugging-qa-test-failures/#quarantining-tests).
|
131
|
+
- [ ] Confirm the test has a [`quarantine:` tag with the specified quarantine type](https://about.gitlab.com/handbook/engineering/infrastructure/test-platform/debugging-qa-test-failures/#quarantined-test-types).
|
132
|
+
- [ ] Note if the test should be [quarantined for a specific environment](https://docs.gitlab.com/ee/development/testing_guide/end_to_end/execution_context_selection.html#quarantine-a-test-for-a-specific-environment).
|
133
|
+
- [ ] (Optionally) In case of an emergency (e.g. blocked deployments), consider adding labels to pick into auto-deploy (~"Pick into auto-deploy" ~"priority::1" ~"severity::1").
|
134
|
+
- [ ] To ensure a faster turnaround, ask in the `#quality_maintainers` Slack channel for someone to review and merge the merge request, rather than assigning it directly.
|
123
135
|
|
124
|
-
|
125
|
-
|
136
|
+
<!-- Base labels. -->
|
137
|
+
/label ~"Quality" ~"QA" ~"type::maintenance" ~"maintenance::pipelines"
|
126
138
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
139
|
+
<!--
|
140
|
+
Choose the stage that appears in the test path, e.g. ~"devops::create" for
|
141
|
+
`qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb`.
|
142
|
+
-->
|
143
|
+
/label ~"devops::#{devops_stage}"
|
144
|
+
#{context.label_from_product_group(product_group)}
|
133
145
|
|
134
|
-
|
135
|
-
|
136
|
-
|
146
|
+
<div align="center">
|
147
|
+
(This MR was automatically generated by [`gitlab_quality-test_tooling`](https://gitlab.com/gitlab-org/ruby/gems/gitlab_quality-test_tooling) at #{Time.now.utc})
|
148
|
+
</div>
|
137
149
|
MARKDOWN
|
138
150
|
end
|
139
151
|
|
@@ -145,6 +157,44 @@ module GitlabQuality
|
|
145
157
|
COMMIT_MESSAGE
|
146
158
|
end
|
147
159
|
|
160
|
+
def mrs_created_note_for_report_issue(web_urls)
|
161
|
+
<<~ISSUE_NOTE
|
162
|
+
|
163
|
+
The following merge requests have been created to quarantine the unstable tests:
|
164
|
+
|
165
|
+
#{web_urls}
|
166
|
+
ISSUE_NOTE
|
167
|
+
end
|
168
|
+
|
169
|
+
def unquarantine_note_for_failure(spec, product_group, devops_stage, merge_request)
|
170
|
+
failure_issue_assignee_handle = get_failure_issue_assignee_handle(spec, product_group, devops_stage)
|
171
|
+
<<~ISSUE_NOTE
|
172
|
+
@#{failure_issue_assignee_handle} This test will be quarantined in #{merge_request.web_url} based on data from reliable e2e test report: #{context.report_issue}
|
173
|
+
|
174
|
+
Please take this issue forward to un-quarantine the test by either addressing the issue yourself or delegating it to the relevant product group.
|
175
|
+
|
176
|
+
If this issue is delegated, please make sure to update the assignee. Thanks.
|
177
|
+
ISSUE_NOTE
|
178
|
+
end
|
179
|
+
|
180
|
+
def mrs_created_message_for_slack(web_urls)
|
181
|
+
<<~MSG
|
182
|
+
*Action Required!* The following merge requests have been created to quarantine the unstable tests identified
|
183
|
+
in the reliable test report: #{context.report_issue}
|
184
|
+
|
185
|
+
#{web_urls}
|
186
|
+
|
187
|
+
Maintainers are requested to review and merge the above MRs. Thank you.
|
188
|
+
MSG
|
189
|
+
end
|
190
|
+
|
191
|
+
def get_failure_issue_assignee_handle(spec, product_group, devops_stage)
|
192
|
+
return spec["failure_issue_assignee_handle"] if spec["failure_issue_assignee_handle"]
|
193
|
+
|
194
|
+
_, assignee_handle = context.fetch_dri_id(product_group, devops_stage, nil)
|
195
|
+
assignee_handle
|
196
|
+
end
|
197
|
+
|
148
198
|
# Add quarantine metadata to the file content and replace it
|
149
199
|
#
|
150
200
|
# @return [Array<String, Integer>] first value holds the new content, the second value holds the line number of the test
|
@@ -41,12 +41,12 @@ module GitlabQuality
|
|
41
41
|
#
|
42
42
|
# @param [Hash<String,Hash>] commits The commits hash to use for spec details
|
43
43
|
# @return String
|
44
|
-
def
|
44
|
+
def spec_details_from_commits(commits)
|
45
45
|
commits.each_with_index.map do |(changed_line_number, spec), index|
|
46
46
|
<<~MARKDOWN
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
#{index + 1}. [`#{spec['name']}`](https://gitlab.com/#{context.project}/-/blob/#{context.ref}/#{spec['file_path']}#L#{changed_line_number.to_i + 1})
|
48
|
+
| [Testcase](#{spec['testcase']}) | [Spec metrics](#{context.single_spec_metrics_link(spec['name'])})
|
49
|
+
#{failure_issue_text(spec)}
|
50
50
|
MARKDOWN
|
51
51
|
end.join("\n")
|
52
52
|
end
|
@@ -78,6 +78,8 @@ module GitlabQuality
|
|
78
78
|
|
79
79
|
@failure_issue = context.fetch_issue(iid: issue_id) if issue_id
|
80
80
|
|
81
|
+
spec['failure_issue_assignee_handle'] = @failure_issue['assignee']['username'] if @failure_issue && @failure_issue['assignee']
|
82
|
+
|
81
83
|
new_content, @changed_line_no = add_metadata
|
82
84
|
|
83
85
|
return unless proceed_with_commit?
|
@@ -11,6 +11,7 @@ module GitlabQuality
|
|
11
11
|
attr_reader :project, :ref, :report_issue, :processed_commits
|
12
12
|
|
13
13
|
TEST_PLATFORM_MAINTAINERS_SLACK_CHANNEL_ID = 'C0437FV9KBN' # test-platform-maintainers
|
14
|
+
BATCH_LIMIT = 10
|
14
15
|
|
15
16
|
def initialize(token:, project:, specs_file:, processor:, ref: 'master', dry_run: false)
|
16
17
|
@specs_file = specs_file
|
@@ -28,11 +29,12 @@ module GitlabQuality
|
|
28
29
|
|
29
30
|
contents['specs'].each do |spec|
|
30
31
|
processor.create_commit(spec, self)
|
32
|
+
break if processed_commits.keys.count >= BATCH_LIMIT
|
31
33
|
end
|
32
34
|
|
33
|
-
|
35
|
+
processor.create_merge_requests(self)
|
34
36
|
|
35
|
-
processor.post_process(
|
37
|
+
processor.post_process(self)
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
@@ -215,16 +217,17 @@ module GitlabQuality
|
|
215
217
|
issue_client.find_issues(iid: iid).first
|
216
218
|
end
|
217
219
|
|
218
|
-
# Post note on
|
220
|
+
# Post note on isse
|
219
221
|
#
|
220
222
|
# @param [String] note the note to post
|
221
223
|
# @return [Gitlab::ObjectifiedHash]
|
222
|
-
def
|
223
|
-
iid =
|
224
|
+
def post_note_on_issue(note, issue_url)
|
225
|
+
iid = issue_url&.split('/')&.last # split url segment, last segment of path is the issue id
|
224
226
|
if iid
|
225
227
|
issue_client.create_issue_note(iid: iid, note: note)
|
226
228
|
else
|
227
|
-
Runtime::Logger.info("#{self.class.name}##{__method__} Note was NOT posted on
|
229
|
+
Runtime::Logger.info("#{self.class.name}##{__method__} Note was NOT posted on issue: #{issue_url}")
|
230
|
+
nil
|
228
231
|
end
|
229
232
|
end
|
230
233
|
|
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.
|
4
|
+
version: 1.21.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: 2024-03
|
11
|
+
date: 2024-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: climate_control
|