{"record":{"id":"2ce2594a6c6c321e","repo":"GoogleContainerTools/skaffold","slug":"converting-deploy-kpt-isn-t-currently-supported","errorCode":null,"errorMessage":"converting deploy.kpt isn't currently supported","messagePattern":"converting deploy\\.kpt isn't currently supported","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/schema/v2beta29/upgrade.go","lineNumber":131,"sourceCode":"\t// Copy kustomize deploy config to render config\n\tif oldPL.Deploy.KustomizeDeploy != nil {\n\t\tnewPL.Render.Kustomize = &next.Kustomize{\n\t\t\tPaths:     oldPL.Deploy.KustomizeDeploy.KustomizePaths,\n\t\t\tBuildArgs: oldPL.Deploy.KustomizeDeploy.BuildArgs,\n\t\t}\n\t\tif len(newPL.Render.Kustomize.Paths) == 0 {\n\t\t\tnewPL.Render.Kustomize.Paths = append(newPL.Render.Kustomize.Paths, \".\")\n\t\t}\n\n\t\t// Inject Kubectl deployer to deploy kustomize manifests\n\t\tif err := mergeKustomizeIntoKubectlDeployer(newPL, oldPL); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Copy Kpt deploy config to render config\n\tif oldPL.Deploy.KptDeploy != nil {\n\t\treturn errors.New(\"converting deploy.kpt isn't currently supported\")\n\t}\n\n\t// Copy helm deploy config\n\tif oldPL.Deploy.HelmDeploy != nil {\n\t\toldHelm, err := json.Marshal(*oldPL.Deploy.HelmDeploy)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"marshalling old helm deploy\")\n\t\t}\n\t\tnewHelm := next.LegacyHelmDeploy{}\n\t\tif err = json.Unmarshal(oldHelm, &newHelm); err != nil {\n\t\t\treturn errors.Wrap(err, \"unmarshalling into new helm deploy\")\n\t\t}\n\n\t\t// Copy Releases and Flags into the render config. Hooks are not copied due to v1\n\t\t// backwards compatibility: v1 skaffold render command doesn't trigger the hooks.\n\t\tnewPL.Render.Helm = &next.Helm{}\n\t\tnewPL.Render.Helm.Releases = newHelm.Releases\n\t\tnewPL.Render.Helm.Flags = newHelm.Flags","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/schema/v2beta29/upgrade.go#L113-L149","documentation":"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.","triggerScenarios":"Running Upgrade/upgradeOnePipeline on a v2beta29 skaffold.yaml whose deploy section uses `deploy: kpt:`.","commonSituations":"Users of the kpt deployer running `skaffold fix` to migrate an old skaffold.yaml to a newer schema version.","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."],"exampleFix":"# before\ndeploy:\n  kpt: {}\n# after\nrender:\n  # manually port kpt config here before/after running skaffold fix","handlingStrategy":"validation","validationCode":"func usesKptDeploy(cfg map[string]interface{}) bool {\n    d, _ := cfg[\"deploy\"].(map[string]interface{})\n    _, ok := d[\"kpt\"]\n    return ok\n} // reject or hand-migrate before calling Upgrade","typeGuard":"if old.Deploy != nil && old.Deploy.KptDeploy != nil { /* kpt not convertible */ }","tryCatchPattern":"newCfg, err := old.Upgrade()\nif err != nil && strings.Contains(err.Error(), \"deploy.kpt isn't currently supported\") {\n    return manualKptMigration(old)\n}","preventionTips":["Check deploy.kpt presence before upgrading","Hand-port kpt deployer settings to the render section","Track skaffold releases for kpt conversion support"],"tags":["kpt","schema-upgrade","unsupported"],"backgroundTag":"schema-upgrade-not-supported","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"}