{"record":{"id":"4c2af498dbb2f09f","repo":"kubernetes/kops","slug":"parsing-kops-version-q-w","errorCode":null,"errorMessage":"parsing kops version %q: %w","messagePattern":"parsing kops version %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/apis/kops/channel.go","lineNumber":410,"sourceCode":"\t\t}\n\n\t\tif pkg.KubernetesVersion != \"\" {\n\t\t\tversionRange, err := semver.ParseRange(pkg.KubernetesVersion)\n\t\t\tif err != nil {\n\t\t\t\tklog.Warningf(\"cannot parse KubernetesVersion=%q\", pkg.KubernetesVersion)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif !versionRange(*kubernetesVersion) {\n\t\t\t\tklog.V(6).Infof(\"Kubernetes version %q does not match range: %s\", kubernetesVersion, pkg.KubernetesVersion)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tif pkg.KopsVersion != \"\" {\n\t\t\tkopsVersion, err := util.ParseVersion(kopsbase.Version)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing kops version %q: %w\", kopsbase.Version, err)\n\t\t\t}\n\n\t\t\tversionRange, err := semver.ParseRange(pkg.KopsVersion)\n\t\t\tif err != nil {\n\t\t\t\tklog.Warningf(\"cannot parse KopsVersion=%q\", pkg.KopsVersion)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif !kopsVersion.IsInRange(versionRange) {\n\t\t\t\tklog.V(2).Infof(\"kOps version %q does not match range: %s\", kopsVersion, pkg.KopsVersion)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tmatches = append(matches, pkg)\n\t}\n\n\tif len(matches) == 0 {","sourceCodeStart":392,"sourceCodeEnd":428,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/apis/kops/channel.go#L392-L428","documentation":"GetPackageVersion (addon/package selection in CreateAddons) parses the *kOps binary's own version* (kopsbase.Version) with util.ParseVersion in order to test it against a package's kopsVersion range. This error means the running kOps binary's version string is not parseable, which happens with custom/patched builds whose version metadata was replaced with non-semver text (e.g. \"dev\" or an unresolved git describe placeholder).","triggerScenarios":"CreateAddons -> GetPackageVersion where pkg.KopsVersion is set and util.ParseVersion(kopsbase.Version) fails — i.e. the binary was built without proper version ldflags or the version was overridden with a non-semver value.","commonSituations":"Hand-built kOps via `go build ./cmd/kops/...` without the Makefile's version ldflags; distro-packaged kOps with a modified version string like \"1.28.0-1.el9\" variants the parser rejects; CI builds stamping \"+dirty\" metadata.","solutions":["Rebuild kOps using `make kops` (or `make gomod`-driven release targets) so kopsbase.Version is stamped with a valid semver via ldflags.","Check `kops version` output; if it prints non-semver text, locate the build flag that set it (VERSION variable / git tag) and fix it.","As a packaging workaround, ensure the distro version string is normalized to semver-compatible form before stamping."],"exampleFix":"// before\ngo build -o kops ./cmd/kops/\n// after\nmake kops  # stamps kopsbase.Version, e.g. 1.28.3, via -ldflags","handlingStrategy":"try-catch","validationCode":"if _, err := util.ParseVersion(kopsbase.Version); err != nil {\n    return fmt.Errorf(\"kops binary version %q not parseable; rebuild with make kops\", kopsbase.Version)\n}","typeGuard":"func kopsVersionParsable() bool { _, err := util.ParseVersion(kopsbase.Version); return err == nil }","tryCatchPattern":"v, err := GetPackageVersion(channel, name)\nif err != nil && strings.Contains(err.Error(), \"parsing kops version\") {\n    // custom build problem: log kops version and skip package resolution\n    klog.Warningf(\"skipping package %s: %v\", name, err)\n    return nil, nil\n}","preventionTips":["Always build kOps via `make kops` so version ldflags are applied","Check `kops version` outputs valid semver before running addon operations","In distro packaging, normalize stamped version strings to semver"],"tags":["kops","addons","version-parsing","build"],"backgroundTag":"invalid-version-string","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}