{"record":{"id":"ba72694a9bfeca60","repo":"GoogleContainerTools/skaffold","slug":"release-s-depends-on-non-existent-release-s","errorCode":null,"errorMessage":"release %s depends on non-existent release %s","messagePattern":"release (.+?) depends on non-existent release (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/deploy/helm/dependencygraph.go","lineNumber":49,"sourceCode":"\n// NewDependencyGraph creates a new DependencyGraph from a list of helm releases\nfunc NewDependencyGraph(releases []latest.HelmRelease) (*DependencyGraph, error) {\n\tgraph := make(map[string][]string)\n\treleaseNames := make(map[string]bool)\n\n\tfor _, r := range releases {\n\t\tif _, exists := releaseNames[r.Name]; exists {\n\t\t\treturn nil, fmt.Errorf(\"duplicate release name %s\", r.Name)\n\t\t}\n\t\treleaseNames[r.Name] = true\n\t}\n\n\t// Check for non-existent dependencies\n\thasDependencies := false\n\tfor _, r := range releases {\n\t\tfor _, dep := range r.DependsOn {\n\t\t\tif !releaseNames[dep] {\n\t\t\t\treturn nil, fmt.Errorf(\"release %s depends on non-existent release %s\", r.Name, dep)\n\t\t\t}\n\t\t\thasDependencies = true\n\t\t}\n\t\tgraph[r.Name] = r.DependsOn\n\t}\n\n\tg := &DependencyGraph{\n\t\tgraph:           graph,\n\t\treleases:        releases,\n\t\thasDependencies: hasDependencies,\n\t}\n\n\tif err := g.hasCycles(); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn g, nil\n}","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/deploy/helm/dependencygraph.go#L31-L67","documentation":"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.","triggerScenarios":"A release in `deploy.helm.releases` lists a `dependsOn` value that does not match any sibling release's `name` (typo or omitted release definition).","commonSituations":"Typo in dependsOn name; dependency release removed from config while dependsOn entries left behind; case-mismatch in release names.","solutions":["Add the missing release definition to `deploy.helm.releases`","Fix the typo in the release's `dependsOn` entry so it exactly matches an existing release name","Remove the stale dependsOn entry if the dependency release is no longer needed"],"exampleFix":"// before\nreleases:\n  - name: app\n    dependsOn: [\"databse\"]\n  - name: database\n    chartPath: charts/db\n\n// after\nreleases:\n  - name: app\n    dependsOn: [\"database\"]\n  - name: database\n    chartPath: charts/db","handlingStrategy":"validation","validationCode":"names := map[string]bool{}\nfor _, r := range cfg.Deploy.Helm.Releases {\n    names[r.Name] = true\n}\nfor _, r := range cfg.Deploy.Helm.Releases {\n    for _, dep := range r.DependsOn {\n        if !names[dep] {\n            return fmt.Errorf(\"release %s depends on non-existent release %s\", r.Name, dep)\n        }\n    }\n}\n","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep dependsOn lists in sync with the releases block whenever adding/removing releases","Match release names exactly (case-sensitive); avoid manual string typos","Validate helm release dependency references in CI config checks"],"tags":["helm","config","dependency-graph"],"backgroundTag":"missing-dependency","analyzedSha":"a1189de023efc32d4b8e11f395acc678aa555011","analyzedAt":"2026-09-05T12:09:27.064Z","contentChangedAt":"2026-09-05T12:09:27.064Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}