GoogleContainerTools/skaffold · error
unknown panic
Error message
unknown panic
What it means
UpgradeToLatestUTF8Pipelines recovers from panics raised inside per-pipeline upgraders so one bad pipeline doesn't crash the process. If the recovered value r is neither a string nor an error (e.g. a panic value like an int or a custom struct), the code cannot classify it and throws this generic error.
Source
Thrown at pkg/skaffold/schema/util/upgrade_pipelines.go:40
"reflect"
)
type pipelineUpgrader struct {
oldConfig reflect.Value
newConfig reflect.Value
upgrade func(o, n interface{}) error
}
func UpgradePipelines(oldConfig, newConfig interface{}, upgrade func(o, n interface{}) error) (err error) {
defer func() {
if r := recover(); r != nil {
switch x := r.(type) {
case string:
err = fmt.Errorf("upgrading pipelines failed: %s", x)
case error:
err = x
default:
err = errors.New("unknown panic")
}
}
}()
upgrader := pipelineUpgrader{
oldConfig: reflect.Indirect(reflect.ValueOf(oldConfig)),
newConfig: reflect.Indirect(reflect.ValueOf(newConfig)),
upgrade: upgrade,
}
if err := upgrader.mainPipeline(); err != nil {
return err
}
return upgrader.profiles()
}
func (u *pipelineUpgrader) mainPipeline() error {View on GitHub (pinned to a1189de023)
Solutions
- Inspect which pipeline upgrader panics and fix it to panic with an error or string.
- Update skaffold to a version where the offending upgrade panic is fixed.
- Work around by manually editing skaffold.yaml to a schema version that upgrades cleanly, then rerun the upgrade.
Example fix
// before
panic(42) // recovered as "unknown panic"
// after
panic(fmt.Errorf("cannot upgrade pipeline %d: %v", i, reason)) Defensive patterns
Strategy: try-catch
Validate before calling
// Ensure upgrader implementations only panic with error/string values; audit custom upgraders before use.
Type guard
switch v := r.(type) { case error: ...; case string: ...; default: /* unknown panic */ } Try / catch
cfg, err := util.UpgradeToLatestUTF8Pipelines(old)
if err != nil {
if err.Error() == "unknown panic" {
log.Printf("upgrader panicked with non-error value; report bug")
}
return err
} Prevention
- Only register upgraders that panic with error values
- Keep skaffold updated to pick up upgrader fixes
- Run upgrades on a copy of the config
When it happens
Trigger: A pipelineUpgrader (or code it calls) panics with a non-string, non-error value while upgrading an old schema config's pipelines to latest.
Common situations: Schema upgrade code panicking via index-out-of-range or a panic(err/nil) with an unusual payload during `skaffold fix` on an old skaffold.yaml.
Related errors
- there's no version to upgrade from "latest"
- converting deploy.kpt isn't currently supported
- can't merge defaultNamespace property from kustomize into ku
- can't merge disableValidation property from kustomize into k
- upgrading pipelines failed: %s
AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05).
Data as JSON: /api/errors/43062e41243c52e0.
Report an issue: GitHub.