-
Notifications
You must be signed in to change notification settings - Fork 17.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
runtime: make GOMAXPROCS
cfs-aware on GOOS=linux
#33803
Comments
I really have to disagree with some of the latter suggestions in kubernetes/kubernetes#67577 Some background on uber-go/automaxprocs#13 (changing from
I'll reprise (copied with some edits) my description from that issue here for easy reading:
|
Noting: #19378 (comment) explores some GC-CFS relationship |
For comparative purposes, Oracle blog post about Java adding similar support ( especially for GC threads ) |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
(I'm not sure this has to be a proposal at all. This is more like a bug report. See https://golang.org/s/proposal.) |
Changing this from a proposal into a feature request for the runtime package. |
GOMAXPROCS
cfs-aware on GOOS=linux
GOMAXPROCS
cfs-aware on GOOS=linux
This comment was marked as outdated.
This comment was marked as outdated.
Perhaps due to etcd failing due to mismatch between the CPU limits and the apparent available CPUs according to GOMAXPROCS See golang/go#33803
Perhaps due to etcd failing due to mismatch between the CPU limits and the apparent available CPUs according to GOMAXPROCS See golang/go#33803
Perhaps due to etcd failing due to mismatch between the CPU limits and the apparent available CPUs according to GOMAXPROCS See golang/go#33803
GOMAXPROCS subsumes NumCPU for the purpose of sizing semaphores. If users set CPU affinity, then GOMAXPROCS will reflect that. If users only set GOMAXPROCS, then NumCPU would be inaccurate. Additionally, there are plans to make GOMAXPROCS aware of CPU quotas (golang/go#33803). Users are still advised to set CPU affinity instead of relying on GOMAXPROCS to limit CPU usage, because Staticcheck shells out to the underlying build system, which together with Staticcheck would be able to use more CPU than intended if limited by just GOMAXPROCS.
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` is the same as previous commit ``` $ export PATH=/home/thockin/sdk/gotip/bin:$PATH $ export FORCE_HOST_GO=true $ make kubectl +++ [0527 10:25:24] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [0527 10:25:57] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:26:29] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make test WHAT=./cmd/kubectl +++ [0527 10:26:59] Setting GOMAXPROCS: 12 +++ [0527 10:26:59] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:27:13] Setting GOMAXPROCS: 12 +++ [0527 10:27:13] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make WHAT=./staging/src/k8s.io/api +++ [0527 10:27:28] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:846 kube::golang::build_some_binaries(...) !!! [0527 10:27:28] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1008 kube::golang::build_binaries_for_platform(...) !!! [0527 10:27:28] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:92: all] Error 1 $ make WHAT=k8s.io/api +++ [0527 10:27:40] Building go targets for linux/amd64 k8s.io/api (non-static) $ make test WHAT=./staging/src/k8s.io/api +++ [0527 10:27:56] Setting GOMAXPROCS: 12 +++ [0527 10:27:56] Running tests without code coverage and with -race code in directory /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/api expects import "k8s.io/api" make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/api +++ [0527 10:28:14] Setting GOMAXPROCS: 12 !!! [0527 10:28:14] specified test path '${GOPATH}/src/k8s.io/api' does not exist make: *** [Makefile:184: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` is the same as previous commit ``` $ export PATH=/home/thockin/sdk/gotip/bin:$PATH $ export FORCE_HOST_GO=true $ make kubectl +++ [0527 10:25:24] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [0527 10:25:57] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:26:29] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make test WHAT=./cmd/kubectl +++ [0527 10:26:59] Setting GOMAXPROCS: 12 +++ [0527 10:26:59] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:27:13] Setting GOMAXPROCS: 12 +++ [0527 10:27:13] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make WHAT=./staging/src/k8s.io/api +++ [0527 10:27:28] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:846 kube::golang::build_some_binaries(...) !!! [0527 10:27:28] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1008 kube::golang::build_binaries_for_platform(...) !!! [0527 10:27:28] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:92: all] Error 1 $ make WHAT=k8s.io/api +++ [0527 10:27:40] Building go targets for linux/amd64 k8s.io/api (non-static) $ make test WHAT=./staging/src/k8s.io/api +++ [0527 10:27:56] Setting GOMAXPROCS: 12 +++ [0527 10:27:56] Running tests without code coverage and with -race code in directory /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/api expects import "k8s.io/api" make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/api +++ [0527 10:28:14] Setting GOMAXPROCS: 12 !!! [0527 10:28:14] specified test path '${GOPATH}/src/k8s.io/api' does not exist make: *** [Makefile:184: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` is the same as previous commit ``` $ make kubectl +++ [0527 10:25:24] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [0527 10:25:57] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:26:29] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make test WHAT=./cmd/kubectl +++ [0527 10:26:59] Setting GOMAXPROCS: 12 +++ [0527 10:26:59] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:27:13] Setting GOMAXPROCS: 12 +++ [0527 10:27:13] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make WHAT=./staging/src/k8s.io/api +++ [0527 10:27:28] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:846 kube::golang::build_some_binaries(...) !!! [0527 10:27:28] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1008 kube::golang::build_binaries_for_platform(...) !!! [0527 10:27:28] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:92: all] Error 1 $ make WHAT=k8s.io/api +++ [0527 10:27:40] Building go targets for linux/amd64 k8s.io/api (non-static) $ make test WHAT=./staging/src/k8s.io/api +++ [0527 10:27:56] Setting GOMAXPROCS: 12 +++ [0527 10:27:56] Running tests without code coverage and with -race code in directory /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/api expects import "k8s.io/api" make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/api +++ [0527 10:28:14] Setting GOMAXPROCS: 12 !!! [0527 10:28:14] specified test path '${GOPATH}/src/k8s.io/api' does not exist make: *** [Makefile:184: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` is the same as previous commit ``` $ make kubectl +++ [0527 10:25:24] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [0527 10:25:57] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:26:29] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make test WHAT=./cmd/kubectl +++ [0527 10:26:59] Setting GOMAXPROCS: 12 +++ [0527 10:26:59] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:27:13] Setting GOMAXPROCS: 12 +++ [0527 10:27:13] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make WHAT=./staging/src/k8s.io/api +++ [0527 10:27:28] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:846 kube::golang::build_some_binaries(...) !!! [0527 10:27:28] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1008 kube::golang::build_binaries_for_platform(...) !!! [0527 10:27:28] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:92: all] Error 1 $ make WHAT=k8s.io/api +++ [0527 10:27:40] Building go targets for linux/amd64 k8s.io/api (non-static) $ make test WHAT=./staging/src/k8s.io/api +++ [0527 10:27:56] Setting GOMAXPROCS: 12 +++ [0527 10:27:56] Running tests without code coverage and with -race code in directory /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/api expects import "k8s.io/api" make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/api +++ [0527 10:28:14] Setting GOMAXPROCS: 12 !!! [0527 10:28:14] specified test path '${GOPATH}/src/k8s.io/api' does not exist make: *** [Makefile:184: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` is the same as previous commit ``` $ make kubectl +++ [0527 10:25:24] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [0527 10:25:57] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:26:29] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make test WHAT=./cmd/kubectl +++ [0527 10:26:59] Setting GOMAXPROCS: 12 +++ [0527 10:26:59] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:27:13] Setting GOMAXPROCS: 12 +++ [0527 10:27:13] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make WHAT=./staging/src/k8s.io/api +++ [0527 10:27:28] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:846 kube::golang::build_some_binaries(...) !!! [0527 10:27:28] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1008 kube::golang::build_binaries_for_platform(...) !!! [0527 10:27:28] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:92: all] Error 1 $ make WHAT=k8s.io/api +++ [0527 10:27:40] Building go targets for linux/amd64 k8s.io/api (non-static) $ make test WHAT=./staging/src/k8s.io/api +++ [0527 10:27:56] Setting GOMAXPROCS: 12 +++ [0527 10:27:56] Running tests without code coverage and with -race code in directory /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/api expects import "k8s.io/api" make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/api +++ [0527 10:28:14] Setting GOMAXPROCS: 12 !!! [0527 10:28:14] specified test path '${GOPATH}/src/k8s.io/api' does not exist make: *** [Makefile:184: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` is the same as previous commit ``` $ make kubectl +++ [0527 10:25:24] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [0527 10:25:57] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:26:29] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make test WHAT=./cmd/kubectl +++ [0527 10:26:59] Setting GOMAXPROCS: 12 +++ [0527 10:26:59] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:27:13] Setting GOMAXPROCS: 12 +++ [0527 10:27:13] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make WHAT=./staging/src/k8s.io/api +++ [0527 10:27:28] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:846 kube::golang::build_some_binaries(...) !!! [0527 10:27:28] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1008 kube::golang::build_binaries_for_platform(...) !!! [0527 10:27:28] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:92: all] Error 1 $ make WHAT=k8s.io/api +++ [0527 10:27:40] Building go targets for linux/amd64 k8s.io/api (non-static) $ make test WHAT=./staging/src/k8s.io/api +++ [0527 10:27:56] Setting GOMAXPROCS: 12 +++ [0527 10:27:56] Running tests without code coverage and with -race code in directory /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/api expects import "k8s.io/api" make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/api +++ [0527 10:28:14] Setting GOMAXPROCS: 12 !!! [0527 10:28:14] specified test path '${GOPATH}/src/k8s.io/api' does not exist make: *** [Makefile:184: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` is the same as previous commit ``` $ make kubectl +++ [0527 10:25:24] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [0527 10:25:57] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:26:29] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make test WHAT=./cmd/kubectl +++ [0527 10:26:59] Setting GOMAXPROCS: 12 +++ [0527 10:26:59] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:27:13] Setting GOMAXPROCS: 12 +++ [0527 10:27:13] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make WHAT=./staging/src/k8s.io/api +++ [0527 10:27:28] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:846 kube::golang::build_some_binaries(...) !!! [0527 10:27:28] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1008 kube::golang::build_binaries_for_platform(...) !!! [0527 10:27:28] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:92: all] Error 1 $ make WHAT=k8s.io/api +++ [0527 10:27:40] Building go targets for linux/amd64 k8s.io/api (non-static) $ make test WHAT=./staging/src/k8s.io/api +++ [0527 10:27:56] Setting GOMAXPROCS: 12 +++ [0527 10:27:56] Running tests without code coverage and with -race code in directory /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/api expects import "k8s.io/api" make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/api +++ [0527 10:28:14] Setting GOMAXPROCS: 12 !!! [0527 10:28:14] specified test path '${GOPATH}/src/k8s.io/api' does not exist make: *** [Makefile:184: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` is the same as previous commit ``` $ make kubectl +++ [0527 10:25:24] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [0527 10:25:57] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:26:29] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make test WHAT=./cmd/kubectl +++ [0527 10:26:59] Setting GOMAXPROCS: 12 +++ [0527 10:26:59] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:27:13] Setting GOMAXPROCS: 12 +++ [0527 10:27:13] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make WHAT=./staging/src/k8s.io/api +++ [0527 10:27:28] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:846 kube::golang::build_some_binaries(...) !!! [0527 10:27:28] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1008 kube::golang::build_binaries_for_platform(...) !!! [0527 10:27:28] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:92: all] Error 1 $ make WHAT=k8s.io/api +++ [0527 10:27:40] Building go targets for linux/amd64 k8s.io/api (non-static) $ make test WHAT=./staging/src/k8s.io/api +++ [0527 10:27:56] Setting GOMAXPROCS: 12 +++ [0527 10:27:56] Running tests without code coverage and with -race code in directory /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/api expects import "k8s.io/api" make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/api +++ [0527 10:28:14] Setting GOMAXPROCS: 12 !!! [0527 10:28:14] specified test path '${GOPATH}/src/k8s.io/api' does not exist make: *** [Makefile:184: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` is the same as previous commit ``` $ make kubectl +++ [0527 10:25:24] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [0527 10:25:57] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:26:29] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make test WHAT=./cmd/kubectl +++ [0527 10:26:59] Setting GOMAXPROCS: 12 +++ [0527 10:26:59] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:27:13] Setting GOMAXPROCS: 12 +++ [0527 10:27:13] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make WHAT=./staging/src/k8s.io/api +++ [0527 10:27:28] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:846 kube::golang::build_some_binaries(...) !!! [0527 10:27:28] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1008 kube::golang::build_binaries_for_platform(...) !!! [0527 10:27:28] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:92: all] Error 1 $ make WHAT=k8s.io/api +++ [0527 10:27:40] Building go targets for linux/amd64 k8s.io/api (non-static) $ make test WHAT=./staging/src/k8s.io/api +++ [0527 10:27:56] Setting GOMAXPROCS: 12 +++ [0527 10:27:56] Running tests without code coverage and with -race code in directory /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/api expects import "k8s.io/api" make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/api +++ [0527 10:28:14] Setting GOMAXPROCS: 12 !!! [0527 10:28:14] specified test path '${GOPATH}/src/k8s.io/api' does not exist make: *** [Makefile:184: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` is the same as previous commit ``` $ make kubectl +++ [0527 10:25:24] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [0527 10:25:57] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:26:29] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make test WHAT=./cmd/kubectl +++ [0527 10:26:59] Setting GOMAXPROCS: 12 +++ [0527 10:26:59] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:27:13] Setting GOMAXPROCS: 12 +++ [0527 10:27:13] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make WHAT=./staging/src/k8s.io/api +++ [0527 10:27:28] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:846 kube::golang::build_some_binaries(...) !!! [0527 10:27:28] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1008 kube::golang::build_binaries_for_platform(...) !!! [0527 10:27:28] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:92: all] Error 1 $ make WHAT=k8s.io/api +++ [0527 10:27:40] Building go targets for linux/amd64 k8s.io/api (non-static) $ make test WHAT=./staging/src/k8s.io/api +++ [0527 10:27:56] Setting GOMAXPROCS: 12 +++ [0527 10:27:56] Running tests without code coverage and with -race code in directory /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/api expects import "k8s.io/api" make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/api +++ [0527 10:28:14] Setting GOMAXPROCS: 12 !!! [0527 10:28:14] specified test path '${GOPATH}/src/k8s.io/api' does not exist make: *** [Makefile:184: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` is the same as previous commit ``` $ make kubectl +++ [0527 10:25:24] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [0527 10:25:57] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:26:29] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make test WHAT=./cmd/kubectl +++ [0527 10:26:59] Setting GOMAXPROCS: 12 +++ [0527 10:26:59] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/kubernetes/cmd/kubectl +++ [0527 10:27:13] Setting GOMAXPROCS: 12 +++ [0527 10:27:13] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:184: test] Error 1 $ make WHAT=./staging/src/k8s.io/api +++ [0527 10:27:28] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:846 kube::golang::build_some_binaries(...) !!! [0527 10:27:28] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1008 kube::golang::build_binaries_for_platform(...) !!! [0527 10:27:28] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [0527 10:27:28] Call tree: !!! [0527 10:27:28] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:92: all] Error 1 $ make WHAT=k8s.io/api +++ [0527 10:27:40] Building go targets for linux/amd64 k8s.io/api (non-static) $ make test WHAT=./staging/src/k8s.io/api +++ [0527 10:27:56] Setting GOMAXPROCS: 12 +++ [0527 10:27:56] Running tests without code coverage and with -race code in directory /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/staging/src/k8s.io/api expects import "k8s.io/api" make: *** [Makefile:184: test] Error 1 $ make test WHAT=k8s.io/api +++ [0527 10:28:14] Setting GOMAXPROCS: 12 !!! [0527 10:28:14] specified test path '${GOPATH}/src/k8s.io/api' does not exist make: *** [Makefile:184: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` works for k/k: ``` $ make kubectl +++ [1211 11:07:31] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [1211 11:08:19] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [1211 11:08:52] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) ``` Result: `make` works for stagin by package: ``` $ make WHAT=k8s.io/api +++ [1211 11:11:37] Building go targets for linux/amd64 k8s.io/api (non-static) ``` Result: `make` fails for staging by path: ``` $ make WHAT=./staging/src/k8s.io/api +++ [1211 11:12:44] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [1211 11:12:44] Call tree: !!! [1211 11:12:44] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:850 kube::golang::build_some_binaries(...) !!! [1211 11:12:44] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1012 kube::golang::build_binaries_for_platform(...) !!! [1211 11:12:44] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [1211 11:12:44] Call tree: !!! [1211 11:12:44] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [1211 11:12:44] Call tree: !!! [1211 11:12:44] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:96: all] Error 1 ``` Result: `make test` fails: ``` $ make test WHAT=./cmd/kubectl +++ [1211 11:13:38] Set GOMAXPROCS automatically to 6 +++ [1211 11:13:38] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:191: test] Error 1 ```
This makes "new" and "old" setup_env functions. In subsequent commits, all callers of the "old" form will be fixed, and the "new" will be renamed back. The old and new functions diff: ```diff --- /tmp/old 2023-05-06 12:03:23.913951720 -0700 +++ /tmp/new 2023-05-06 12:06:37.688300514 -0700 --- a 2023-05-27 10:20:55.477856825 -0700 +++ b 2023-05-27 10:23:13.253192669 -0700 @@ -1,4 +1,4 @@ -kube::golang::old::setup_env() { +kube::golang::new::setup_env() { kube::golang::verify_go_version # Set up GOPATH. We have tools which depend on being in a GOPATH (see @@ -7,9 +7,9 @@ # Even in module mode, we need to set GOPATH for `go build` and `go install` # to work. We build various tools (usually via `go install`) from a lot of # scripts. - # * We can't set GOBIN because that does not work on cross-compiles. - # * We could use `go build -o <something>`, but it's subtle when it comes - # to cross-compiles and whether the <something> is a file or a directory, + # * We can't just set GOBIN because that does not work on cross-compiles. + # * We could always use `go build -o <something>`, but it's subtle wrt + # cross-compiles and whether the <something> is a file or a directory, # and EVERY caller has to get it *just* right. # * We could leave GOPATH alone and let `go install` write binaries # wherever the user's GOPATH says (or doesn't say). @@ -20,7 +20,6 @@ # # Eventually, when we no longer rely on run-in-gopath.sh we may be able to # simplify this some. - kube::golang::old::create_gopath_tree export GOPATH="${KUBE_GOPATH}" # If these are not set, set them now. This ensures that any subsequent @@ -31,23 +30,12 @@ # Make sure our own Go binaries are in PATH. export PATH="${KUBE_GOPATH}/bin:${PATH}" - # Change directories so that we are within the GOPATH. Some tools get really - # upset if this is not true. We use a whole fake GOPATH here to collect the - # resultant binaries. - local subdir - subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") - cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 - - # Set GOROOT so binaries that parse code can work properly. - GOROOT=$(go env GOROOT) - export GOROOT - # Unset GOBIN in case it already exists in the current session. # Cross-compiles will not work with it set. unset GOBIN - # This seems to matter to some tools - export GO15VENDOREXPERIMENT=1 + # Explicitly turn on modules. + export GO111MODULE=on # GOMAXPROCS by default does not reflect the number of cpu(s) available # when running in a container, please see golang/go#33803 @@ -58,8 +46,6 @@ # shellcheck disable=SC2164 popd >/dev/null fi - - GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} - export GOMAXPROCS - kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" + export GOMAXPROCS=${GOMAXPROCS:-$(ncpu)} + V=3 kube::log::status "Setting GOMAXPROCS: ${GOMAXPROCS}" } ``` Result: `make` works for k/k: ``` $ make kubectl +++ [1211 11:07:31] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) $ make WHAT=./cmd/kubectl/ +++ [1211 11:08:19] Building go targets for linux/amd64 k8s.io/kubernetes/./cmd/kubectl/ (non-static) $ make WHAT=k8s.io/kubernetes/cmd/kubectl +++ [1211 11:08:52] Building go targets for linux/amd64 k8s.io/kubernetes/cmd/kubectl (static) ``` Result: `make` works for stagin by package: ``` $ make WHAT=k8s.io/api +++ [1211 11:11:37] Building go targets for linux/amd64 k8s.io/api (non-static) ``` Result: `make` fails for staging by path: ``` $ make WHAT=./staging/src/k8s.io/api +++ [1211 11:12:44] Building go targets for linux/amd64 k8s.io/kubernetes/./staging/src/k8s.io/api (non-static) cannot find module providing package k8s.io/kubernetes/staging/src/k8s.io/api: import lookup disabled by -mod=vendor (Go version in go.work is at least 1.14 and vendor directory exists.) !!! [1211 11:12:44] Call tree: !!! [1211 11:12:44] 1: /home/thockin/src/kubernetes/hack/lib/golang.sh:850 kube::golang::build_some_binaries(...) !!! [1211 11:12:44] 2: /home/thockin/src/kubernetes/hack/lib/golang.sh:1012 kube::golang::build_binaries_for_platform(...) !!! [1211 11:12:44] 3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [1211 11:12:44] Call tree: !!! [1211 11:12:44] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) !!! [1211 11:12:44] Call tree: !!! [1211 11:12:44] 1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...) make: *** [Makefile:96: all] Error 1 ``` Result: `make test` fails: ``` $ make test WHAT=./cmd/kubectl +++ [1211 11:13:38] Set GOMAXPROCS automatically to 6 +++ [1211 11:13:38] Running tests without code coverage and with -race cmd/kubectl/kubectl.go:25:2: cannot find package "k8s.io/client-go/plugin/pkg/client/auth" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/client-go/plugin/pkg/client/auth (from $GOPATH) cmd/kubectl/kubectl.go:20:2: cannot find package "k8s.io/component-base/cli" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/component-base/cli (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/component-base/cli (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/component-base/cli (from $GOPATH) cmd/kubectl/kubectl.go:21:2: cannot find package "k8s.io/kubectl/pkg/cmd" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd (from $GOPATH) cmd/kubectl/kubectl.go:22:2: cannot find package "k8s.io/kubectl/pkg/cmd/util" in any of: /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util (vendor tree) /home/thockin/sdk/gotip/src/k8s.io/kubectl/pkg/cmd/util (from $GOROOT) /home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubectl/pkg/cmd/util (from $GOPATH) make: *** [Makefile:191: test] Error 1 ```
Problem
The default setting of
runtime.GOMAXPROCS()
(to be the number of os-apparent processors) can be greatly misaligned with container cpu quota (e.g. as implemented through cfs bandwidth control by docker).This can lead to large latency artifacts in programs, especially under peak load, or when saturating all processors during background GC phases.
The smaller the container / larger the machine = the worse this effect becomes: let's say you deploy a fleet of micro service workers, each container having a cpu quota of 4, on a fleet of 32 processor[1] machines.
To understand why, you really have to understand the CFS quota mechanism; this blog post does well (with pictures); this kubernetes issue further explores the topic (especially as it relates to a recently resolved kernel cpu accounting bug). But to summarize it briefly for this issue:
period
, say 100msquota
, say 400ms to affect a 4-processor quotaperiod
, once the process group exceeds itsquota
it is throttledRunning an application workload at a reasonable level of cpu efficiency makes it quite likely that you'll be spiking up to your full quota and getting throttled.
Background waste workload, like concurrent GC[2], is especially likely to cause quota exhaustion.
I hesitate to even call this a "tail latency" problem; the artifacts are visible in the main body of and can shift the entire latency distribution.
Solution
If you care about latency, reliability, predictability (... insert more *ilities to taste), then the correct thing to do is to never exceed your cpu quota, by setting
GOMAXPROCS=max(1, floor(cpu_quota))
.Using this as a default for GOMAXPROCS makes the world safe again, which is why we use uber-go/automaxprocs in all of our microservices.
NOTEs
The text was updated successfully, but these errors were encountered: