bottlerocket-os/bottlerocket

Building with SDK v0.37.0 fails fetch-vendored task due to missing GOPROXY

markusboehme opened this issue · 4 comments

Platform I'm building on: Fedora 36 on x86_64

What I expected to happen: With the current develop branch after merging #3690, I expected cargo make -e BUILDSYS_VARIANT=metal-dev to succeed.

What actually happened: The fetch-vendored task fails with github.com/aws/aws-sdk-go/aws: GOPROXY list is not the empty string, but contains no entries and similar entries:

[cargo-make][1] INFO - Running Task: fetch-vendored
go: downloading github.com/containerd/containerd v1.6.26
go: downloading github.com/aws/aws-sdk-go v1.49.13
go: downloading github.com/awslabs/amazon-ecr-containerd-resolver v0.0.0-20231213164356-22a8023e9be3
go: downloading github.com/urfave/cli/v2 v2.27.1
go: downloading google.golang.org/grpc v1.60.1
go: downloading github.com/aws/aws-sdk-go v1.49.13
go: downloading github.com/urfave/cli/v2 v2.27.1
go: downloading github.com/awslabs/amazon-ecr-containerd-resolver v0.0.0-20231213164356-22a8023e9be3
go: downloading github.com/containerd/containerd v1.6.26
go: downloading google.golang.org/grpc v1.60.1
go: host-ctr/cmd/host-ctr imports
        github.com/aws/aws-sdk-go/aws: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/aws/aws-sdk-go/aws/session: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/aws/aws-sdk-go/service/ecrpublic: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/awslabs/amazon-ecr-containerd-resolver/ecr: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/containerd/containerd: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/containerd/containerd/cio: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/containerd/containerd/containers: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/containerd/containerd/contrib/seccomp: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/containerd/containerd/errdefs: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/containerd/containerd/log: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/containerd/containerd/namespaces: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/containerd/containerd/oci: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/containerd/containerd/pkg/cri/server: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/containerd/containerd/remotes/docker: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/containerd/containerd/runtime/v2/runc/options: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        github.com/urfave/cli/v2: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        k8s.io/cri-api/pkg/apis/runtime/v1 imports
        google.golang.org/grpc: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        k8s.io/cri-api/pkg/apis/runtime/v1 imports
        google.golang.org/grpc/codes: GOPROXY list is not the empty string, but contains no entries
go: host-ctr/cmd/host-ctr imports
        k8s.io/cri-api/pkg/apis/runtime/v1 imports
        google.golang.org/grpc/status: GOPROXY list is not the empty string, but contains no entries
[cargo-make][1] ERROR - Error while executing command, exit code: 1

How to reproduce the problem: Have no GO* environment variables set (ensure env | grep ^GO is empty), no go.env file is present, and then cargo make.

I haven't looked yet at what GOPROXY is set at during the build or who sets it (is not the empty string). I also don't know why it looks to affect the dependencies of host-ctr only. In the meantime, explicitly export GOPROXY=direct in the build environment does the trick, but wasn't needed before the update to SDK v0.37.0/Go v1.21.0.

SDK v0.36.1 has a default GOPROXY set:

$ docker run --rm public.ecr.aws/bottlerocket/bottlerocket-sdk-x86_64:v0.36.1 /usr/libexec/go/bin/go env | grep GOPROXY
GOPROXY="https://proxy.golang.org,direct"

SDK v0.37.0 does not:

$ docker run --rm public.ecr.aws/bottlerocket/bottlerocket-sdk-x86_64:v0.37.0 /usr/libexec/go/bin/go env | grep GOPROXY
GOPROXY=''

Wondering if the error message (GOPROXY list is not the empty string) is misleading or whether buildsys or twoliter perhaps misinterpret an empty GOPROXY.

From https://cs.opensource.google/go/go/+/7aa85e01376d840acc8bb931156d607a00b64a60

Various Linux distributions edit cmd/go/internal/cfg/cfg.go to change
the default settings of GOPROXY and GOSUMDB. Make it possible for
them to do this without editing the go command source code by
introducing GOROOT/go.env and moving those defaults there.

It would seem we need to package go.env during the SDK build then, because there is no such file in the resulting image.

This diff for bottlerocket-sdk includes the go.env file with the defaults, and GOPROXY is subsequently set to the old default:

diff --git a/Dockerfile b/Dockerfile
index 0c95d1a..5c3aae5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1012,6 +1012,7 @@ COPY --chown=0:0 --from=sdk-go /home/builder/sdk-go/bin /usr/libexec/go/bin/
 COPY --chown=0:0 --from=sdk-go /home/builder/sdk-go/lib /usr/libexec/go/lib/
 COPY --chown=0:0 --from=sdk-go /home/builder/sdk-go/pkg /usr/libexec/go/pkg/
 COPY --chown=0:0 --from=sdk-go /home/builder/sdk-go/src /usr/libexec/go/src/
+COPY --chown=0:0 --from=sdk-go /home/builder/sdk-go/go.env /usr/libexec/go/go.env
 COPY --chown=0:0 --from=sdk-go \
   /home/builder/sdk-go/licenses/ \
   /usr/share/licenses/go/

I haven't run the full matrix of SDK builds yet to be able to actually test a build of Bottlerocket, but the output of go env in one of the SDK images looks right to me.