func ResolveVersion()

in pkg/runtime/install.go [293:336]


func ResolveVersion(ctx *gcp.Context, runtime InstallableRuntime, verConstraint, osName string) (string, error) {
	if runtime == Go {
		// Go provides its own version manifest so it has its own version resolution logic.
		return golang.ResolveGoVersion(verConstraint)
	}
	// Some release candidates do not follow the convention for semver
	// Specifically php. example - 8.3.0RC4.
	if IsReleaseCandidate(verConstraint) || version.IsExactSemver(verConstraint) {
		return verConstraint, nil
	}

	var versions []string
	var err error
	region, present := os.LookupEnv(env.RuntimeImageRegion)
	if present {
		url := fmt.Sprintf(runtimeImageARRepoURL, region, osName, runtime)
		fallbackURL := fmt.Sprintf(runtimeImageARRepoURL, fallbackRegion, osName, runtime)
		versions, err = fetch.ARVersions(url, fallbackURL, ctx)
	} else {
		url := fmt.Sprintf(runtimeVersionsURL, osName, runtime)
		err = fetch.JSON(url, &versions)
	}
	if err != nil {
		return "", gcp.InternalErrorf("fetching %s versions %s osName: %v", runtimeNames[runtime], osName, err)
	}

	if present && (runtime == OpenJDK || runtime == CanonicalJDK) {
		for i, v := range versions {
			// When resolving version openjdk versions should be decoded to align with semver requirement. (eg. 11.0.21_9 -> 11.0.21+9)
			versions[i] = strings.ReplaceAll(v, "_", "+")
		}
	}
	v, err := version.ResolveVersion(verConstraint, versions)
	if err != nil {
		return "", gcp.UserErrorf("invalid %s version specified: %v. You may need to use a different builder. Please check if the language version specified is supported by the os: %v. You can refer to https://cloud.google.com/docs/buildpacks/builders for a list of compatible runtime languages per builder", runtimeNames[runtime], err, osName)
	}
	// When downloading from AR the openjdk version should be encoded to align with tag format requirement. (eg. 11.0.21+9 -> 11.0.21_9)
	if present {
		if runtime == OpenJDK || runtime == CanonicalJDK {
			v = strings.ReplaceAll(v, "+", "_")
		}
	}
	return v, nil
}