func installGradle()

in cmd/java/gradle/main.go [152:208]


func installGradle(ctx *gcp.Context) (string, error) {
	gradlel, err := ctx.Layer(gradleLayer, gcp.CacheLayer, gcp.BuildLayer, gcp.LaunchLayerIfDevMode)
	if err != nil {
		return "", fmt.Errorf("creating %v layer: %w", gradleLayer, err)
	}

	metaVersion := ctx.GetMetadata(gradlel, versionKey)
	// Check the metadata in the cache layer to determine if we need to proceed.
	gradleVersion, err := java.GetLatestGradleVersion()
	if err != nil {
		return "", fmt.Errorf("getting latest gradle version: %w", err)
	}
	if gradleVersion == metaVersion {
		ctx.CacheHit(gradleLayer)
		ctx.Logf("Gradle cache hit, skipping installation.")
		return filepath.Join(gradlel.Path, "bin", "gradle"), nil
	}
	ctx.CacheMiss(gradleLayer)
	if err := ctx.ClearLayer(gradlel); err != nil {
		return "", fmt.Errorf("clearing layer %q: %w", gradlel.Name, err)
	}

	downloadURL := fmt.Sprintf(gradleDistroURL, gradleVersion)
	// Download and install gradle in layer.
	ctx.Logf("Installing Gradle v%s", gradleVersion)
	code, err := ctx.HTTPStatus(downloadURL)
	if err != nil {
		return "", err
	}
	if code != http.StatusOK {
		return "", fmt.Errorf("Gradle version %s does not exist at %s (status %d)", gradleVersion, downloadURL, code)
	}

	tmpDir := "/tmp"
	gradleZip := filepath.Join(tmpDir, "gradle.zip")
	defer ctx.RemoveAll(gradleZip)

	curl := fmt.Sprintf("curl --fail --show-error --silent --location --retry 3 %s --output %s", downloadURL, gradleZip)
	if _, err := ctx.Exec([]string{"bash", "-c", curl}); err != nil {
		return "", err
	}

	unzip := fmt.Sprintf("unzip -q %s -d %s", gradleZip, tmpDir)
	if _, err := ctx.Exec([]string{"bash", "-c", unzip}); err != nil {
		return "", err
	}

	gradleExtracted := filepath.Join(tmpDir, fmt.Sprintf("gradle-%s", gradleVersion))
	defer ctx.RemoveAll(gradleExtracted)
	install := fmt.Sprintf("mv %s/* %s", gradleExtracted, gradlel.Path)
	if _, err := ctx.Exec([]string{"bash", "-c", install}); err != nil {
		return "", err
	}

	ctx.SetMetadata(gradlel, versionKey, gradleVersion)
	return filepath.Join(gradlel.Path, "bin", "gradle"), nil
}