diff --git a/pkg/chart/chart.go b/pkg/chart/chart.go index 5b19bb3b..0ae6c876 100644 --- a/pkg/chart/chart.go +++ b/pkg/chart/chart.go @@ -207,24 +207,29 @@ func (c *Chart) HasCIValuesFile(path string) bool { } // CreateInstallParams generates a randomized release name and namespace based on the chart path -// and optional buildID. If release_name is specified, the release name is set to that string instead. +// and optional buildID. If releaseName is non-empty it is used verbatim as the release name +// (Helm validates release-name syntax); otherwise a randomized "-" form is used. // If a buildID is specified, it will be part of the generated namespace. func (c *Chart) CreateInstallParams(buildID string, releaseName string) (release string, namespace string) { release = filepath.Base(c.Path()) if release == "." || release == "/" { - if releaseName != "" { - release = releaseName - } else { - yaml := c.Yaml() - release = yaml.Name - } + yaml := c.Yaml() + release = yaml.Name } namespace = release if buildID != "" { namespace = fmt.Sprintf("%s-%s", namespace, buildID) } randomSuffix := util.RandomString(10) - release = util.SanitizeName(fmt.Sprintf("%s-%s", release, randomSuffix), maxNameLength) + if releaseName != "" { + // An explicit --release-name is used verbatim so the release name is + // stable and predictable. Previously it was honored only when the chart + // path resolved to "." or "/", and a random suffix was appended + // unconditionally, which made --release-name appear to be ignored (#198). + release = releaseName + } else { + release = util.SanitizeName(fmt.Sprintf("%s-%s", release, randomSuffix), maxNameLength) + } namespace = util.SanitizeName(fmt.Sprintf("%s-%s", namespace, randomSuffix), maxNameLength) return } diff --git a/pkg/chart/chart_test.go b/pkg/chart/chart_test.go index b95dd9ee..2b3246fa 100644 --- a/pkg/chart/chart_test.go +++ b/pkg/chart/chart_test.go @@ -569,3 +569,23 @@ func TestChart_AdditionalCommandsAreRun(t *testing.T) { }) } } + +func TestChart_CreateInstallParams(t *testing.T) { + chrt, err := NewChart("test_charts/simple-deployment") + assert.Nil(t, err) + + // An explicit release name (--release-name) must be used verbatim, with no + // random suffix appended, so the resulting release name is stable and + // predictable (#198). + release, namespace := chrt.CreateInstallParams("build-id", "my-release") + assert.Equal(t, "my-release", release) + // The namespace is still derived from the chart directory and randomized, + // independent of --release-name. + assert.True(t, strings.HasPrefix(namespace, "simple-deployment-build-id-")) + assert.NotEqual(t, "my-release", namespace) + + // Without a release name the release keeps its historical randomized form. + release, _ = chrt.CreateInstallParams("", "") + assert.True(t, strings.HasPrefix(release, "simple-deployment-")) + assert.NotEqual(t, "simple-deployment", release) +}