From f6025f951e962c5c1ccf6b5c42503402ac8ff0de Mon Sep 17 00:00:00 2001 From: Michael Gasch <15986659+embano1@users.noreply.github.com> Date: Thu, 19 Jan 2023 21:02:34 +0100 Subject: [PATCH] feat: Add KO_GO_PATH env var (#930) * feat: Add KO_GO_BIN env var Closes: #926 Signed-off-by: Michael Gasch <15986659+embano1@users.noreply.github.com> * Update docs/configuration.md Signed-off-by: Michael Gasch <15986659+embano1@users.noreply.github.com> Co-authored-by: Jason Hall --- docs/configuration.md | 17 +++++++++++++---- pkg/build/cache.go | 4 +++- pkg/build/gobuild.go | 18 ++++++++++++++++-- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index b382bf3f9d..4c291c0751 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -2,9 +2,8 @@ ## Basic Configuration -Aside from `KO_DOCKER_REPO`, you can configure `ko`'s behavior using a -`.ko.yaml` file. The location of this file can be overridden with -`KO_CONFIG_PATH`. +Aside from certain environment variables (see [below](#environment-variables-advanced)) like `KO_DOCKER_REPO`, you can +configure `ko`'s behavior using a `.ko.yaml` file. The location of this file can be overridden with `KO_CONFIG_PATH`. ### Overriding Base Images @@ -83,7 +82,6 @@ The `ldflags` default value is `[]`. only the `env`, `flags` and `ldflags` fields are currently supported. Also, the templating support is currently limited to using environment variables only. - ### Setting default platforms By default, `ko` builds images based on the platform it runs on. If your target platform differs from your build platform you can specify the build platform: @@ -106,6 +104,17 @@ You can also use the `KO_DEFAULTPLATFORMS` environment variable to set the defau KO_DEFAULTPLATFORMS=linux/arm64,linux/amd64 ``` +### Environment Variables (advanced) + +For ease of use, backward compatibility and advanced use cases, `ko` supports the following environment variables to +influence the build process. + +| Variable | Default Value | Description | +|------------------|--------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `KO_DOCKER_REPO` | (not set) | Container repository where to push images built with `ko` (required) | +| `KO_GO_PATH` | `go` | `go` binary to use for builds, relative or absolute path, otherwise looked up via $PATH (optional) | +| `KO_CONFIG_PATH` | `./ko.yaml` | Path to `ko` configuration file (optional) | +| `KOCACHE` | (not set) | This tells `ko` to store a local mapping between the `go build` inputs to the image layer that they produce, so `go build` can be skipped entirely if the layer is already present in the image registry (optional). | ## Naming Images diff --git a/pkg/build/cache.go b/pkg/build/cache.go index 270c30788b..9a93dc5a24 100644 --- a/pkg/build/cache.go +++ b/pkg/build/cache.go @@ -201,7 +201,9 @@ func (c *layerCache) readBuildToDiff(file string) (buildIDToDiffID, error) { } func getBuildID(ctx context.Context, file string) (string, error) { - cmd := exec.CommandContext(ctx, "go", "tool", "buildid", file) + gobin := getGoBinary() + + cmd := exec.CommandContext(ctx, gobin, "tool", "buildid", file) var output bytes.Buffer cmd.Stderr = &output cmd.Stdout = &output diff --git a/pkg/build/gobuild.go b/pkg/build/gobuild.go index 892123240e..e9ad9d1377 100644 --- a/pkg/build/gobuild.go +++ b/pkg/build/gobuild.go @@ -56,6 +56,9 @@ import ( const ( defaultAppFilename = "ko-app" + + defaultGoBin = "go" // defaults to first go binary found in PATH + goBinPathEnv = "KO_GO_PATH" // env lookup for optional relative or full go binary path ) // GetBase takes an importpath and returns a base image reference and base image (or index). @@ -244,6 +247,13 @@ func getGoarm(platform v1.Platform) (string, error) { return "", nil } +func getGoBinary() string { + if env := os.Getenv(goBinPathEnv); env != "" { + return env + } + return defaultGoBin +} + func build(ctx context.Context, ip string, dir string, platform v1.Platform, config Config) (string, error) { buildArgs, err := createBuildArgs(config) if err != nil { @@ -285,7 +295,9 @@ func build(ctx context.Context, ip string, dir string, platform v1.Platform, con args = append(args, "-o", file) args = append(args, ip) - cmd := exec.CommandContext(ctx, "go", args...) + + gobin := getGoBinary() + cmd := exec.CommandContext(ctx, gobin, args...) cmd.Dir = dir cmd.Env = env @@ -305,10 +317,12 @@ func build(ctx context.Context, ip string, dir string, platform v1.Platform, con } func goversionm(ctx context.Context, file string, appPath string, appFileName string, se oci.SignedEntity, dir string) ([]byte, types.MediaType, error) { + gobin := getGoBinary() + switch se.(type) { case oci.SignedImage: sbom := bytes.NewBuffer(nil) - cmd := exec.CommandContext(ctx, "go", "version", "-m", file) + cmd := exec.CommandContext(ctx, gobin, "version", "-m", file) cmd.Stdout = sbom cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil {