{"record":{"id":"4e6b753ab3a04e41","repo":"GoogleContainerTools/skaffold","slug":"no-valid-kubernetes-objects-decoded","errorCode":null,"errorMessage":"no valid Kubernetes objects decoded","messagePattern":"no valid Kubernetes objects decoded","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/kubernetes/util.go","lineNumber":113,"sourceCode":"\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"reading config file: %w\", err)\n\t\t}\n\n\t\tobj := make(yamlObject)\n\t\tif err := yaml.Unmarshal(doc, &obj); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"reading Kubernetes YAML: %w\", err)\n\t\t}\n\n\t\tif !hasRequiredK8sManifestFields(obj) {\n\t\t\tcontinue\n\t\t}\n\n\t\tk8sObjects = append(k8sObjects, obj)\n\t}\n\tif len(k8sObjects) == 0 {\n\t\treturn nil, errors.New(\"no valid Kubernetes objects decoded\")\n\t}\n\treturn k8sObjects, nil\n}\n\nfunc hasRequiredK8sManifestFields(doc map[string]interface{}) bool {\n\tfor _, field := range requiredFields {\n\t\tif _, ok := doc[field]; !ok {\n\t\t\tlog.Entry(context.TODO()).Debugf(\"%s not present in yaml, continuing\", field)\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// adapted from pkg/skaffold/deploy/kubectl/recursiveReplaceImage()\nfunc parseImagesFromYaml(obj interface{}) []string {\n\tvar images []string\n","sourceCodeStart":95,"sourceCodeEnd":131,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/kubernetes/util.go#L95-L131","documentation":"ParseKubernetesObjects decodes YAML/JSON documents into Kubernetes objects and filters out documents lacking required k8s manifest fields. If every document was skipped (or the input was empty), it returns this error instead of an empty slice, so callers like IsKubernetesManifest and ParseImagesFromKubernetesYaml know the file is not a usable Kubernetes manifest.","triggerScenarios":"Calling ParseKubernetesObjects on a file/reader whose documents all fail hasRequiredK8sManifestFields (missing apiVersion/kind/etc.), or on an empty manifest list.","commonSituations":"Passing a values.yaml, docker-compose file, or plain config to a command expecting Kubernetes manifests; manifests wrapped in non-standard top-level keys; empty file generated by a failed template render.","solutions":["Verify the input file contains real Kubernetes manifests with required fields (apiVersion, kind, metadata, spec)","Render Helm/Kustomize sources to valid manifests first (`skaffold render` / `helm template`) before parsing","Check the pipeline's manifest configuration so raw templates are not passed as final manifests"],"exampleFix":"// before\nobjs, err := util.ParseKubernetesObjects(reader) // \"no valid Kubernetes objects decoded\"\n// after\nif util.IsKubernetesManifest(path) {\n  objs, err := util.ParseKubernetesObjects(reader)\n}","handlingStrategy":"validation","validationCode":"if strings.TrimSpace(content) == \"\" { return errors.New(\"empty manifest input\") }\ndocs := parseYAML(content)\nfor _, d := range docs { if d[\"apiVersion\"] == nil || d[\"kind\"] == nil { return fmt.Errorf(\"not a k8s manifest: %v\", d) } }","typeGuard":"func looksLikeK8sManifest(doc map[string]interface{}) bool {\n  _, hasAPI := doc[\"apiVersion\"]; _, hasKind := doc[\"kind\"]\n  return hasAPI && hasKind\n}","tryCatchPattern":"objs, err := util.ParseKubernetesObjects(r)\nif err != nil {\n  if strings.Contains(err.Error(), \"no valid Kubernetes objects decoded\") { return fmt.Errorf(\"%s is not a Kubernetes manifest: %w\", path, err) }\n  return err\n}","preventionTips":["Check files with util.IsKubernetesManifest before parsing","Render Helm/Kustomize before parsing generated manifests","Skip values files and non-manifest YAML in manifest globs"],"tags":["kubernetes","manifest-parsing","skaffold"],"backgroundTag":"invalid-kubernetes-manifest","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"}