forked from OpenFunction/builder
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
93 lines (77 loc) · 2.81 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Implements Java GraalVM Native Image buildpack.
// This buildpack installs the GraalVM compiler into a layer and builds a native image of the Java application.
package main
import (
"fmt"
"path/filepath"
"github.com/GoogleCloudPlatform/buildpacks/pkg/env"
gcp "github.com/GoogleCloudPlatform/buildpacks/pkg/gcpbuildpack"
)
const (
graalvmVersion = "21.1.0"
graalvmURL = "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-%[1]s/graalvm-ce-java11-linux-amd64-%[1]s.tar.gz"
layerName = "java-graalvm"
versionKey = "version"
)
func main() {
gcp.Main(detectFn, buildFn)
}
func detectFn(ctx *gcp.Context) (gcp.DetectResult, error) {
useNativeImage, err := env.IsUsingNativeImage()
if err != nil {
return nil, gcp.UserErrorf("failed to parse GOOGLE_JAVA_USE_NATIVE_IMAGE: %v", err)
}
if useNativeImage {
ctx.Warnf("The GraalVM Native Image buildpack is enabled. Note: This is under development and not ready for use.")
return gcp.OptInEnvSet(env.UseNativeImage), nil
}
return gcp.OptOutEnvNotSet(env.UseNativeImage), nil
}
func buildFn(ctx *gcp.Context) error {
if err := installGraalVM(ctx); err != nil {
return err
}
return nil
}
func installGraalVM(ctx *gcp.Context) error {
graalLayer := ctx.Layer(layerName, gcp.CacheLayer, gcp.BuildLayer, gcp.LaunchLayerIfDevMode)
metaVersion := ctx.GetMetadata(graalLayer, versionKey)
if graalvmVersion == metaVersion {
ctx.CacheHit(layerName)
ctx.Logf("GraalVM cache hit, skipping installation.")
return nil
}
ctx.CacheMiss(layerName)
ctx.ClearLayer(graalLayer)
// Install graalvm into layer.
archiveURL := fmt.Sprintf(graalvmURL, graalvmVersion)
command := fmt.Sprintf(
"curl --fail --show-error --silent --location %s "+
"| tar xz --directory %s --strip-components=1", archiveURL, graalLayer.Path)
_, err := ctx.ExecWithErr([]string{"bash", "-c", command}, gcp.WithUserAttribution)
if err != nil {
return err
}
// Install native-image component
graalUpdater := filepath.Join(graalLayer.Path, "bin", "gu")
_, err = ctx.ExecWithErr([]string{graalUpdater, "install", "native-image"}, gcp.WithUserAttribution)
if err != nil {
return err
}
ctx.Setenv("JAVA_HOME", graalLayer.Path)
ctx.SetMetadata(graalLayer, versionKey, graalvmVersion)
return nil
}