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
}