GoogleContainerTools/skaffold · error

release %s depends on non-existent release %s

Error message

release %s depends on non-existent release %s

What it means

After collecting release names, `NewDependencyGraph` verifies every entry in a release's `dependsOn` list refers to an existing release in the config. A dependency pointing to a release that is not defined causes this error, since the ordering cannot be satisfied.

Source

Thrown at pkg/skaffold/deploy/helm/dependencygraph.go:49

// NewDependencyGraph creates a new DependencyGraph from a list of helm releases
func NewDependencyGraph(releases []latest.HelmRelease) (*DependencyGraph, error) {
	graph := make(map[string][]string)
	releaseNames := make(map[string]bool)

	for _, r := range releases {
		if _, exists := releaseNames[r.Name]; exists {
			return nil, fmt.Errorf("duplicate release name %s", r.Name)
		}
		releaseNames[r.Name] = true
	}

	// Check for non-existent dependencies
	hasDependencies := false
	for _, r := range releases {
		for _, dep := range r.DependsOn {
			if !releaseNames[dep] {
				return nil, fmt.Errorf("release %s depends on non-existent release %s", r.Name, dep)
			}
			hasDependencies = true
		}
		graph[r.Name] = r.DependsOn
	}

	g := &DependencyGraph{
		graph:           graph,
		releases:        releases,
		hasDependencies: hasDependencies,
	}

	if err := g.hasCycles(); err != nil {
		return nil, err
	}

	return g, nil
}

View on GitHub (pinned to a1189de023)

Solutions

  1. Add the missing release definition to `deploy.helm.releases`
  2. Fix the typo in the release's `dependsOn` entry so it exactly matches an existing release name
  3. Remove the stale dependsOn entry if the dependency release is no longer needed

Example fix

// before
releases:
  - name: app
    dependsOn: ["databse"]
  - name: database
    chartPath: charts/db

// after
releases:
  - name: app
    dependsOn: ["database"]
  - name: database
    chartPath: charts/db
Defensive patterns

Strategy: validation

Validate before calling

names := map[string]bool{}
for _, r := range cfg.Deploy.Helm.Releases {
    names[r.Name] = true
}
for _, r := range cfg.Deploy.Helm.Releases {
    for _, dep := range r.DependsOn {
        if !names[dep] {
            return fmt.Errorf("release %s depends on non-existent release %s", r.Name, dep)
        }
    }
}

Prevention

When it happens

Trigger: A release in `deploy.helm.releases` lists a `dependsOn` value that does not match any sibling release's `name` (typo or omitted release definition).

Common situations: Typo in dependsOn name; dependency release removed from config while dependsOn entries left behind; case-mismatch in release names.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


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