{"record":{"id":"450224f9a42e962f","repo":"GoogleContainerTools/skaffold","slug":"could-not-prepare-skaffold-filter-w","errorCode":null,"errorMessage":"could not prepare `skaffold filter`: %w","messagePattern":"could not prepare `skaffold filter`: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/deploy/helm/helm.go","lineNumber":550,"sourceCode":"\t\topts.flags = h.Flags.Install\n\t} else {\n\t\tif r.UpgradeOnChange != nil && !*r.UpgradeOnChange {\n\t\t\tolog.Entry(ctx).Infof(\"Release %s already installed...\", releaseName)\n\t\t\treturn nil, []types.Artifact{}, nil\n\t\t} else if r.UpgradeOnChange == nil && r.RemoteChart != \"\" {\n\t\t\tolog.Entry(ctx).Infof(\"Release %s not upgraded as it is remote...\", releaseName)\n\t\t\treturn nil, []types.Artifact{}, nil\n\t\t}\n\t}\n\n\tinstallEnv := util.OSEnviron()\n\t// skaffold use the post-renderer feature to do skaffold specific rendering such as image replacement, adding debugging annotation in helm rendered result,\n\t// as Helm doesn't support to run multiple post-renderers,  this is used to run user-defined render inside skaffold filter which happens before skaffold\n\t// post-rendering process for helm releases.\n\tpostRendererFlag := getPostRendererFlag(opts.flags)\n\tskaffoldBinary, filterEnv, cleanup, err := helm.PrepareSkaffoldFilter(h, builds, postRendererFlag)\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"could not prepare `skaffold filter`: %w\", err)\n\t}\n\n\tif cleanup != nil {\n\t\tdefer cleanup()\n\t}\n\t// need to include current environment, specifically for HOME to lookup ~/.kube/config\n\tinstallEnv = append(installEnv, filterEnv...)\n\n\t// Only build local dependencies, but allow a user to skip them.\n\tif !r.SkipBuildDependencies && r.ChartPath != \"\" {\n\t\tolog.Entry(ctx).Info(\"Building helm dependencies...\")\n\n\t\targs := []string{\"dep\", \"build\", r.ChartPath}\n\t\targs = append(args, h.Flags.DepBuild...)\n\n\t\tif err := helm.Exec(ctx, h, out, false, nil, args...); err != nil {\n\t\t\treturn nil, nil, helm.UserErr(\"building helm dependencies\", err)\n\t\t}","sourceCodeStart":532,"sourceCodeEnd":568,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/deploy/helm/helm.go#L532-L568","documentation":"Wraps helm.PrepareSkaffoldFilter failure when deployRelease sets up the `skaffold filter` post-renderer. The filter binary is used to apply image replacement and debug annotations before user post-renderers run; failure means the binary could not be located/executed or its environment prepared.","triggerScenarios":"Calling Deploy with debug or profile-driven image replacement enabled when the skaffold binary path cannot be resolved (binary moved/replaced at runtime) or postRendererFlag setup fails.","commonSituations":"Running skaffold inside a slim container where os.Executable resolves oddly; piping skaffold through wrappers/symlinks; conflicts with a user-defined postRenderer flag in helm.flags.","solutions":["Run the official skaffold binary directly, not through a renamed wrapper or symlink","Remove conflicting --post-renderer entries from helm.flags (skaffold supplies its own)","Upgrade skaffold; older versions had filter preparation bugs","Set `debug: false` or drop image-transform profiles to confirm the filter is the trigger"],"exampleFix":"// before\nflags:\n  deploy: [\"--post-renderer\", \"my-renderer.sh\"]\n// after\nflags:\n  deploy: []   # let skaffold install its own post-renderer chain","handlingStrategy":"try-catch","validationCode":"// ensure skaffold is the real binary and no user post-renderer conflicts\nif _, err := os.Executable(); err != nil { return err }\nfor _, f := range opts.flags {\n  if strings.HasPrefix(f, \"--post-renderer\") {\n    return fmt.Errorf(\"remove %s; skaffold installs its own post-renderer\", f)\n  }\n}","typeGuard":null,"tryCatchPattern":"if err := deployer.Deploy(ctx, out); err != nil && strings.Contains(err.Error(), \"could not prepare `skaffold filter`\") {\n  // fall back to running deploy without debug/image-replace profile\n}","preventionTips":["Invoke skaffold directly, not via renamed wrappers","Do not pass --post-renderer manually in helm.flags","Keep skaffold up to date","Disable debug profiles in slim CI images if the filter misbehaves"],"tags":["helm","post-renderer","deploy"],"backgroundTag":"skaffold-filter-post-renderer-failed","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"}