Skip to content

Commit 72f3e65

Browse files
committed
init
1 parent 1e85367 commit 72f3e65

File tree

6 files changed

+349
-5
lines changed

6 files changed

+349
-5
lines changed

tools/flakeguard/.tool-versions

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
golang 1.24.0
Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
package cmd
2+
3+
import (
4+
"encoding/csv"
5+
"fmt"
6+
"os"
7+
8+
tea "github.com/charmbracelet/bubbletea"
9+
"github.com/charmbracelet/lipgloss"
10+
"github.com/rs/zerolog/log"
11+
"github.com/spf13/cobra"
12+
)
13+
14+
// CreateTicketsCmd is the command that runs a Bubble Tea TUI for your CSV data.
15+
var CreateTicketsCmd = &cobra.Command{
16+
Use: "create-tickets",
17+
Short: "Interactive TUI to confirm Jira tickets from CSV",
18+
Long: `Reads a CSV file describing flaky tests and displays each proposed
19+
ticket in a text-based UI. Press 'y' to confirm, 'n' to skip, 'q' to quit.`,
20+
RunE: func(cmd *cobra.Command, args []string) error {
21+
csvPath, _ := cmd.Flags().GetString("csv-path")
22+
if csvPath == "" {
23+
log.Error().Msg("CSV path is required")
24+
os.Exit(1)
25+
}
26+
27+
records, err := readCSV(csvPath)
28+
if err != nil {
29+
log.Error().Err(err).Msg("Error reading CSV file")
30+
os.Exit(1)
31+
}
32+
33+
// Convert CSV rows to Ticket objects (skipping invalid rows).
34+
var tickets []Ticket
35+
for i, row := range records {
36+
if len(row) < 10 {
37+
log.Warn().Msgf("Skipping row %d (not enough columns)", i+1)
38+
continue
39+
}
40+
tickets = append(tickets, rowToTicket(row))
41+
}
42+
43+
if len(tickets) == 0 {
44+
log.Warn().Msg("No valid tickets found in CSV.")
45+
return nil
46+
}
47+
48+
// Create and run Bubble Tea program
49+
p := tea.NewProgram(initialModel(tickets))
50+
if _, err := p.Run(); err != nil {
51+
log.Error().Err(err).Msg("Error running Bubble Tea program")
52+
os.Exit(1)
53+
}
54+
return nil
55+
},
56+
}
57+
58+
func init() {
59+
CreateTicketsCmd.Flags().String("csv-path", "", "Path to the CSV file containing ticket data")
60+
// Add this command to your root command in your main.go or wherever you define your CLI.
61+
// Example: rootCmd.AddCommand(BubbleTeaJiraCmd)
62+
}
63+
64+
// Ticket is a simple struct holding Summary and Description for each row.
65+
type Ticket struct {
66+
Summary string
67+
Description string
68+
}
69+
70+
// readCSV reads the entire CSV into a [][]string.
71+
func readCSV(path string) ([][]string, error) {
72+
f, err := os.Open(path)
73+
if err != nil {
74+
return nil, err
75+
}
76+
defer f.Close()
77+
78+
r := csv.NewReader(f)
79+
return r.ReadAll()
80+
}
81+
82+
// rowToTicket maps one CSV row to a Ticket, embedding your “flaky test” info.
83+
func rowToTicket(row []string) Ticket {
84+
// CSV columns (based on your format):
85+
// 0: Package
86+
// 1: Test Path
87+
// 2: Test
88+
// 3: Runs
89+
// 4: Successes
90+
// 5: Failures
91+
// 6: Skips
92+
// 7: Overall Flake Rate
93+
// 8: Code Owners
94+
// 9: Failed Logs
95+
96+
packageName := row[0]
97+
testName := row[2]
98+
flakeRate := row[7]
99+
codeOwners := row[8]
100+
failedLogs := row[9]
101+
102+
if codeOwners == "" {
103+
codeOwners = "N/A"
104+
}
105+
if failedLogs == "" {
106+
failedLogs = "N/A"
107+
}
108+
109+
summary := fmt.Sprintf("[Flaky Test] %s (Rate: %s%%)", testName, flakeRate)
110+
111+
description := fmt.Sprintf(`Test Details:
112+
113+
Package: %s
114+
Test Name: %s
115+
Flake Rate: %s%% in the last 7 days
116+
Code Owners: %s
117+
118+
Test Logs:
119+
%s
120+
121+
Action Items:
122+
123+
Investigate Failed Test Logs: Thoroughly review the provided logs to identify patterns or common error messages that indicate the root cause.
124+
125+
Fix the Issue: Analyze and address the underlying problem causing the flakiness.
126+
127+
Rerun Tests Locally: Execute the test and related changes on a local environment to ensure that the fix stabilizes the test, as well as all other tests that may be affected.
128+
129+
Unskip the Test: Once confirmed stable, remove any test skip markers to re-enable the test in the CI pipeline.
130+
131+
Reference Guidelines: Follow the recommendations in the Flaky Test Guide.
132+
`, packageName, testName, flakeRate, codeOwners, failedLogs)
133+
134+
return Ticket{
135+
Summary: summary,
136+
Description: description,
137+
}
138+
}
139+
140+
// ------------------ Bubble Tea Model ------------------
141+
142+
type model struct {
143+
tickets []Ticket
144+
index int // current ticket index
145+
confirmed int // how many confirmed
146+
skipped int // how many skipped
147+
quitting bool // whether we're exiting
148+
}
149+
150+
// initialModel sets up the Bubble Tea model with the tickets to display.
151+
func initialModel(tickets []Ticket) model {
152+
return model{
153+
tickets: tickets,
154+
index: 0,
155+
confirmed: 0,
156+
skipped: 0,
157+
quitting: false,
158+
}
159+
}
160+
161+
// Custom messages if we needed them (not strictly required here).
162+
type confirmMsg struct{}
163+
type skipMsg struct{}
164+
type quitMsg struct{}
165+
166+
// Init is called when the program starts (we have no initial I/O to perform).
167+
func (m model) Init() tea.Cmd {
168+
return nil
169+
}
170+
171+
// Update is called on every event (keyboard or otherwise).
172+
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
173+
switch msg := msg.(type) {
174+
case tea.KeyMsg:
175+
switch msg.String() {
176+
case "y": // confirm
177+
return updateConfirm(m)
178+
case "n": // skip
179+
return updateSkip(m)
180+
case "q", "ctrl+c", "esc": // quit
181+
return updateQuit(m)
182+
}
183+
}
184+
return m, nil
185+
}
186+
187+
func updateConfirm(m model) (tea.Model, tea.Cmd) {
188+
m.confirmed++
189+
m.index++
190+
if m.index >= len(m.tickets) {
191+
m.quitting = true
192+
}
193+
return m, nil
194+
}
195+
196+
func updateSkip(m model) (tea.Model, tea.Cmd) {
197+
m.skipped++
198+
m.index++
199+
if m.index >= len(m.tickets) {
200+
m.quitting = true
201+
}
202+
return m, nil
203+
}
204+
205+
func updateQuit(m model) (tea.Model, tea.Cmd) {
206+
m.quitting = true
207+
return m, tea.Quit
208+
}
209+
210+
// View renders our UI: if done, show summary; otherwise show current ticket.
211+
func (m model) View() string {
212+
if m.quitting || m.index >= len(m.tickets) {
213+
return finalView(m)
214+
}
215+
216+
t := m.tickets[m.index]
217+
218+
headerStyle := lipgloss.NewStyle().
219+
Bold(true).
220+
Foreground(lipgloss.Color("205")) // pinkish
221+
summaryStyle := lipgloss.NewStyle().
222+
Bold(true).
223+
Foreground(lipgloss.Color("10")) // green
224+
descStyle := lipgloss.NewStyle().
225+
Foreground(lipgloss.Color("7")) // light gray
226+
helpStyle := lipgloss.NewStyle().
227+
Faint(true)
228+
229+
header := headerStyle.Render(
230+
fmt.Sprintf("Proposed Ticket #%d of %d", m.index+1, len(m.tickets)),
231+
)
232+
sum := summaryStyle.Render("Summary: ") + t.Summary
233+
desc := descStyle.Render("Description:\n" + t.Description)
234+
help := helpStyle.Render("\nPress [y] to confirm, [n] to skip, [q] to quit.")
235+
236+
return fmt.Sprintf("%s\n\n%s\n\n%s\n%s\n", header, sum, desc, help)
237+
}
238+
239+
func finalView(m model) string {
240+
doneStyle := lipgloss.NewStyle().
241+
Bold(true).
242+
Foreground(lipgloss.Color("6")) // cyan
243+
return doneStyle.Render(fmt.Sprintf(
244+
"Done! Confirmed %d tickets, skipped %d. Exiting...\n",
245+
m.confirmed, m.skipped,
246+
))
247+
}

tools/flakeguard/go.mod

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ go 1.24.0
44

55
require (
66
github.com/briandowns/spinner v1.23.1
7+
github.com/charmbracelet/bubbletea v1.3.4
8+
github.com/charmbracelet/lipgloss v1.1.0
79
github.com/go-resty/resty/v2 v2.16.2
810
github.com/google/go-github/v67 v67.0.0
911
github.com/google/uuid v1.6.0
@@ -15,17 +17,32 @@ require (
1517
)
1618

1719
require (
20+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
21+
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
22+
github.com/charmbracelet/x/ansi v0.8.0 // indirect
23+
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
24+
github.com/charmbracelet/x/term v0.2.1 // indirect
1825
github.com/davecgh/go-spew v1.1.1 // indirect
26+
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
1927
github.com/fatih/color v1.7.0 // indirect
2028
github.com/google/go-querystring v1.1.0 // indirect
2129
github.com/inconshreveable/mousetrap v1.1.0 // indirect
30+
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
2231
github.com/mattn/go-colorable v0.1.13 // indirect
23-
github.com/mattn/go-isatty v0.0.19 // indirect
32+
github.com/mattn/go-isatty v0.0.20 // indirect
33+
github.com/mattn/go-localereader v0.0.1 // indirect
34+
github.com/mattn/go-runewidth v0.0.16 // indirect
35+
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
36+
github.com/muesli/cancelreader v0.2.2 // indirect
37+
github.com/muesli/termenv v0.16.0 // indirect
2438
github.com/pkg/errors v0.9.1 // indirect
2539
github.com/pmezard/go-difflib v1.0.0 // indirect
40+
github.com/rivo/uniseg v0.4.7 // indirect
2641
github.com/spf13/pflag v1.0.5 // indirect
42+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
2743
golang.org/x/net v0.27.0 // indirect
28-
golang.org/x/sys v0.22.0 // indirect
44+
golang.org/x/sync v0.11.0 // indirect
45+
golang.org/x/sys v0.30.0 // indirect
2946
golang.org/x/term v0.22.0 // indirect
3047
gopkg.in/yaml.v3 v3.0.1 // indirect
3148
)

tools/flakeguard/go.sum

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,25 @@
1+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
2+
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
13
github.com/briandowns/spinner v1.23.1 h1:t5fDPmScwUjozhDj4FA46p5acZWIPXYE30qW2Ptu650=
24
github.com/briandowns/spinner v1.23.1/go.mod h1:LaZeM4wm2Ywy6vO571mvhQNRcWfRUnXOs0RcKV0wYKM=
5+
github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI=
6+
github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo=
7+
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
8+
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
9+
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
10+
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
11+
github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
12+
github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
13+
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8=
14+
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
15+
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
16+
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
317
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
418
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
519
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
620
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
21+
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
22+
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
723
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
824
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
925
github.com/go-resty/resty/v2 v2.16.2 h1:CpRqTjIzq/rweXUt9+GxzzQdlkqMdt8Lm/fuK/CAbAg=
@@ -20,15 +36,31 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
2036
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
2137
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
2238
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
39+
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
40+
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
2341
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
2442
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
2543
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
26-
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
2744
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
45+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
46+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
47+
github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4=
48+
github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
49+
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
50+
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
51+
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
52+
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
53+
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
54+
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
55+
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
56+
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
2857
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
2958
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
3059
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
3160
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
61+
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
62+
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
63+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
3264
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
3365
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
3466
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
@@ -39,15 +71,22 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
3971
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
4072
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
4173
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
74+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
75+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
76+
golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E=
77+
golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
4278
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
4379
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
4480
golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
4581
golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
82+
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
83+
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
84+
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
4685
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
4786
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
4887
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
49-
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
50-
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
88+
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
89+
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
5190
golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
5291
golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
5392
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=

tools/flakeguard/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ func init() {
4343
rootCmd.AddCommand(cmd.GenerateReportCmd)
4444
rootCmd.AddCommand(cmd.GetGHArtifactLinkCmd)
4545
rootCmd.AddCommand(cmd.SendToSplunkCmd)
46+
rootCmd.AddCommand(cmd.CreateTicketsCmd)
4647
}
4748

4849
func main() {

0 commit comments

Comments
 (0)