-
Notifications
You must be signed in to change notification settings - Fork 451
/
main.go
79 lines (66 loc) · 1.9 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Gardener contributors
//
// SPDX-License-Identifier: Apache-2.0
package main
import (
"fmt"
"io/fs"
"os"
"path/filepath"
"github.com/onsi/ginkgo/v2/reporters"
"github.com/spf13/cobra"
)
func main() {
const short = "Merge and cleanup junit.xml files generated by ginkgo test suites"
cmd := &cobra.Command{
Use: "report-collector destination_file [source_dir]",
Short: short,
Long: short + `
report-collector is supposed to run after tests suites have been executed using --ginkgo.junit-report=junit.xml.
It merges all junit.xml files generated by ginkgo test suites under source_dir (or $PWD by default) into a single
file at destination_file and cleans up the original report files.
The tool reuses code from the ginkgo CLI which accomplishes exactly this. It is used for bridging the gap between
performant parallel test execution via go test and automated report collection via ginkgo.
(see https://github.com/gardener/gardener/pull/5784)
`,
Args: cobra.MinimumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
dest := args[0]
var src string
if len(args) > 1 {
src = args[1]
} else {
pwd, err := os.Getwd()
if err != nil {
return err
}
src = pwd
}
// find junit.xml files
var matches []string
if err := filepath.Walk(src, func(path string, info fs.FileInfo, err error) error {
switch filepath.Base(path) {
case "junit.xml":
matches = append(matches, path)
return nil
}
return nil
}); err != nil {
return err
}
if len(matches) == 0 {
fmt.Println("no junit.xml files found")
return nil
}
// merge and cleanup
messages, err := reporters.MergeAndCleanupJUnitReports(matches, dest)
for _, message := range messages {
fmt.Println(message)
}
return err
},
}
if err := cmd.Execute(); err != nil {
panic(err)
}
}