GoogleContainerTools/skaffold · warning

parsing latest version from GCS: %w

Error message

parsing latest version from GCS: %w

What it means

getLatestAndCurrentVersion downloads the latest skaffold version string from GCS and parses it as semver. This error means the downloaded version string failed version.ParseVersion, so the update check cannot determine the latest release. The underlying parse error is wrapped via %w.

Source

Thrown at pkg/skaffold/update/update.go:88

// isUpdateCheckEnabled returns whether or not the update check is enabled
// It is true by default, but setting it to any other value than true will disable the check
func isUpdateCheckEnabled(configfile string) bool {
	return EnableCheck && isConfigUpdateCheckEnabled(configfile)
}

// getLatestAndCurrentVersion uses a VERSION file stored on GCS to determine the latest released version
// and returns it with the current version of Skaffold
func getLatestAndCurrentVersion() (semver.Version, semver.Version, error) {
	none := semver.Version{}
	versionString, err := DownloadLatestVersion()
	if err != nil {
		return none, none, err
	}
	log.Entry(context.TODO()).Tracef("latest skaffold version: %s", versionString)
	latest, err := version.ParseVersion(versionString)
	if err != nil {
		return none, none, fmt.Errorf("parsing latest version from GCS: %w", err)
	}
	current, err := version.ParseVersion(version.Get().Version)
	if err != nil {
		return none, none, fmt.Errorf("parsing current semver, skipping update check: %w", err)
	}
	return latest, current, nil
}

func DownloadLatestVersion() (string, error) {
	versionBytes, err := util.Download(LatestVersionURL)
	if err != nil {
		return "", fmt.Errorf("getting latest version info from GCS: %w", err)
	}
	return strings.TrimSuffix(string(versionBytes), "\n"), nil
}

func releaseURL(v semver.Version) string {
	return fmt.Sprintf("https://github.com/GoogleContainerTools/skaffold/releases/tag/v%s", v.String())

View on GitHub (pinned to a1189de023)

Solutions

  1. Manually curl the LatestVersionURL and inspect what is returned; if it is not a bare semver string, the source file is wrong/missing.
  2. Log or print the raw versionString before parsing to spot HTML/error pages.
  3. Update skaffold or pin a known-good version; the update check is advisory, so you can proceed without it.
  4. Check for proxy/VPN interference returning HTTP 200 HTML bodies and bypass the proxy for storage.googleapis.com.

Example fix

// before: hard to tell what failed
latest, err := version.ParseVersion(versionString)
// after: log the offending payload
if err != nil {
    log.Entry(context.TODO()).Debugf("latest version payload: %q", versionString)
    return none, none, fmt.Errorf("parsing latest version from GCS: %w", err)
}
Defensive patterns

Strategy: fallback

Validate before calling

if v := strings.TrimSpace(raw); v == "" || semver.IsValid(v) == false && semver.IsValid(strings.TrimPrefix(v, "v")) == false {
    // payload is not semver; skip update check
}

Type guard

func isSemver(s string) bool { v := strings.TrimPrefix(strings.TrimSpace(s), "v"); return semver.IsValid(v) }

Try / catch

latest, current, err := getLatestAndCurrentVersion(ctx)
if errors.Is/As parse failure or string contains 'parsing latest version from GCS' {
    log.Debug("skipping update check")
} else { /* proceed */ }

Prevention

When it happens

Trigger: version.ParseVersion(versionString) returns an error after Download(LatestVersionURL) succeeds but its body is not a valid semver string (e.g. HTML error page, '404 page not found', empty body, or a version without 'v'/semver shape).

Common situations: GCS bucket layout changed or the latest-version file was moved/renamed; corporate proxy or captive portal returns an HTML block page with HTTP 200; CDN serves a stale or corrupted version file; trailing content besides a semver token.

Related errors


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