GoogleContainerTools/skaffold · error
converting deploy.kpt isn't currently supported
Error message
converting deploy.kpt isn't currently supported
What it means
During upgrade of a v2beta29 config to the next version, each pipeline's deploy section is converted to the render config. Kpt-based deployers (Deploy.KptDeploy != nil) have no conversion implemented, so the upgrade aborts with this error.
Source
Thrown at pkg/skaffold/schema/v2beta29/upgrade.go:131
// Copy kustomize deploy config to render config
if oldPL.Deploy.KustomizeDeploy != nil {
newPL.Render.Kustomize = &next.Kustomize{
Paths: oldPL.Deploy.KustomizeDeploy.KustomizePaths,
BuildArgs: oldPL.Deploy.KustomizeDeploy.BuildArgs,
}
if len(newPL.Render.Kustomize.Paths) == 0 {
newPL.Render.Kustomize.Paths = append(newPL.Render.Kustomize.Paths, ".")
}
// Inject Kubectl deployer to deploy kustomize manifests
if err := mergeKustomizeIntoKubectlDeployer(newPL, oldPL); err != nil {
return err
}
}
// Copy Kpt deploy config to render config
if oldPL.Deploy.KptDeploy != nil {
return errors.New("converting deploy.kpt isn't currently supported")
}
// Copy helm deploy config
if oldPL.Deploy.HelmDeploy != nil {
oldHelm, err := json.Marshal(*oldPL.Deploy.HelmDeploy)
if err != nil {
return errors.Wrap(err, "marshalling old helm deploy")
}
newHelm := next.LegacyHelmDeploy{}
if err = json.Unmarshal(oldHelm, &newHelm); err != nil {
return errors.Wrap(err, "unmarshalling into new helm deploy")
}
// Copy Releases and Flags into the render config. Hooks are not copied due to v1
// backwards compatibility: v1 skaffold render command doesn't trigger the hooks.
newPL.Render.Helm = &next.Helm{}
newPL.Render.Helm.Releases = newHelm.Releases
newPL.Render.Helm.Flags = newHelm.FlagsView on GitHub (pinned to a1189de023)
Solutions
- Manually migrate the kpt deploy config to the `render` section in the new schema, then rerun skaffold fix.
- Temporarily switch deploy.kpt to deploy.kubectl or deploy.helm before upgrading, then adjust the upgraded config.
- Use a newer skaffold version if kpt conversion support has been added.
Example fix
# before
deploy:
kpt: {}
# after
render:
# manually port kpt config here before/after running skaffold fix Defensive patterns
Strategy: validation
Validate before calling
func usesKptDeploy(cfg map[string]interface{}) bool {
d, _ := cfg["deploy"].(map[string]interface{})
_, ok := d["kpt"]
return ok
} // reject or hand-migrate before calling Upgrade Type guard
if old.Deploy != nil && old.Deploy.KptDeploy != nil { /* kpt not convertible */ } Try / catch
newCfg, err := old.Upgrade()
if err != nil && strings.Contains(err.Error(), "deploy.kpt isn't currently supported") {
return manualKptMigration(old)
} Prevention
- Check deploy.kpt presence before upgrading
- Hand-port kpt deployer settings to the render section
- Track skaffold releases for kpt conversion support
When it happens
Trigger: Running Upgrade/upgradeOnePipeline on a v2beta29 skaffold.yaml whose deploy section uses `deploy: kpt:`.
Common situations: Users of the kpt deployer running `skaffold fix` to migrate an old skaffold.yaml to a newer schema version.
Related errors
- there's no version to upgrade from "latest"
- unknown panic
- can't merge defaultNamespace property from kustomize into ku
- can't merge disableValidation property from kustomize into k
- could not read the hydrated manifest from %v: %w
AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05).
Data as JSON: /api/errors/2ce2594a6c6c321e.
Report an issue: GitHub.