kubernetes/kops · error

parsing kops version %q: %w

Error message

parsing kops version %q: %w

What it means

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

Source

Thrown at pkg/apis/kops/channel.go:410

		}

		if pkg.KubernetesVersion != "" {
			versionRange, err := semver.ParseRange(pkg.KubernetesVersion)
			if err != nil {
				klog.Warningf("cannot parse KubernetesVersion=%q", pkg.KubernetesVersion)
				continue
			}

			if !versionRange(*kubernetesVersion) {
				klog.V(6).Infof("Kubernetes version %q does not match range: %s", kubernetesVersion, pkg.KubernetesVersion)
				continue
			}
		}

		if pkg.KopsVersion != "" {
			kopsVersion, err := util.ParseVersion(kopsbase.Version)
			if err != nil {
				return nil, fmt.Errorf("parsing kops version %q: %w", kopsbase.Version, err)
			}

			versionRange, err := semver.ParseRange(pkg.KopsVersion)
			if err != nil {
				klog.Warningf("cannot parse KopsVersion=%q", pkg.KopsVersion)
				continue
			}

			if !kopsVersion.IsInRange(versionRange) {
				klog.V(2).Infof("kOps version %q does not match range: %s", kopsVersion, pkg.KopsVersion)
				continue
			}
		}

		matches = append(matches, pkg)
	}

	if len(matches) == 0 {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Rebuild kOps using `make kops` (or `make gomod`-driven release targets) so kopsbase.Version is stamped with a valid semver via ldflags.
  2. Check `kops version` output; if it prints non-semver text, locate the build flag that set it (VERSION variable / git tag) and fix it.
  3. As a packaging workaround, ensure the distro version string is normalized to semver-compatible form before stamping.

Example fix

// before
go build -o kops ./cmd/kops/
// after
make kops  # stamps kopsbase.Version, e.g. 1.28.3, via -ldflags
Defensive patterns

Strategy: try-catch

Validate before calling

if _, err := util.ParseVersion(kopsbase.Version); err != nil {
    return fmt.Errorf("kops binary version %q not parseable; rebuild with make kops", kopsbase.Version)
}

Type guard

func kopsVersionParsable() bool { _, err := util.ParseVersion(kopsbase.Version); return err == nil }

Try / catch

v, err := GetPackageVersion(channel, name)
if err != nil && strings.Contains(err.Error(), "parsing kops version") {
    // custom build problem: log kops version and skip package resolution
    klog.Warningf("skipping package %s: %v", name, err)
    return nil, nil
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/4c2af498dbb2f09f. Report an issue: GitHub.