diff --git a/.gitignore b/.gitignore index b70c4600..0d642bd1 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,7 @@ csctl csctl-docker tmp/ releases/ +.tmp +.release +.envrc +dist/ diff --git a/pkg/cmd/create.go b/pkg/cmd/create.go index 4f67983f..842548cc 100644 --- a/pkg/cmd/create.go +++ b/pkg/cmd/create.go @@ -220,12 +220,23 @@ func (c *CreateOptions) generateRelease() error { } // Build all the templated output and put it in a tmp directory - if err := template.GenerateOutputFromTemplate(c.ClusterStackPath, "./tmp/", &c.Metadata); err != nil { + if err := template.GenerateOutputFromTemplate(c.ClusterStackPath, "./.tmp/", &c.Metadata); err != nil { return fmt.Errorf("failed to generate tmp output: %w", err) } + // Overwrite ClusterAddonVersion in cluster-addon/*/Chart.yaml + if err := overwriteClusterAddonVersion("./.tmp", c.Metadata.Versions.Components.ClusterAddon); err != nil { + return fmt.Errorf("failed to overwrite ClusterAddonVersion in tmp output: %w", err) + } + + // Overwrite ClusterClassVersion in cluster-class/Chart.yaml + clusterClassChartYaml := "./.tmp/cluster-class/Chart.yaml" + if err := overwriteVersionInFile(clusterClassChartYaml, c.Metadata.Versions.ClusterStack); err != nil { + return fmt.Errorf("failed to overwrite ClusterClassVersion in %s output: %w", clusterClassChartYaml, err) + } + // Package Helm from the tmp directory to the release directory - if err := template.CreatePackage("./tmp/", c.ClusterStackReleaseDir); err != nil { + if err := template.CreatePackage("./.tmp/", c.ClusterStackReleaseDir); err != nil { return fmt.Errorf("failed to create template package: %w", err) } @@ -264,3 +275,52 @@ func (c *CreateOptions) generateRelease() error { } return nil } + +func overwriteClusterAddonVersion(tmpDir, clusterAddonVersion string) error { + g := filepath.Join(tmpDir, "cluster-addon", "Chart.yaml") + files, err := filepath.Glob(g) + if err != nil { + return fmt.Errorf("glob for %s failed: %w", g, err) + } + + for _, chartYaml := range files { + err := overwriteVersionInFile(chartYaml, clusterAddonVersion) + if err != nil { + return fmt.Errorf("failed to replace version in %s: %w", chartYaml, err) + } + } + return nil +} + +// overwriteVersionInFile replaces "version: v123" with newVersion. +func overwriteVersionInFile(chartYaml, newVersion string) error { + chartYaml = filepath.Clean(chartYaml) + data, err := os.ReadFile(chartYaml) + if err != nil { + return fmt.Errorf("reading file failed: %w", err) + } + + m := make(map[string]interface{}) + err = yaml.Unmarshal(data, m) + if err != nil { + return fmt.Errorf("failed parsing: %w", err) + } + + v := m["version"] + oldVersion, ok := v.(string) + if !ok { + return fmt.Errorf("failed to read version in yaml") + } + + m["version"] = newVersion + fmt.Printf("%s updating version from %s to %s\n", chartYaml, oldVersion, newVersion) + out, err := yaml.Marshal(m) + if err != nil { + return fmt.Errorf("failed creating yaml: %w", err) + } + err = os.WriteFile(chartYaml, out, 0o600) + if err != nil { + return fmt.Errorf("failed write yaml to file: %w", err) + } + return nil +} diff --git a/tests/cluster-stacks/docker/ferrol/cluster-addon/Chart.yaml b/tests/cluster-stacks/docker/ferrol/cluster-addon/Chart.yaml index d602f4aa..f9052c6a 100644 --- a/tests/cluster-stacks/docker/ferrol/cluster-addon/Chart.yaml +++ b/tests/cluster-stacks/docker/ferrol/cluster-addon/Chart.yaml @@ -11,4 +11,5 @@ maintainers: url: https://github.com/syself name: docker-ferrol-1-27-cluster-addon type: application -version: << .ClusterAddonVersion >> +# version will be overwritten by csctl +version: v0 diff --git a/tests/cluster-stacks/docker/ferrol/cluster-class/Chart.yaml b/tests/cluster-stacks/docker/ferrol/cluster-class/Chart.yaml index d4bee53c..aa1c94b8 100644 --- a/tests/cluster-stacks/docker/ferrol/cluster-class/Chart.yaml +++ b/tests/cluster-stacks/docker/ferrol/cluster-class/Chart.yaml @@ -6,4 +6,5 @@ maintainers: url: https://github.com/syself name: docker-ferrol-1-27-cluster-class type: application -version: << .ClusterClassVersion >> +# version will be overwritten by csctl +version: v0