diff --git a/dev/testsreporter/_static/summary.tmpl b/dev/testsreporter/_static/summary.tmpl index 9e5bbe073d4..e2dbeca3453 100644 --- a/dev/testsreporter/_static/summary.tmpl +++ b/dev/testsreporter/_static/summary.tmpl @@ -20,7 +20,7 @@ - {{ . }} {{- end }} {{ end -}} -{{ if ne (len .owners) 0 -}} +{{ if and (ne .owners nil) (ne (len .owners) 0) -}} - Owners: {{- range .owners }} - {{ . }} diff --git a/dev/testsreporter/builderror.go b/dev/testsreporter/builderror.go index 44865cf742b..c815dd578a2 100644 --- a/dev/testsreporter/builderror.go +++ b/dev/testsreporter/builderror.go @@ -5,7 +5,6 @@ package testsreporter import ( - "fmt" "strings" ) @@ -14,14 +13,6 @@ const ( buildReportingTeamLabel = "Team:Ecosystem" ) -type dataError struct { - errorLinks - serverless bool - serverlessProject string - logsDB bool - stackVersion string -} - type buildError struct { dataError teams []string @@ -65,53 +56,35 @@ func newBuildError(options buildErrorOptions) (*buildError, error) { func (b *buildError) String() string { var sb strings.Builder - if b.logsDB { - sb.WriteString("[LogsDB] ") - } - if b.serverless { - sb.WriteString(fmt.Sprintf("[Serverless %s] ", b.serverlessProject)) - } - if b.stackVersion != "" { - sb.WriteString("[Stack ") - sb.WriteString(b.stackVersion) - sb.WriteString("] ") - } + sb.WriteString(b.dataError.String()) sb.WriteString("Too many packages failing in daily job") return sb.String() } -func (p *buildError) FirstBuild() string { - return p.errorLinks.firstBuild +func (b *buildError) FirstBuild() string { + return b.errorLinks.firstBuild } -func (p *buildError) UpdateLinks(links errorLinks) { - p.errorLinks = links +func (b *buildError) UpdateLinks(links errorLinks) { + b.errorLinks = links } -func (p *buildError) Teams() []string { - return p.teams +func (b *buildError) Teams() []string { + return b.teams } -func (p *buildError) SummaryData() map[string]any { - return map[string]any{ - "stackVersion": p.stackVersion, - "serverless": p.serverless, - "serverlessProject": p.serverlessProject, - "logsDB": p.logsDB, - "packages": p.packages, - "owners": p.teams, - } +func (b *buildError) SummaryData() map[string]any { + data := b.dataError.Data() + data["packages"] = b.packages + data["owners"] = b.teams + return data } -func (p *buildError) DescriptionData() map[string]any { - return map[string]any{ - "firstBuild": p.errorLinks.firstBuild, - "closedIssueURL": p.errorLinks.closedIssueURL, - "previousBuilds": p.errorLinks.previousBuilds, - } +func (b *buildError) DescriptionData() map[string]any { + return b.errorLinks.Data() } -func (p *buildError) Labels() []string { +func (b *buildError) Labels() []string { return []string{buildReportingTeamLabel} } diff --git a/dev/testsreporter/dataerror.go b/dev/testsreporter/dataerror.go new file mode 100644 index 00000000000..d14e525c78c --- /dev/null +++ b/dev/testsreporter/dataerror.go @@ -0,0 +1,44 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package testsreporter + +import ( + "fmt" + "strings" +) + +type dataError struct { + errorLinks + serverless bool + serverlessProject string + logsDB bool + stackVersion string +} + +func (d *dataError) String() string { + var sb strings.Builder + + if d.logsDB { + sb.WriteString("[LogsDB] ") + } + if d.serverless { + sb.WriteString(fmt.Sprintf("[Serverless %s] ", d.serverlessProject)) + } + if d.stackVersion != "" { + sb.WriteString("[Stack ") + sb.WriteString(d.stackVersion) + sb.WriteString("] ") + } + return sb.String() +} + +func (d *dataError) Data() map[string]any { + return map[string]any{ + "stackVersion": d.stackVersion, + "serverless": d.serverless, + "serverlessProject": d.serverlessProject, + "logsDB": d.logsDB, + } +} diff --git a/dev/testsreporter/errorlinks.go b/dev/testsreporter/errorlinks.go new file mode 100644 index 00000000000..f4f426ec8ad --- /dev/null +++ b/dev/testsreporter/errorlinks.go @@ -0,0 +1,20 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package testsreporter + +type errorLinks struct { + currentIssueURL string + firstBuild string + previousBuilds []string + closedIssueURL string +} + +func (e *errorLinks) Data() map[string]any { + return map[string]any{ + "firstBuild": e.firstBuild, + "closedIssueURL": e.closedIssueURL, + "previousBuilds": e.previousBuilds, + } +} diff --git a/dev/testsreporter/format_test.go b/dev/testsreporter/format_test.go index b4301d06ce6..71fdddeaa2d 100644 --- a/dev/testsreporter/format_test.go +++ b/dev/testsreporter/format_test.go @@ -36,7 +36,7 @@ func TestSummary(t *testing.T) { `, }, { - title: "summary stack version with owners wihtout data stream", + title: "summary stack version with owners without data stream", resultError: &packageError{ dataError: dataError{ stackVersion: "8.14", @@ -181,14 +181,12 @@ func TestSummary(t *testing.T) { func TestDescription(t *testing.T) { cases := []struct { title string - summary string resultError failureObserver maxLinks int expected string }{ { - title: "description error all fields", - summary: "summary", + title: "description error all fields", resultError: &packageError{ dataError: dataError{ stackVersion: "8.14", @@ -226,8 +224,7 @@ Latest failed builds: `, }, { - title: "description failure all fields", - summary: "summary", + title: "description failure all fields", resultError: &packageError{ dataError: dataError{ stackVersion: "8.14", @@ -265,8 +262,7 @@ Latest failed builds: `, }, { - title: "description no closed issue", - summary: "summary", + title: "description no closed issue", resultError: &packageError{ dataError: dataError{ stackVersion: "8.14", @@ -302,7 +298,6 @@ Latest failed builds: }, { title: "description max links", - summary: "summary", maxLinks: 2, resultError: &packageError{ dataError: dataError{ diff --git a/dev/testsreporter/packageerror.go b/dev/testsreporter/packageerror.go index aa775ed381a..09f6e649f8f 100644 --- a/dev/testsreporter/packageerror.go +++ b/dev/testsreporter/packageerror.go @@ -11,13 +11,6 @@ import ( "github.com/elastic/integrations/dev/codeowners" ) -type errorLinks struct { - currentIssueURL string - firstBuild string - previousBuilds []string - closedIssueURL string -} - type packageError struct { testCase dataError @@ -88,17 +81,7 @@ func (p *packageError) Teams() []string { func (p *packageError) String() string { var sb strings.Builder - if p.logsDB { - sb.WriteString("[LogsDB] ") - } - if p.serverless { - sb.WriteString(fmt.Sprintf("[Serverless %s] ", p.serverlessProject)) - } - if p.stackVersion != "" { - sb.WriteString("[Stack ") - sb.WriteString(p.stackVersion) - sb.WriteString("] ") - } + sb.WriteString(p.dataError.String()) sb.WriteString("[") sb.WriteString(p.packageName) sb.WriteString("] ") @@ -109,26 +92,19 @@ func (p *packageError) String() string { } func (p *packageError) SummaryData() map[string]any { - return map[string]any{ - "stackVersion": p.stackVersion, - "serverless": p.serverless, - "serverlessProject": p.serverlessProject, - "logsDB": p.logsDB, - "packageName": p.packageName, - "testName": p.Name, - "dataStream": p.dataStream, - "owners": p.teams, - } + data := p.dataError.Data() + data["packageName"] = p.packageName + data["testName"] = p.Name + data["dataStream"] = p.dataStream + data["owners"] = p.teams + return data } func (p *packageError) DescriptionData() map[string]any { - return map[string]any{ - "failure": truncateText(p.Failure, defaultMaxLengthMessages), - "error": truncateText(p.Error, defaultMaxLengthMessages), - "firstBuild": p.errorLinks.firstBuild, - "closedIssueURL": p.errorLinks.closedIssueURL, - "previousBuilds": p.errorLinks.previousBuilds, - } + data := p.errorLinks.Data() + data["failure"] = truncateText(p.Failure, defaultMaxLengthMessages) + data["error"] = truncateText(p.Error, defaultMaxLengthMessages) + return data } func (p *packageError) Labels() []string { diff --git a/dev/testsreporter/reporter.go b/dev/testsreporter/reporter.go index dcec3614923..83e4480b663 100644 --- a/dev/testsreporter/reporter.go +++ b/dev/testsreporter/reporter.go @@ -14,12 +14,20 @@ import ( type reporter struct { ghCli *ghCli maxPreviousLinks int + verbose bool } -func newReporter(ghCli *ghCli, maxPreviousLinks int) reporter { +type reporterOptions struct { + GhCli *ghCli + MaxPreviousLinks int + Verbose bool +} + +func newReporter(options reporterOptions) reporter { return reporter{ - ghCli: ghCli, - maxPreviousLinks: maxPreviousLinks, + ghCli: options.GhCli, + maxPreviousLinks: options.MaxPreviousLinks, + verbose: options.Verbose, } } @@ -57,6 +65,12 @@ func (r reporter) Report(ctx context.Context, issue *githubIssue, resultError fa fmt.Printf("Summary:\n%s", summary) fmt.Println("----") fmt.Println() + if r.verbose { + fmt.Println("---- Full Description ----") + fmt.Print(description) + fmt.Println("----") + fmt.Println() + } return r.createOrUpdateIssue(ctx, nextIssue) } diff --git a/dev/testsreporter/reporter_test.go b/dev/testsreporter/reporter_test.go index 497f6ea3095..e3993ccd4ed 100644 --- a/dev/testsreporter/reporter_test.go +++ b/dev/testsreporter/reporter_test.go @@ -201,7 +201,10 @@ func TestReporterUpdateLinks(t *testing.T) { Runner: &runner, }) - reporter := newReporter(ghCli, 5) + reporter := newReporter(reporterOptions{ + GhCli: ghCli, + MaxPreviousLinks: 5, + }) links, newIssue, err := reporter.updateLinks(context.Background(), c.issue, c.firstBuild) require.NoError(t, err) diff --git a/dev/testsreporter/testsreporter.go b/dev/testsreporter/testsreporter.go index fd33819982d..8850b7459fc 100644 --- a/dev/testsreporter/testsreporter.go +++ b/dev/testsreporter/testsreporter.go @@ -26,7 +26,8 @@ type CheckOptions struct { MaxPreviousLinks int MaxTestsReported int - DryRun bool + DryRun bool + Verbose bool } func Check(ctx context.Context, resultsPath string, options CheckOptions) error { @@ -49,11 +50,15 @@ func Check(ctx context.Context, resultsPath string, options CheckOptions) error DryRun: options.DryRun, }) - aReporter := newReporter(ghCli, options.MaxPreviousLinks) + aReporter := newReporter(reporterOptions{ + GhCli: ghCli, + MaxPreviousLinks: options.MaxPreviousLinks, + Verbose: options.Verbose, + }) if len(packageErrors) > options.MaxTestsReported { fmt.Printf("Skip creating GitHub issues, hit the maximum number (%d) of tests to be reported. Total failing tests: %d.\n", options.MaxTestsReported, len(packageErrors)) - packages, err := packagesFromTests(resultsPath, options) + packages, err := packagesFromTests(resultsPath) if err != nil { return fmt.Errorf("failed to get packages from results files: %w", err) } @@ -137,7 +142,7 @@ func errorsFromTests(resultsPath string, options CheckOptions) ([]*packageError, } // packagesFromTests returns the sorted packages failing given the results file -func packagesFromTests(resultsPath string, options CheckOptions) ([]string, error) { +func packagesFromTests(resultsPath string) ([]string, error) { packages := []string{} err := filepath.Walk(resultsPath, func(path string, info os.FileInfo, err error) error { if err != nil { diff --git a/magefile.go b/magefile.go index 5ff8fa9301a..ad670bbea3d 100644 --- a/magefile.go +++ b/magefile.go @@ -173,6 +173,11 @@ func ReportFailedTests(ctx context.Context, testResultsFolder string) error { logsDBEnabled = true } + verboseMode := false + if v, found := os.LookupEnv("VERBOSE_MODE_ENABLED"); found && v == "true" { + verboseMode = true + } + maxIssuesString := os.Getenv("CI_MAX_TESTS_REPORTED") maxIssues := defaultMaximumTestsReported if maxIssuesString != "" { @@ -201,6 +206,7 @@ func ReportFailedTests(ctx context.Context, testResultsFolder string) error { MaxPreviousLinks: defaultPreviousLinksNumber, MaxTestsReported: maxIssues, DryRun: dryRun, + Verbose: verboseMode, } return testsreporter.Check(ctx, testResultsFolder, options) }