Skip to content

Commit 0efe7e2

Browse files
refactor: change jq expression to golang script
1 parent 2a259f1 commit 0efe7e2

File tree

12 files changed

+288
-8
lines changed

12 files changed

+288
-8
lines changed

.github/actions/generate-chart-matrix/action.yml

+3-8
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,10 @@ runs:
3636
3737
ls -d ${{ inputs.charts-path }} | while read chart_dir; do
3838
if [[ $(echo ${ALL_MODIFIED_FILES} | grep "${chart_dir}") ]]; then
39-
camunda_version="$(basename ${chart_dir} | sed 's/camunda-platform-//')";
40-
echo "Camunda version: ${camunda_version}"
41-
chart_version="$(cat ${chart_dir}/Chart.yaml | grep '^version:' | head -n 1 | sed 's/version: //')";
42-
chart_previous_camunda_version="$(echo ${camunda_version} | jq '. | (((.|tonumber) - .1)*10|round/10)')"
43-
chart_previous_helm_version="$(cat charts/camunda-platform-${chart_previous_camunda_version}/Chart.yaml | grep '^version:' | head -n 1 | sed 's/version: //')"
44-
echo "${camunda_version} ${chart_version} ${chart_previous_helm_version}" >> matrix_versions.txt;
39+
echo ${chart_dir} >> matrix_versions.txt
4540
fi
4641
done
4742
48-
matrix="$(cat matrix_versions.txt | jq --slurp --compact-output --raw-input '[ split("\n") | .[] | split(" ") | { version: .[0], chartVersion: .[1], previousHelmVersion: .[2] } | select(.version != null)] ')"
49-
43+
cd scripts/generate-gha-matrix/
44+
matrix="$(cat ../../matrix_versions.txt | go run .)"
5045
echo "matrix=${matrix}" | tee -a $GITHUB_OUTPUT

scripts/generate-gha-matrix/Makefile

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
PHONY: test
3+
4+
build:
5+
go build
6+
7+
run:
8+
go run .
9+
10+
test:
11+
go test *.go

scripts/generate-gha-matrix/errors.go

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
type ProcessError string
8+
9+
func (e ProcessError) Error() string {
10+
return "process: " + string(e)
11+
}
12+
13+
func ProcessErrorf(msg string, args ...interface{}) error {
14+
return ProcessError(fmt.Sprintf(msg, args...))
15+
}
16+
17+
type VersionParsingError string
18+
19+
func (e VersionParsingError) Error() string {
20+
return "versions: " + string(e)
21+
}
22+
23+
func VersionParsingErrorf(msg string, args ...interface{}) error {
24+
return VersionParsingError(fmt.Sprintf(msg, args...))
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
)
7+
8+
/*
9+
This script accepts input piped into it and outputs a github-actions readable
10+
matrix of tests to run.
11+
12+
ex: echo charts/camunda-platform-8.3 charts/camunda-platform-8.4 charts/camunda-platform-8.8 | go run . | jq
13+
*/
14+
func main() {
15+
input := parseInput()
16+
17+
output, err := processInputs(input)
18+
if err != nil {
19+
panic(err)
20+
}
21+
22+
final, err := json.Marshal(output)
23+
if err != nil {
24+
panic(err)
25+
}
26+
fmt.Println(string(final))
27+
}

scripts/generate-gha-matrix/go.mod

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module main
2+
3+
go 1.23.7
4+
5+
require (
6+
github.com/Masterminds/semver/v3 v3.3.0 // indirect
7+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
8+
github.com/pkg/errors v0.9.1 // indirect
9+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
10+
github.com/stretchr/testify v1.10.0 // indirect
11+
golang.org/x/mod v0.24.0 // indirect
12+
gopkg.in/yaml.v3 v3.0.1 // indirect
13+
helm.sh/helm/v3 v3.17.3 // indirect
14+
sigs.k8s.io/yaml v1.4.0 // indirect
15+
)

scripts/generate-gha-matrix/go.sum

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
2+
github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
3+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
4+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
6+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
7+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
8+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
9+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
10+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
11+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
12+
golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
13+
golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
14+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
15+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
16+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
17+
helm.sh/helm/v3 v3.17.3 h1:3n5rW3D0ArjFl0p4/oWO8IbY/HKaNNwJtOQFdH2AZHg=
18+
helm.sh/helm/v3 v3.17.3/go.mod h1:+uJKMH/UiMzZQOALR3XUf3BLIoczI2RKKD6bMhPh4G8=
19+
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
20+
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=

scripts/generate-gha-matrix/inputs.go

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"os"
6+
)
7+
8+
func parseInput() Input {
9+
stdinReader := bufio.NewReader(os.Stdin)
10+
scanner := bufio.NewScanner(stdinReader)
11+
scanner.Split(bufio.ScanWords)
12+
13+
var input Input
14+
for scanner.Scan() {
15+
input.HelmChartModifiedDirectories = append(input.HelmChartModifiedDirectories, scanner.Text())
16+
}
17+
return input
18+
}
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package main
2+
3+
import (
4+
"helm.sh/helm/v3/pkg/chart/loader"
5+
)
6+
7+
func processInputs(input Input) ([]Output, error) {
8+
var output []Output
9+
for _, modifiedDir := range input.HelmChartModifiedDirectories {
10+
chart, err := loader.Load("../../" + modifiedDir)
11+
if err != nil {
12+
return nil, ProcessErrorf("failed to load chart for modified dir %s : %s", modifiedDir, err)
13+
}
14+
15+
version := getCamundaVersion(chart)
16+
previousVersionMajor, err := getPreviousHelmChartVersion(chart, version)
17+
if err != nil {
18+
return nil, ProcessErrorf("failed to get previous helm chart metadata for version %s : %s", version, err)
19+
}
20+
21+
matrixRunVector := Output{
22+
CamundaVersion: version,
23+
HelmChartVersion: chart.Metadata.Version,
24+
PreviousHelmChartVersion: previousVersionMajor,
25+
}
26+
27+
output = append(output, matrixRunVector)
28+
}
29+
return output, nil
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package main
2+
3+
import (
4+
"github.com/stretchr/testify/require"
5+
"testing"
6+
)
7+
8+
func TestProcess(t *testing.T) {
9+
inputs := Input{
10+
HelmChartModifiedDirectories: []string{"charts/camunda-platform-8.8"},
11+
}
12+
13+
outputs, err := processInputs(inputs)
14+
require.NoError(t, err)
15+
16+
require.Len(t, outputs, 1)
17+
require.Contains(t, outputs[0].CamundaVersion, "8.8")
18+
require.Contains(t, outputs[0].HelmChartVersion, "13")
19+
require.Contains(t, outputs[0].PreviousHelmChartVersion, "12")
20+
}
21+
22+
func TestProcessInvalidChartDir(t *testing.T) {
23+
inputs := Input{
24+
HelmChartModifiedDirectories: []string{"charts/invalid"},
25+
}
26+
27+
outputs, err := processInputs(inputs)
28+
require.NotNil(t, err)
29+
require.Nil(t, outputs)
30+
}

scripts/generate-gha-matrix/types.go

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package main
2+
3+
type Input struct {
4+
HelmChartModifiedDirectories []string
5+
}
6+
7+
type Output struct {
8+
CamundaVersion string `json:"version"`
9+
HelmChartVersion string `json:"chartVersion"`
10+
PreviousHelmChartVersion string `json:"previousHelmVersion"`
11+
}
+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import (
4+
"golang.org/x/mod/semver"
5+
"helm.sh/helm/v3/pkg/chart"
6+
"helm.sh/helm/v3/pkg/chart/loader"
7+
"strconv"
8+
"strings"
9+
)
10+
11+
func getCamundaVersion(chart *chart.Chart) string {
12+
var version string
13+
if chart.Values["zeebe"] == nil {
14+
version = "v" + chart.Values["core"].(map[string]interface{})["image"].(map[string]interface{})["tag"].(string)
15+
} else {
16+
version = "v" + chart.Values["zeebe"].(map[string]interface{})["image"].(map[string]interface{})["tag"].(string)
17+
}
18+
camundaVersionParsed := semver.MajorMinor(version)
19+
camundaVersionParsed = strings.TrimPrefix(camundaVersionParsed, "v")
20+
return camundaVersionParsed
21+
}
22+
23+
func getPreviousHelmChartVersion(chart *chart.Chart, version string) (string, error) {
24+
camundaVersionFloat, err := strconv.ParseFloat(version, 64)
25+
if err != nil {
26+
return "", VersionParsingErrorf("failed to parse version from input: %s", err)
27+
}
28+
previousVersionFloat := (camundaVersionFloat*10 - 1) / 10
29+
previousCamundaVersion := strconv.FormatFloat(previousVersionFloat, 'f', -1, 64)
30+
previousChart, err := loader.Load("../../charts/camunda-platform-" + previousCamundaVersion)
31+
if err != nil {
32+
return "", VersionParsingErrorf("failed to load the previous chart: %s", err)
33+
}
34+
previousChartVersionSemver := "v" + previousChart.Metadata.Version
35+
previousVersionMajor := semver.Major(previousChartVersionSemver)
36+
previousVersionMajor = strings.TrimPrefix(previousVersionMajor, "v")
37+
return previousVersionMajor, nil
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package main
2+
3+
import (
4+
"github.com/stretchr/testify/require"
5+
"helm.sh/helm/v3/pkg/chart/loader"
6+
"regexp"
7+
"testing"
8+
)
9+
10+
var validVersionRegex = regexp.MustCompile(`^\d+\.\d+$`)
11+
12+
func TestGetCamundaVersionPre88(t *testing.T) {
13+
chart, err := loader.Load("../../charts/camunda-platform-8.6")
14+
require.NoError(t, err)
15+
16+
version := getCamundaVersion(chart)
17+
valid := validVersionRegex.MatchString(version)
18+
19+
require.True(t, valid)
20+
}
21+
22+
func TestGetCamundaVersionPost88(t *testing.T) {
23+
chart, err := loader.Load("../../charts/camunda-platform-8.8")
24+
require.NoError(t, err)
25+
26+
version := getCamundaVersion(chart)
27+
valid := validVersionRegex.MatchString(version)
28+
29+
require.True(t, valid)
30+
}
31+
32+
func TestGetPreviousChart(t *testing.T) {
33+
chart, err := loader.Load("../../charts/camunda-platform-8.8")
34+
require.NoError(t, err)
35+
36+
version := getCamundaVersion(chart)
37+
previousVersion, err := getPreviousHelmChartVersion(chart, version)
38+
require.NoError(t, err)
39+
require.Equal(t, "12", previousVersion)
40+
}
41+
42+
func TestGetPreviousChartInvalidVersion(t *testing.T) {
43+
chart, err := loader.Load("../../charts/camunda-platform-8.8")
44+
require.NoError(t, err)
45+
46+
version := "badversion"
47+
_, err = getPreviousHelmChartVersion(chart, version)
48+
require.NotNil(t, err)
49+
require.Contains(t, err.Error(), "invalid syntax")
50+
}
51+
52+
func TestGetPreviousChartChartTooOld(t *testing.T) {
53+
chart, err := loader.Load("../../charts/camunda-platform-8.2")
54+
require.NoError(t, err)
55+
56+
version := getCamundaVersion(chart)
57+
_, err = getPreviousHelmChartVersion(chart, version)
58+
require.NotNil(t, err)
59+
require.Contains(t, err.Error(), "failed to load the previous chart")
60+
}

0 commit comments

Comments
 (0)