dri 0.9.0 → 0.10.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 +4 -4
- data/.gitlab/merge_request_templates/Release.md +2 -2
- data/Gemfile.lock +19 -16
- data/README.md +15 -0
- data/dri.gemspec +1 -0
- data/faq.yaml +21 -0
- data/lib/dri/api_client.rb +19 -7
- data/lib/dri/cli.rb +17 -0
- data/lib/dri/command.rb +4 -0
- data/lib/dri/commands/faq.rb +33 -0
- data/lib/dri/commands/fetch/failures.rb +35 -21
- data/lib/dri/commands/fetch/pipelines.rb +0 -3
- data/lib/dri/commands/fetch/testcases.rb +0 -1
- data/lib/dri/commands/fetch.rb +8 -1
- data/lib/dri/commands/profile.rb +8 -3
- data/lib/dri/report.rb +0 -1
- data/lib/dri/utils/constants.rb +1 -7
- data/lib/dri/version.rb +1 -1
- metadata +18 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b5791162eb6afd6c20228dc94f5c247233a1f9703743fb671df15f0cef3258c2
|
|
4
|
+
data.tar.gz: 2629b72f72f18669b362b7f904bce44a4abc63b8fa421a4dbb515c1dd17ee8cb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6ffc4003b8ea2cc342c88a3f457f3ea9701f9dfe0e7ca0ff7a5f54e2ec1a8ccc896dea9e16bb4ea1655d3e9d1eadadaa0ef2d01652ffb4740fb94fcc01690397
|
|
7
|
+
data.tar.gz: f302fd36aa8cc2385e6c83e6de915481b3515097be2d5e7137ea63af3ef70e7462ad2a4f64a575777cd734b1320699b01c4efd99fd60941d59b0b8b65a4b005a
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## Diff
|
|
2
|
-
<!-- Replace `v0.9.0` with the previous DRI release, and `
|
|
3
|
-
https://gitlab.com/gitlab-org/quality/dri/-/compare/v0.9.0...
|
|
2
|
+
<!-- Replace `v0.9.0` with the previous DRI release, and `55ddcace1c166fa2323d4e556262eba6b274230a` with the latest commit from https://gitlab.com/gitlab-org/quality/dri/-/commits/master that will be included in the release -->
|
|
3
|
+
https://gitlab.com/gitlab-org/quality/dri/-/compare/v0.9.0...55ddcace1c166fa2323d4e556262eba6b274230a
|
|
4
4
|
|
|
5
5
|
## Release Notes
|
|
6
6
|
|
data/Gemfile.lock
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
dri (0.
|
|
4
|
+
dri (0.10.0)
|
|
5
5
|
amatch (~> 0.4.1)
|
|
6
6
|
gitlab (~> 4.19)
|
|
7
7
|
httparty (~> 0.21.0)
|
|
8
8
|
json (~> 2.6.1)
|
|
9
|
+
launchy (~> 2.4)
|
|
9
10
|
markdown-tables (~> 1.1.1)
|
|
10
11
|
pastel (~> 0.8.0)
|
|
11
12
|
thor (~> 1.2.0)
|
|
@@ -22,12 +23,12 @@ PATH
|
|
|
22
23
|
GEM
|
|
23
24
|
remote: https://rubygems.org/
|
|
24
25
|
specs:
|
|
25
|
-
activesupport (7.0.
|
|
26
|
+
activesupport (7.0.5)
|
|
26
27
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
27
28
|
i18n (>= 1.6, < 2)
|
|
28
29
|
minitest (>= 5.1)
|
|
29
30
|
tzinfo (~> 2.0)
|
|
30
|
-
addressable (2.8.
|
|
31
|
+
addressable (2.8.4)
|
|
31
32
|
public_suffix (>= 2.0.2, < 6.0)
|
|
32
33
|
amatch (0.4.1)
|
|
33
34
|
mize
|
|
@@ -52,11 +53,13 @@ GEM
|
|
|
52
53
|
httparty (0.21.0)
|
|
53
54
|
mini_mime (>= 1.0.0)
|
|
54
55
|
multi_xml (>= 0.5.2)
|
|
55
|
-
i18n (1.
|
|
56
|
+
i18n (1.13.0)
|
|
56
57
|
concurrent-ruby (~> 1.0)
|
|
57
58
|
json (2.6.3)
|
|
58
59
|
kramdown (2.4.0)
|
|
59
60
|
rexml
|
|
61
|
+
launchy (2.5.2)
|
|
62
|
+
addressable (~> 2.8)
|
|
60
63
|
markdown-tables (1.1.1)
|
|
61
64
|
method_source (1.0.0)
|
|
62
65
|
mini_mime (1.1.2)
|
|
@@ -64,8 +67,8 @@ GEM
|
|
|
64
67
|
mize (0.4.1)
|
|
65
68
|
protocol (~> 2.0)
|
|
66
69
|
multi_xml (0.6.0)
|
|
67
|
-
parallel (1.
|
|
68
|
-
parser (3.2.1
|
|
70
|
+
parallel (1.23.0)
|
|
71
|
+
parser (3.2.2.1)
|
|
69
72
|
ast (~> 2.4.1)
|
|
70
73
|
pastel (0.8.0)
|
|
71
74
|
tty-color (~> 0.5)
|
|
@@ -75,12 +78,12 @@ GEM
|
|
|
75
78
|
coderay (~> 1.1)
|
|
76
79
|
method_source (~> 1.0)
|
|
77
80
|
public_suffix (5.0.1)
|
|
78
|
-
rack (3.0.
|
|
81
|
+
rack (3.0.7)
|
|
79
82
|
rainbow (3.1.1)
|
|
80
83
|
rake (13.0.6)
|
|
81
|
-
regexp_parser (2.
|
|
84
|
+
regexp_parser (2.8.0)
|
|
82
85
|
rexml (3.2.5)
|
|
83
|
-
rouge (
|
|
86
|
+
rouge (4.1.1)
|
|
84
87
|
rspec (3.10.0)
|
|
85
88
|
rspec-core (~> 3.10.0)
|
|
86
89
|
rspec-expectations (~> 3.10.0)
|
|
@@ -103,7 +106,7 @@ GEM
|
|
|
103
106
|
rubocop-ast (>= 0.6.0)
|
|
104
107
|
ruby-progressbar (~> 1.7)
|
|
105
108
|
unicode-display_width (>= 1.4.0, < 2.0)
|
|
106
|
-
rubocop-ast (1.
|
|
109
|
+
rubocop-ast (1.28.1)
|
|
107
110
|
parser (>= 3.2.1.0)
|
|
108
111
|
rubocop-gitlab-security (0.1.1)
|
|
109
112
|
rubocop (>= 0.51)
|
|
@@ -120,9 +123,9 @@ GEM
|
|
|
120
123
|
rubocop (~> 0.87)
|
|
121
124
|
rubocop-ast (>= 0.7.1)
|
|
122
125
|
ruby-progressbar (1.13.0)
|
|
123
|
-
ruby_parser (3.20.
|
|
126
|
+
ruby_parser (3.20.1)
|
|
124
127
|
sexp_processor (~> 4.16)
|
|
125
|
-
sexp_processor (4.
|
|
128
|
+
sexp_processor (4.17.0)
|
|
126
129
|
strings (0.2.1)
|
|
127
130
|
strings-ansi (~> 0.2)
|
|
128
131
|
unicode-display_width (>= 1.5, < 3.0)
|
|
@@ -131,7 +134,7 @@ GEM
|
|
|
131
134
|
sync (0.5.0)
|
|
132
135
|
terminal-table (3.0.2)
|
|
133
136
|
unicode-display_width (>= 1.1.1, < 3)
|
|
134
|
-
thor (1.2.
|
|
137
|
+
thor (1.2.2)
|
|
135
138
|
timecop (0.9.6)
|
|
136
139
|
tins (1.32.1)
|
|
137
140
|
sync
|
|
@@ -147,10 +150,10 @@ GEM
|
|
|
147
150
|
tty-font (0.5.0)
|
|
148
151
|
tty-logger (0.6.0)
|
|
149
152
|
pastel (~> 0.8)
|
|
150
|
-
tty-markdown (0.7.
|
|
153
|
+
tty-markdown (0.7.2)
|
|
151
154
|
kramdown (>= 1.16.2, < 3.0)
|
|
152
155
|
pastel (~> 0.8)
|
|
153
|
-
rouge (
|
|
156
|
+
rouge (>= 3.14, < 5.0)
|
|
154
157
|
strings (~> 0.2.0)
|
|
155
158
|
tty-color (~> 0.5)
|
|
156
159
|
tty-screen (~> 0.8)
|
|
@@ -191,4 +194,4 @@ DEPENDENCIES
|
|
|
191
194
|
webmock (~> 3.5)
|
|
192
195
|
|
|
193
196
|
BUNDLED WITH
|
|
194
|
-
2.4.
|
|
197
|
+
2.4.13
|
data/README.md
CHANGED
|
@@ -70,6 +70,7 @@ $ dri profile
|
|
|
70
70
|
- [7. analyze](#7-analyze)
|
|
71
71
|
- stacktraces
|
|
72
72
|
- [8. version](#8-version)
|
|
73
|
+
- [9. faq](#8-faq)
|
|
73
74
|
|
|
74
75
|
#### 1. init
|
|
75
76
|
|
|
@@ -97,6 +98,11 @@ $ dri fetch failures
|
|
|
97
98
|
Fetches today's opened failures and lists them according to their triage status.
|
|
98
99
|
Helpful to understand if there are missing recent failures to be reviewed.
|
|
99
100
|
|
|
101
|
+
There is the possibility to customise the timeframe for such failures by passing a
|
|
102
|
+
`--start_date=DD-MM-YYYY` and `--end_date=DD-MM-YYYY`. It is also possible to pass
|
|
103
|
+
a `--cutoff=HH:MM` to just show failures after a certain period of the day. The cutoff
|
|
104
|
+
time will be converted to UTC.
|
|
105
|
+
|
|
100
106
|
To surface most urgent issues pass the `--urgent` flag to see issues that are both
|
|
101
107
|
in `canary` and `staging-canary` pipelines just during today's timespan.
|
|
102
108
|
|
|
@@ -228,6 +234,15 @@ $ dri version
|
|
|
228
234
|
|
|
229
235
|
`dri` gem version.
|
|
230
236
|
|
|
237
|
+
#### 9. faq
|
|
238
|
+
|
|
239
|
+
```shell
|
|
240
|
+
$ dri faq
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Returns a list of questions and answers related to on-call operations. This leverages
|
|
244
|
+
existing pages of documentation, redirecting directly to the relevant section to help
|
|
245
|
+
with a problem.
|
|
231
246
|
## Copyright
|
|
232
247
|
|
|
233
248
|
Copyright (c) 2022 GitLab, Inc. See [MIT License](LICENSE.txt) for further details.
|
data/dri.gemspec
CHANGED
|
@@ -26,6 +26,7 @@ Gem::Specification.new do |spec|
|
|
|
26
26
|
spec.add_dependency "gitlab", "~> 4.19"
|
|
27
27
|
spec.add_dependency 'httparty', '~> 0.21.0'
|
|
28
28
|
spec.add_dependency 'json', '~> 2.6.1'
|
|
29
|
+
spec.add_dependency 'launchy', '~> 2.4'
|
|
29
30
|
spec.add_dependency 'markdown-tables', '~> 1.1.1'
|
|
30
31
|
spec.add_dependency 'pastel', '~> 0.8.0'
|
|
31
32
|
spec.add_dependency 'thor', '~> 1.2.0'
|
data/faq.yaml
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
- question: "Which pipelines we currently have and what is their running cadence?"
|
|
3
|
+
link: "https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#qa-test-pipelines"
|
|
4
|
+
- question: "Where can I find the rotation schedule?"
|
|
5
|
+
link: "https://gitlab.com/gitlab-org/quality/pipeline-triage#dri-weekly-rotation-schedule"
|
|
6
|
+
- question: "What is the process to quarantine a test?"
|
|
7
|
+
link: "https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#quarantining-tests"
|
|
8
|
+
- question: "What is the process to dequarantine a test?"
|
|
9
|
+
link: "https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#dequarantining-tests"
|
|
10
|
+
- question: "What are the failure classification labels?"
|
|
11
|
+
link: "https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#classify-and-triage-the-test-failure"
|
|
12
|
+
- question: "I have a correlation ID. How to find logs from various GitLab components?"
|
|
13
|
+
link: "https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#kibana-correlation-dashboards"
|
|
14
|
+
- question: "Where do I find the MR that introduced a feature flag?"
|
|
15
|
+
link: "https://samdbeckham.gitlab.io/feature-flags/#%5B%7B%22type%22:%22filtered-search-term%22,%22value%22:%7B%22data%22:%22%22%7D%7D%5D"
|
|
16
|
+
- question: "What to do when a failure needs escalation?"
|
|
17
|
+
link: "https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#failure-needs-escalation"
|
|
18
|
+
- question: "I have an MR to fix the failure. How I make sure it is merged as soon as possible?"
|
|
19
|
+
link: "https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#fixing-the-test"
|
|
20
|
+
|
|
21
|
+
|
data/lib/dri/api_client.rb
CHANGED
|
@@ -160,15 +160,24 @@ module Dri
|
|
|
160
160
|
|
|
161
161
|
# Fetch all new failures
|
|
162
162
|
#
|
|
163
|
-
# @param [String]
|
|
163
|
+
# @param [String] start_date
|
|
164
|
+
# @param [String] end_date
|
|
164
165
|
# @param [String] state
|
|
165
166
|
# @return [Array<Gitlab::ObjectifiedHash>]
|
|
166
|
-
def fetch_all_new_failures(
|
|
167
|
+
def fetch_all_new_failures(start_date:, end_date:, state:)
|
|
167
168
|
project_ids = [GITLAB_PROJECT_ID, CUSTOMERSDOT_PROJECT_ID]
|
|
168
169
|
failures = []
|
|
169
170
|
|
|
171
|
+
start_date_iso = start_date.strftime('%Y-%m-%dT00:00:00Z')
|
|
172
|
+
end_date_iso = end_date.strftime('%Y-%m-%dT23:59:59Z')
|
|
173
|
+
|
|
170
174
|
project_ids.each do |project_id|
|
|
171
|
-
failures += fetch_new_failures(
|
|
175
|
+
failures += fetch_new_failures(
|
|
176
|
+
project_id: project_id,
|
|
177
|
+
start_date: start_date_iso,
|
|
178
|
+
end_date: end_date_iso,
|
|
179
|
+
state: state
|
|
180
|
+
)
|
|
172
181
|
end
|
|
173
182
|
|
|
174
183
|
failures
|
|
@@ -177,17 +186,20 @@ module Dri
|
|
|
177
186
|
# Fetch new failures for a given project
|
|
178
187
|
#
|
|
179
188
|
# @param [Integer] project_id
|
|
180
|
-
# @param [String]
|
|
189
|
+
# @param [String] start_date
|
|
190
|
+
# @param [String] end_date
|
|
181
191
|
# @param [String] state
|
|
182
192
|
# @return [Array<Gitlab::ObjectifiedHash>]
|
|
183
|
-
def fetch_new_failures(project_id:,
|
|
193
|
+
def fetch_new_failures(project_id:, start_date:, end_date:, state:)
|
|
184
194
|
gitlab.issues(
|
|
185
195
|
project_id,
|
|
186
196
|
labels: FAILURE_NEW,
|
|
187
|
-
order_by: "
|
|
197
|
+
order_by: "created_at",
|
|
198
|
+
sort: 'desc',
|
|
188
199
|
state: state,
|
|
189
200
|
scope: "all",
|
|
190
|
-
created_after:
|
|
201
|
+
created_after: start_date,
|
|
202
|
+
created_before: end_date,
|
|
191
203
|
per_page: 100
|
|
192
204
|
)
|
|
193
205
|
end
|
data/lib/dri/cli.rb
CHANGED
|
@@ -77,6 +77,23 @@ module Dri
|
|
|
77
77
|
end
|
|
78
78
|
end
|
|
79
79
|
|
|
80
|
+
desc 'faq', 'Consult frequently ask questions while on-call'
|
|
81
|
+
method_option :help, aliases: '-h', type: :boolean,
|
|
82
|
+
desc: 'Display usage information'
|
|
83
|
+
|
|
84
|
+
def faq(*)
|
|
85
|
+
if options[:help]
|
|
86
|
+
invoke :help, ['faq']
|
|
87
|
+
else
|
|
88
|
+
begin
|
|
89
|
+
require_relative 'commands/faq'
|
|
90
|
+
Dri::Commands::FAQ.new(options).execute
|
|
91
|
+
rescue Dri::Commands::FAQ::ExitCommand
|
|
92
|
+
puts "Exiting faq command..."
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
80
97
|
require_relative 'commands/fetch'
|
|
81
98
|
register Dri::Commands::Fetch, 'fetch', 'fetch [SUBCOMMAND]', 'Fetch failures & testcases'
|
|
82
99
|
|
data/lib/dri/command.rb
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../command'
|
|
4
|
+
require 'tty-prompt'
|
|
5
|
+
require 'launchy'
|
|
6
|
+
|
|
7
|
+
module Dri
|
|
8
|
+
module Commands
|
|
9
|
+
class FAQ < Dri::Command
|
|
10
|
+
ExitCommand = Class.new(StandardError)
|
|
11
|
+
|
|
12
|
+
def execute(input: $stdin, output: $stdout)
|
|
13
|
+
root_dir = File.expand_path('../../..', __dir__)
|
|
14
|
+
faq_file = File.join(root_dir, 'faq.yaml')
|
|
15
|
+
faq_data = YAML.load_file(faq_file)
|
|
16
|
+
|
|
17
|
+
prompt = TTY::Prompt.new
|
|
18
|
+
|
|
19
|
+
choices = faq_data.map { |entry| { name: entry['question'], value: entry['link'] } }
|
|
20
|
+
|
|
21
|
+
url = prompt.select("Select a question:", choices)
|
|
22
|
+
raise ExitCommand if url.nil? || url.strip.empty?
|
|
23
|
+
|
|
24
|
+
begin
|
|
25
|
+
Launchy.open(url)
|
|
26
|
+
rescue Launchy::Error => e
|
|
27
|
+
puts "Failed to open URL: #{e.message}"
|
|
28
|
+
raise ExitCommand
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -12,17 +12,11 @@ module Dri
|
|
|
12
12
|
include Dri::Utils::Constants::Triage::Labels
|
|
13
13
|
using Refinements
|
|
14
14
|
|
|
15
|
-
SORT_BY_OPTIONS = {
|
|
16
|
-
title: 0,
|
|
17
|
-
triaged: 1,
|
|
18
|
-
environment: 2,
|
|
19
|
-
author: 3,
|
|
20
|
-
url: 4
|
|
21
|
-
}.freeze
|
|
22
|
-
|
|
23
15
|
def initialize(options)
|
|
24
16
|
@options = options
|
|
25
|
-
@
|
|
17
|
+
@start_date = @options[:start_date] ? Date.parse(@options[:start_date]) : Date.today
|
|
18
|
+
@end_date = @options[:end_date] ? Date.parse(@options[:end_date]) : Date.today
|
|
19
|
+
@cutoff_time = @options[:cutoff] ? Time.parse(options[:cutoff]).utc : nil
|
|
26
20
|
end
|
|
27
21
|
|
|
28
22
|
def execute(input: $stdin, output: $stdout) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
|
|
@@ -35,26 +29,40 @@ module Dri
|
|
|
35
29
|
environment = add_color('Environment', :bright_yellow)
|
|
36
30
|
author = add_color('Author', :bright_yellow)
|
|
37
31
|
url = add_color('URL', :bright_yellow)
|
|
32
|
+
updated_at = add_color('Updated at', :bright_yellow)
|
|
38
33
|
|
|
39
34
|
sorted_failures = []
|
|
40
|
-
labels =
|
|
35
|
+
labels = { title: title, triaged: triaged, environment: environment, author: author, url: url,
|
|
36
|
+
updated_at: updated_at }
|
|
41
37
|
triaged_counter = 0
|
|
42
38
|
|
|
43
|
-
|
|
39
|
+
if @cutoff_time
|
|
40
|
+
@start_date = Time.new(
|
|
41
|
+
@start_date.year,
|
|
42
|
+
@start_date.month,
|
|
43
|
+
@start_date.day,
|
|
44
|
+
@cutoff_time.hour,
|
|
45
|
+
@cutoff_time.min, 0,
|
|
46
|
+
"+00:00"
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
logger.info "Fetching failures from #{@start_date} (UTC) to #{@end_date} (UTC)..."
|
|
44
51
|
|
|
45
52
|
spinner.run do # rubocop:disable Metrics/BlockLength
|
|
46
|
-
failures = api_client.fetch_all_new_failures(
|
|
53
|
+
failures = api_client.fetch_all_new_failures(start_date: @start_date, end_date: @end_date, state: 'opened')
|
|
47
54
|
|
|
48
55
|
if failures.empty?
|
|
49
|
-
logger.info
|
|
56
|
+
logger.info "Life is great, there are no new failures between #{@start_date} and #{@end_date}!"
|
|
50
57
|
exit 0
|
|
51
58
|
end
|
|
52
59
|
|
|
53
60
|
failures.each do |failure|
|
|
54
61
|
project_id = failure.project_id
|
|
55
62
|
title = failure.title.truncate(60)
|
|
56
|
-
author = failure.to_h.dig('author', 'username')
|
|
63
|
+
author = failure.to_h.dig('author', 'username').truncate(25)
|
|
57
64
|
url = failure.web_url
|
|
65
|
+
updated_at = failure.updated_at
|
|
58
66
|
triaged = add_color('x', :red)
|
|
59
67
|
envs = failure.labels.select { |l| l.include?(FOUND) }.map do |l|
|
|
60
68
|
env = l.split(':').last.gsub('.gitlab.com', '')
|
|
@@ -63,6 +71,8 @@ module Dri
|
|
|
63
71
|
end
|
|
64
72
|
urgent = urgent_environments.all? { |env| envs.include?(env) }
|
|
65
73
|
|
|
74
|
+
next if @options[:urgent] && !urgent
|
|
75
|
+
|
|
66
76
|
emoji_awards = api_client.fetch_awarded_emojis(failure.iid, project_id: project_id).find do |e|
|
|
67
77
|
e.name == emoji && e.to_h.dig('user', 'username') == username
|
|
68
78
|
end
|
|
@@ -72,14 +82,11 @@ module Dri
|
|
|
72
82
|
triaged_counter += 1
|
|
73
83
|
end
|
|
74
84
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
else
|
|
78
|
-
sorted_failures << [title, triaged, envs.first, author, url]
|
|
79
|
-
end
|
|
85
|
+
sorted_failures << { title: title, triaged: triaged, environment: envs.first, author: author, url: url,
|
|
86
|
+
updated_at: updated_at }
|
|
80
87
|
end
|
|
81
88
|
|
|
82
|
-
sorted_failures.sort_by! { |failure| failure[
|
|
89
|
+
sorted_failures.sort_by! { |failure| failure[@options[:sort_by]&.to_sym || :environment] }
|
|
83
90
|
end
|
|
84
91
|
|
|
85
92
|
msg = if @options[:urgent]
|
|
@@ -92,7 +99,14 @@ module Dri
|
|
|
92
99
|
MSG
|
|
93
100
|
end
|
|
94
101
|
|
|
95
|
-
|
|
102
|
+
terminal_width = TTY::Screen.width
|
|
103
|
+
|
|
104
|
+
if terminal_width <= 210 # adjust the desired minimum width
|
|
105
|
+
labels.delete(:updated_at)
|
|
106
|
+
sorted_failures.map { |failure| failure.delete(:updated_at) }
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
print_table(labels.values, sorted_failures.map(&:values), alignments: [:left, :center, :center, :left, :left])
|
|
96
110
|
output.puts(msg)
|
|
97
111
|
end
|
|
98
112
|
end
|
|
@@ -120,7 +120,6 @@ module Dri
|
|
|
120
120
|
tests_exceed_threshold?(project_id: project_id, pipeline_id: pipeline_id, ops: ops)
|
|
121
121
|
else
|
|
122
122
|
contains_stage?(jobs, "qa") || contains_stage?(jobs, "test")
|
|
123
|
-
# Nightly pipeline does not execute full E2E suite if sanity fails so can't check tests count
|
|
124
123
|
end
|
|
125
124
|
end
|
|
126
125
|
|
|
@@ -161,8 +160,6 @@ module Dri
|
|
|
161
160
|
case pipeline_name
|
|
162
161
|
when "master"
|
|
163
162
|
"e2e-package-and-test"
|
|
164
|
-
when "nightly"
|
|
165
|
-
pipeline_name
|
|
166
163
|
when "pre_prod"
|
|
167
164
|
"preprod-#{run_type(sanity)}"
|
|
168
165
|
else
|
data/lib/dri/commands/fetch.rb
CHANGED
|
@@ -45,13 +45,20 @@ module Dri
|
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
desc 'failures', 'Display failures opened
|
|
48
|
+
desc 'failures', 'Display failures opened on a given period.'
|
|
49
49
|
method_option :help, aliases: '-h', type: :boolean,
|
|
50
50
|
desc: 'Display usage information'
|
|
51
51
|
method_option :urgent, type: :boolean,
|
|
52
52
|
desc: 'Shows failures that quickly escalated'
|
|
53
53
|
method_option :sort_by, type: :string,
|
|
54
54
|
desc: 'Shows failures in specified order'
|
|
55
|
+
method_option :start_date, type: :string,
|
|
56
|
+
desc: 'Fetch failures created after this date (YYYY-MM-DD)'
|
|
57
|
+
method_option :end_date, type: :string,
|
|
58
|
+
desc: 'Fetch failures created before this date (YYYY-MM-DD)'
|
|
59
|
+
method_option :cutoff, type: :string,
|
|
60
|
+
desc: 'Fetch failures created after this time (HH:MM)'
|
|
61
|
+
|
|
55
62
|
def failures(*)
|
|
56
63
|
if options[:help]
|
|
57
64
|
invoke :help, ['failures']
|
data/lib/dri/commands/profile.rb
CHANGED
|
@@ -20,10 +20,12 @@ module Dri
|
|
|
20
20
|
logger.info "🔎 Looking for profiles...\n"
|
|
21
21
|
|
|
22
22
|
if config.exist?
|
|
23
|
+
width = handover_report_path.nil? ? 30 : 75
|
|
24
|
+
|
|
23
25
|
frame_args = {
|
|
24
|
-
width:
|
|
26
|
+
width: width,
|
|
25
27
|
height: 10,
|
|
26
|
-
align: :
|
|
28
|
+
align: :left,
|
|
27
29
|
padding: 1,
|
|
28
30
|
border: :thick,
|
|
29
31
|
title: { top_left: add_color('PROFILE:', :bright_cyan) }
|
|
@@ -37,10 +39,13 @@ module Dri
|
|
|
37
39
|
|
|
38
40
|
def pretty_print_profile
|
|
39
41
|
<<~PROFILE
|
|
40
|
-
#{add_color('User:', :bright_cyan)} #{username}
|
|
42
|
+
#{add_color('User:', :bright_cyan)} #{username}
|
|
43
|
+
#{add_color('Token:', :bright_cyan)} #{token}
|
|
41
44
|
#{add_color('OpsToken:', :bright_cyan)} #{ops_token}
|
|
42
45
|
#{add_color('Timezone:', :bright_cyan)} #{timezone}
|
|
43
46
|
#{add_color('Emoji:', :bright_cyan)} #{emoji}
|
|
47
|
+
#{add_color('Report Path:', :bright_cyan)} #{handover_report_path}
|
|
48
|
+
|
|
44
49
|
PROFILE
|
|
45
50
|
end
|
|
46
51
|
end
|
data/lib/dri/report.rb
CHANGED
|
@@ -83,7 +83,6 @@ module Dri
|
|
|
83
83
|
'canary.staging.gitlab.com' => '/quality/staging-canary',
|
|
84
84
|
'main' => '/gitlab-org/gitlab-qa-mirror',
|
|
85
85
|
'master' => '/gitlab-org/gitlab-qa-mirror',
|
|
86
|
-
'nightly' => '/quality/nightly',
|
|
87
86
|
'pre.gitlab.com' => '/quality/preprod',
|
|
88
87
|
'staging-ref' => '/quality/staging-ref',
|
|
89
88
|
'staging.gitlab.com' => '/quality/staging',
|
data/lib/dri/utils/constants.rb
CHANGED
|
@@ -63,12 +63,6 @@ module Dri
|
|
|
63
63
|
project_id: "547",
|
|
64
64
|
search_hours_ago: 12
|
|
65
65
|
},
|
|
66
|
-
nightly: {
|
|
67
|
-
name: "nightly",
|
|
68
|
-
url: "https://gitlab.com/gitlab-org/quality/nightly",
|
|
69
|
-
project_id: "7523614",
|
|
70
|
-
search_hours_ago: 24
|
|
71
|
-
},
|
|
72
66
|
pre_prod: {
|
|
73
67
|
name: "pre.gitlab.com",
|
|
74
68
|
url: "https://ops.gitlab.net/gitlab-org/quality/preprod",
|
|
@@ -85,7 +79,7 @@ module Dri
|
|
|
85
79
|
name: "master",
|
|
86
80
|
url: "https://gitlab.com/gitlab-org/gitlab",
|
|
87
81
|
project_id: "278964",
|
|
88
|
-
search_hours_ago:
|
|
82
|
+
search_hours_ago: 24
|
|
89
83
|
}
|
|
90
84
|
}.freeze
|
|
91
85
|
end
|
data/lib/dri/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dri
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.10.0
|
|
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
|
+
date: 2023-05-31 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: amatch
|
|
@@ -66,6 +66,20 @@ dependencies:
|
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: 2.6.1
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: launchy
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '2.4'
|
|
76
|
+
type: :runtime
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '2.4'
|
|
69
83
|
- !ruby/object:Gem::Dependency
|
|
70
84
|
name: markdown-tables
|
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -343,12 +357,14 @@ files:
|
|
|
343
357
|
- bin/setup
|
|
344
358
|
- dri.gemspec
|
|
345
359
|
- exe/dri
|
|
360
|
+
- faq.yaml
|
|
346
361
|
- lib/dri.rb
|
|
347
362
|
- lib/dri/api_client.rb
|
|
348
363
|
- lib/dri/cli.rb
|
|
349
364
|
- lib/dri/command.rb
|
|
350
365
|
- lib/dri/commands/analyze.rb
|
|
351
366
|
- lib/dri/commands/analyze/stack_traces.rb
|
|
367
|
+
- lib/dri/commands/faq.rb
|
|
352
368
|
- lib/dri/commands/fetch.rb
|
|
353
369
|
- lib/dri/commands/fetch/failures.rb
|
|
354
370
|
- lib/dri/commands/fetch/featureflags.rb
|