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.Flags

View on GitHub (pinned to a1189de023)

Solutions

  1. Manually migrate the kpt deploy config to the `render` section in the new schema, then rerun skaffold fix.
  2. Temporarily switch deploy.kpt to deploy.kubectl or deploy.helm before upgrading, then adjust the upgraded config.
  3. 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

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


AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05). Data as JSON: /api/errors/2ce2594a6c6c321e. Report an issue: GitHub.