GoogleContainerTools/skaffold · error

cannot parse the release name template

Error message

cannot parse the release name template: %w

What it means

Wraps util.ExpandEnvTemplateOrFail failure when expanding the release `name` template during Cleanup. Release names are Go/env templates; if they reference undefined env variables or have invalid template syntax, Cleanup cannot compute which release to delete.

Solutions

  1. Export the env var referenced by the release name template before running skaffold delete/cleanup
  2. Fix template syntax in the release name in skaffold.yaml
  3. Use `skaffold render` or a dry run to see the expanded name and compare with what was deployed

Example fix

// before
export ARGS=""
skaffold delete
// after
export RELEASE_TAG="v1.2.3"   # var used in release name template
skaffold delete
Defensive patterns

Strategy: validation

Validate before calling

for _, r := range releases {
  if _, err := texttemplate.New("t").Parse(r.Name); err != nil {
    return fmt.Errorf("bad release name template %q: %w", r.Name, err)
  }
  for _, m := range varRegex.FindAllStringSubmatch(r.Name, -1) {
    if os.Getenv(m[1]) == "" { return fmt.Errorf("env var %s unset", m[1]) }
  }
}

Prevention

When it happens

Trigger: Calling Cleanup when a release name contains {{.VAR}} for an unset variable, or malformed template syntax like {{.Name (unclosed).

Common situations: CI environments missing env vars used in the release name template; typos in template placeholders; shell escaping dropping the variable.

Related errors


AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05). Data as JSON: /api/errors/092bc8ad0b4ca549. Report an issue: GitHub.

Appendix: source

Thrown at pkg/skaffold/deploy/helm/helm.go:456

		if err := walk.From(expandedPath).When(isDep).AppendPaths(&deps); err != nil {
			return deps, helm.UserErr("issue walking releases", err)
		}
	}
	sort.Strings(deps)
	return deps, nil
}

// Cleanup deletes what was deployed by calling Deploy.
func (h *Deployer) Cleanup(ctx context.Context, out io.Writer, dryRun bool, _ manifest.ManifestListByConfig) error {
	instrumentation.AddAttributesToCurrentSpanFromContext(ctx, map[string]string{
		"DeployerType": "helm",
	})

	var errMsgs []string
	for _, r := range h.Releases {
		releaseName, err := util.ExpandEnvTemplateOrFail(r.Name, nil)
		if err != nil {
			return fmt.Errorf("cannot parse the release name template: %w", err)
		}

		namespace, err := helm.ReleaseNamespace(h.namespace, r)
		if err != nil {
			return err
		}
		args := []string{}
		if dryRun {
			args = append(args, "get", "manifest")
		} else {
			args = append(args, "delete")
		}
		args = append(args, releaseName)

		if namespace != "" {
			args = append(args, "--namespace", namespace)
		}
		if err := helm.Exec(ctx, h, out, false, nil, args...); err != nil {

View on GitHub (pinned to a1189de023)