From 90a50ca1343ebfb9927b9a9c21b148a49f53eba6 Mon Sep 17 00:00:00 2001 From: Joshua Hoblitt Date: Mon, 25 Mar 2024 15:54:38 -0700 Subject: [PATCH] (WIP) (gha) add helm chart lint --- .github/workflows/chart-lint.yaml | 21 ++++++++ utils/chart-lint.go | 82 +++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 .github/workflows/chart-lint.yaml create mode 100644 utils/chart-lint.go diff --git a/.github/workflows/chart-lint.yaml b/.github/workflows/chart-lint.yaml new file mode 100644 index 000000000..7a42827e6 --- /dev/null +++ b/.github/workflows/chart-lint.yaml @@ -0,0 +1,21 @@ +--- +# yamllint disable rule:quoted-strings +name: helm chart lint + +"on": + - push + +jobs: + fleet-symlinks: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: azure/setup-helm@v4.1.0 + + - name: Set up Go + uses: actions/setup-go@v3 + with: + go-version: 1.21 + + - name: helm chart lint + run: go run ./utils/chart-lint.go diff --git a/utils/chart-lint.go b/utils/chart-lint.go new file mode 100644 index 000000000..a44817949 --- /dev/null +++ b/utils/chart-lint.go @@ -0,0 +1,82 @@ +package main + +import ( + "fmt" + "log" + "os" + "os/exec" + "path/filepath" +) + +func main() { + // recursively find Chart.yaml files + charts, err := findChartDirs(".") + if err != nil { + fmt.Println("Error:", err) + log.Fatal(err) + } + + fmt.Println("Found", len(charts), "charts") + fmt.Println(charts) + + // convert chart paths to absolute paths + for i, chart := range charts { + absPath, err := filepath.Abs(chart) + if err != nil { + fmt.Println("Error:", err) + log.Fatal(err) + } + charts[i] = absPath + } + + chartErrors := 0 + + // for each Chart.yaml file, run helm lint + for _, chart := range charts { + fmt.Println("Linting", chart) + + // cd to chart dir + err := os.Chdir(chart) + if err != nil { + fmt.Println("Error:", err) + log.Fatal(err) + } + + // run helm lint + cmd := exec.Command("helm", "lint") + out, err := cmd.CombinedOutput() + if err != nil { + fmt.Println("Error blah:", string(out)) + chartErrors++ + continue + } + } + + // report total number of errors + fmt.Println("Total errors:", chartErrors) + if chartErrors > 0 { + os.Exit(1) + } +} + +func findChartDirs(path string) ([]string, error) { + charts := []string{} + + err := filepath.Walk(path, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + // skip directories + if info.IsDir() { + return nil + } + // check if file is Chart.yaml + if info.Name() == "Chart.yaml" { + // then asssume that this is a chart directory + dir := filepath.Dir(path) + charts = append(charts, dir) + } + return nil + }) + return charts, err +}