diff --git a/.github/workflows/test-unit.yaml b/.github/workflows/test-unit.yaml index ef82911e2..33e9459df 100644 --- a/.github/workflows/test-unit.yaml +++ b/.github/workflows/test-unit.yaml @@ -14,8 +14,36 @@ env: jobs: + generate-packages: + name: List Go Packages + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Go ${{ env.GO_VERSION }} + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + check-latest: true + + - name: Generate matrix + id: set-matrix + run: | + matrix_output=$(go run ./internal/testsci/genmatrix.go) + echo "$matrix_output" + echo "$matrix_output" >> $GITHUB_OUTPUT + test-unit: runs-on: ubuntu-latest + needs: generate-packages + strategy: + matrix: + package: ${{ fromJson(needs.generate-packages.outputs.matrix) }} steps: - name: Check out code @@ -33,7 +61,8 @@ jobs: run: touch webui/static/index.html - name: Tests - run: make test-unit + run: | + go test -v -parallel 8 ${{ matrix.package.group }} test-ui-unit: runs-on: ubuntu-latest diff --git a/internal/testsci/genmatrix.go b/internal/testsci/genmatrix.go new file mode 100644 index 000000000..3c0f82775 --- /dev/null +++ b/internal/testsci/genmatrix.go @@ -0,0 +1,66 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "strings" + + "github.com/traefik/traefik/v2/pkg/log" + "golang.org/x/tools/go/packages" +) + +const groupCount = 12 + +type group struct { + Group string `json:"group"` +} + +func main() { + logger := log.WithoutContext() + + cfg := &packages.Config{ + Mode: packages.NeedName, + Dir: ".", + } + + pkgs, err := packages.Load(cfg, "./cmd/...", "./pkg/...") + if err != nil { + logger.Fatalf("Loading packages: %v", err) + } + + var packageNames []string + for _, pkg := range pkgs { + if pkg.PkgPath != "" { + packageNames = append(packageNames, pkg.PkgPath) + } + } + + total := len(packageNames) + perGroup := (total + groupCount - 1) / groupCount + + fmt.Fprintf(os.Stderr, "Total packages: %d\n", total) + fmt.Fprintf(os.Stderr, "Packages per group: %d\n", perGroup) + + var matrix []group + for i := range groupCount { + start := i * perGroup + end := start + perGroup + if start >= total { + break + } + if end > total { + end = total + } + g := strings.Join(packageNames[start:end], " ") + matrix = append(matrix, group{Group: g}) + } + + jsonBytes, err := json.Marshal(matrix) + if err != nil { + logger.Fatalf("Failed to marshal matrix: %v", err) + } + + // Output for GitHub Actions + fmt.Printf("matrix=%s\n", string(jsonBytes)) +}