func InstallTarballIfNotCached()

in pkg/runtime/install.go [161:213]


func InstallTarballIfNotCached(ctx *gcp.Context, runtime InstallableRuntime, versionConstraint string, layer *libcnb.Layer) (bool, error) {
	runtimeName := runtimeNames[runtime]
	runtimeID := string(runtime)
	osName := OSForStack(ctx)

	version, err := ResolveVersion(ctx, runtime, versionConstraint, osName)
	if err != nil {
		return false, err
	}

	if err = ValidateFlexMinVersion(ctx, runtime, version); err != nil {
		return false, err
	}

	if layer.Cache {
		if IsCached(ctx, layer, version) {
			ctx.CacheHit(runtimeID)
			ctx.Logf("%s v%s cache hit, skipping installation.", runtimeName, version)
			return true, nil
		}
		ctx.CacheMiss(runtimeID)
	}

	if err := ctx.ClearLayer(layer); err != nil {
		return false, gcp.InternalErrorf("clearing layer %q: %w", layer.Name, err)
	}
	ctx.Logf("Installing %s v%s.", runtimeName, version)

	runtimeURL := tarballDownloadURL(runtime, osName, version)
	stripComponents := 0
	if runtime == OpenJDK || runtime == Go {
		stripComponents = 1
	}
	region, present := os.LookupEnv(env.RuntimeImageRegion)
	if present && runtime != Go {
		url := runtimeImageURL(runtime, osName, version, region)
		fallbackURL := runtimeImageURL(runtime, osName, version, fallbackRegion)
		if err := fetch.ARImage(url, fallbackURL, layer.Path, stripComponents, ctx); err != nil {
			ctx.Warnf("Failed to download %s version %s osName %s from artifact registry. You can specify the version by setting the GOOGLE_RUNTIME_VERSION environment variable", runtimeName, version, osName)
			return false, err
		}
	} else {
		if err := fetch.Tarball(runtimeURL, layer.Path, stripComponents); err != nil {
			ctx.Warnf("Failed to download %s version %s osName %s from lorry. You can specify the version by setting the GOOGLE_RUNTIME_VERSION environment variable", runtimeName, version, osName)
			return false, err
		}
	}

	ctx.SetMetadata(layer, stackKey, ctx.StackID())
	ctx.SetMetadata(layer, versionKey, version)

	return false, nil
}