GoogleContainerTools/skaffold · error

unable to get releases by level: %w

Error message

unable to get releases by level: %w

What it means

Wraps GetReleasesByLevel failure while topologically sorting the release dependency graph during Deploy. This happens when the graph built from helm.releases contains a cycle, making level (wave) ordering impossible.

Source

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

	}

	childCtx, endTrace := instrumentation.StartTrace(ctx, "Deploy_LoadImages")
	if err := h.imageLoader.LoadImages(childCtx, out, h.localImages, h.originalImages, builds); err != nil {
		endTrace(instrumentation.TraceEndError(err))
		return err
	}
	endTrace()

	olog.Entry(ctx).Infof("Deploying with helm v%s ...", h.helmVersion)

	dependencyGraph, err := NewDependencyGraph(h.Releases)
	if err != nil {
		return fmt.Errorf("unable to create dependency graph: %w", err)
	}

	levelByLevelReleases, err := dependencyGraph.GetReleasesByLevel()
	if err != nil {
		return fmt.Errorf("unable to get releases by level: %w", err)
	}

	var mu sync2.Mutex
	nsMap := map[string]struct{}{}
	manifests := manifest.ManifestList{}

	concurrency := 1
	if h.Concurrency != nil {
		if *h.Concurrency == 0 {
			concurrency = -1 // unlimited
		} else {
			concurrency = *h.Concurrency
		}
	}

	if concurrency == 1 {
		olog.Entry(ctx).Infof("Installing %d releases sequentially", len(h.Releases))
	} else {

View on GitHub (pinned to a1189de023)

Solutions

  1. Break the cycle in helm.releases chartDependency entries
  2. Remove a release's chartDependency that points back at an ancestor
  3. Validate the dependency chain manually with a diagram before deploying
Defensive patterns

Strategy: validation

Validate before calling

// reuse the same cycle-detection as error 221; ensure indegree-0 releases exist
hasRoot := false
for _, r := range releases {
  if len(r.ChartDependency) == 0 { hasRoot = true }
}
if !hasRoot { return errors.New("no release without dependencies: cycle present") }

Prevention

When it happens

Trigger: Calling Deploy with releases whose chartDependency links form a cycle after NewDependencyGraph succeeded structurally but topological sort detects no zero-indegree nodes.

Common situations: Mutual or self chartDependency references in skaffold.yaml; programmatically generated release lists creating loops.

Related errors


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