kubernetes/hack
Tim Hockin 8b579b2347
Change the build_binaries path to use modules
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/a	2023-12-14 09:02:57.804092696 -0800
+++ /tmp/b	2023-12-14 09:03:09.679999585 -0800
@@ -1,4 +1,4 @@
-kube::golang::old::setup_env() {
+kube::golang:🆕: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,16 +20,6 @@
   #
   # Eventually, when we no longer rely on run-in-gopath.sh we may be able to
   # simplify this some.
-  local go_pkg_dir="${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}"
-  local go_pkg_basedir
-  go_pkg_basedir=$(dirname "${go_pkg_dir}")
-
-  mkdir -p "${go_pkg_basedir}"
-
-  # TODO: This symlink should be relative.
-  if [[ ! -e "${go_pkg_dir}" || "$(readlink "${go_pkg_dir}")" != "${KUBE_ROOT}" ]]; then
-    ln -snf "${KUBE_ROOT}" "${go_pkg_dir}"
-  fi
   export GOPATH="${KUBE_GOPATH}"

   # If these are not set, set them now.  This ensures that any subsequent
@@ -40,24 +30,10 @@
   # 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
-
-  # Disable workspaces
-  export GOWORK=off
+  # Explicitly turn on modules.
+  export GO111MODULE=on
 }
```

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 staging 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
```
2024-02-29 00:22:07 -08:00
..
boilerplate boilerplate_test:fix pylint warnings 2024-01-24 11:05:26 +02:00
conformance e2e: remove redundant spaces in test names 2023-09-29 08:30:57 +02:00
e2e-internal hack/update-bazel.sh 2021-02-28 15:17:29 -08:00
gen-swagger-doc Bash script syntax improvements 2019-01-19 13:58:58 +01:00
jenkins Defer builds to test-cmd and test-integration targets 2023-02-01 15:35:14 -05:00
lib Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
make-rules Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
testdata Drop hack/verify-govet-levee 2024-01-04 21:06:52 -05:00
tools Generate go.work files 2024-02-29 00:22:06 -08:00
verify-flags kubelet: create top-level traces for pod sync and GC 2023-03-11 10:42:14 +01:00
.descriptions_failures Add missing comments in APF API types 2021-06-25 00:27:40 -04:00
.import-aliases scheduler: remove deprecated v1beta2 KubeSchedulerConfiguration 2023-08-17 13:27:21 +08:00
.spelling_failures Add gimme 2023-02-01 16:34:23 -05:00
benchmark-go.sh add comment in several hack/ sh scripts. 2020-01-27 11:13:09 +09:00
build-cross.sh add comment in several hack/ sh scripts. 2020-01-27 11:13:09 +09:00
build-go.sh add comment in several hack/ sh scripts. 2020-01-27 11:13:09 +09:00
cherry_pick_pull.sh Update cherry_pick_pull.sh 2022-06-26 09:21:05 +05:30
dev-build-and-push.sh fix shellcheck failure 2019-01-22 08:39:55 +08:00
dev-build-and-up.sh fix shellcheck failure 2019-01-22 08:39:55 +08:00
dev-push-conformance.sh Build Ginkgo binary 2022-07-08 10:46:11 +08:00
e2e-node-test.sh add comment in several hack/ sh scripts. 2020-01-27 11:13:09 +09:00
generate-docs.sh fix some shellcheck failures in hack 2019-02-25 11:38:56 +08:00
get-build.sh fix: use dl.k8s.io, not kubernetes-release bucket 2023-05-13 10:57:41 +00:00
ginkgo-e2e.sh Fix ginkgo deprecation warning 2023-05-31 12:53:11 +03:00
golangci-hints.yaml golangci-lint: add hints for error wrapping 2024-02-13 14:12:04 +01:00
golangci-strict.yaml Migrate cmd/kube-proxy to contextual logging (#122197) 2024-01-08 17:30:18 +01:00
golangci.yaml Migrate cmd/kube-proxy to contextual logging (#122197) 2024-01-08 17:30:18 +01:00
golangci.yaml.in golangci-lint: add hints for error wrapping 2024-02-13 14:12:04 +01:00
grab-profiles.sh Fix exit code check in hack/grab-profiles.sh 2021-05-17 14:47:05 +08:00
install-etcd.sh Add comments in several hack/*.sh 2020-01-28 09:27:40 +09:00
install-protoc.sh Add helper script to install protoc 2023-01-26 18:00:08 -05:00
lint-dependencies.sh exit 1 if status are not as expected(order) 2023-06-18 14:09:50 +08:00
list-feature-tests.sh Add comments in several hack/*.sh 2020-01-28 09:27:40 +09:00
local-up-cluster.sh Merge pull request #122612 from mtardy/remove-scdeny 2024-02-12 08:37:13 -08:00
logcheck.conf Migrate cmd/kube-proxy to contextual logging (#122197) 2024-01-08 17:30:18 +01:00
module-graph.sh Make sure the _output folder exists before using it from module-graph.sh 2020-07-07 01:19:59 -07:00
OWNERS lavalamp is taking a long break 2023-05-11 16:43:38 +00:00
pin-dependency.sh Stop adding explicit replace directives for all requires 2022-10-28 15:15:18 -04:00
print-workspace-status.sh Remove invalid comments in hack/lib/version.sh 2022-07-06 19:19:29 +08:00
README.md add README.md in hack/ 2020-01-16 10:12:18 +08:00
run-in-gopath.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
run-prometheus-on-etcd-scrapes.sh Add serving of scrapes as Prometheus metrics 2021-11-08 15:28:05 -05:00
serve-prom-scrapes.sh Fixed typo in hack/serve-prom-scrapes.sh 2022-02-04 01:33:06 -05:00
test-go.sh Add comments in several hack/*.sh 2020-01-28 09:27:40 +09:00
test-integration.sh Add comments in several hack/*.sh 2020-01-28 09:27:40 +09:00
unwanted-dependencies.json chore: Cleanup in-tree credential provider azure and cloud provider azure 2024-01-20 15:18:31 +08:00
update-all.sh refactor(hack): use ${BASH_SOURCE[0]} to get script name 2022-04-16 23:58:13 +08:00
update-codegen.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
update-conformance-yaml.sh Revert "Save a list of images used by e2e.test" 2024-01-12 13:15:01 -08:00
update-generated-api-compatibility-data.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
update-generated-docs.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
update-generated-proto-bindings-dockerized.sh Check protoc version strictly 2023-01-26 18:00:06 -05:00
update-generated-protobuf-dockerized.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
update-generated-stable-metrics.sh remove the rest of the bazel test wiring for metrics stability 2021-02-05 10:48:48 -08:00
update-go-workspace.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
update-gofmt.sh Make update-gofmt use ls-files 2023-01-22 15:16:23 -08:00
update-golangci-lint-config.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
update-import-aliases.sh *.sh: cleanup all white noise 2020-05-29 09:56:00 +08:00
update-internal-modules.sh [KMSv2] pkcs11 reference implementation using SoftHSM 2023-09-29 16:57:26 +00:00
update-kustomize.sh Update kubectl kustomize to kyaml/v0.14.1, cmd/config/v0.11.1, api/v0.13.2, kustomize/v5.0.1 2023-03-14 11:40:28 -05:00
update-mocks.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
update-netparse-cve.sh Make update-netparse-cve use ls-files 2023-01-22 15:21:37 -08:00
update-openapi-spec.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
update-translations.sh i18n: Fix bug where package-level variables are not translated. 2022-11-21 22:48:42 -05:00
update-vanity-imports.sh chore: adds consistent vanity import to files and provides tooling for verifying and updating them. (#120642) 2024-02-08 04:33:30 -08:00
update-vendor-licenses.sh Licensing: skip modules with fewer subdirs than mods 2023-01-03 16:48:35 +01:00
update-vendor.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
update-yamlfmt.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-all.sh refactor(hack): use ${BASH_SOURCE[0]} to get script name 2022-04-16 23:58:13 +08:00
verify-api-groups.sh Add discovery types 2022-10-19 17:27:25 +00:00
verify-boilerplate.sh Add comments in several hack/verify-*.sh 2020-01-16 13:54:58 +09:00
verify-cli-conventions.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-codegen.sh hack: move common "verify generated" shell code into function 2023-08-22 20:39:23 +02:00
verify-conformance-requirements.sh fix make verify (#115871) 2023-02-22 07:17:56 -08:00
verify-conformance-yaml.sh Revert "Save a list of images used by e2e.test" 2024-01-12 13:15:01 -08:00
verify-description.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-e2e-suites.sh e2e framework: track and report internal bugs 2023-10-10 18:15:46 +02:00
verify-e2e-test-ownership.sh declare and assign seperately in hack/verify-e2e-test-ownership.sh 2022-10-19 23:46:18 -07:00
verify-external-dependencies-version.sh Drop zeitgeist from tools go.mod 2023-05-17 08:37:53 -04:00
verify-fieldname-docs.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-file-sizes.sh verify-file-sizes.sh: ensure that no large binary files get added 2023-10-26 20:08:09 +02:00
verify-flags-underscore.py use python3 in hack 2023-01-12 11:20:41 +08:00
verify-generated-docs.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-generated-stable-metrics.sh remove the rest of the bazel test wiring for metrics stability 2021-02-05 10:48:48 -08:00
verify-go-workspace.sh Generate go.work files 2024-02-29 00:22:06 -08:00
verify-gofmt.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-golangci-lint-config.sh golangci-lint: suppress one issue, demote others to "hints" 2023-08-22 20:39:23 +02:00
verify-golangci-lint-pr-hints.sh hack: update golangci-lint verify scripts 2023-10-09 20:14:47 +02:00
verify-golangci-lint-pr.sh hack: update golangci-lint verify scripts 2023-10-09 20:14:47 +02:00
verify-golangci-lint.sh golangci-lint: inline logcheck configuration 2023-12-14 20:21:58 +01:00
verify-govulncheck.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-import-aliases.sh Add comments in several hack/verify-*.sh(g-r) 2020-01-20 17:10:55 +09:00
verify-import-boss.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-imports.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-internal-modules.sh hack: move common "verify generated" shell code into function 2023-08-22 20:39:23 +02:00
verify-licenses.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-mocks.sh hack: move common "verify generated" shell code into function 2023-08-22 20:39:23 +02:00
verify-netparse-cve.sh update and verify netparse 2021-08-20 10:42:09 +02:00
verify-no-vendor-cycles.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-non-mutating-validation.sh add verify script to catch most validation mutations 2021-10-08 14:37:55 -04:00
verify-openapi-docs-urls.sh Add a script to verify that URLs in API documentation are valid 2023-03-13 11:37:59 -07:00
verify-openapi-spec.sh Change the build_binaries path to use modules 2024-02-29 00:22:07 -08:00
verify-pkg-names.sh remove unnecessary kube::golang::verify_go_version calls 2023-09-11 14:06:28 -07:00
verify-prerelease-lifecycle-tags.sh remove unnecessary kube::golang::verify_go_version calls 2023-09-11 14:06:28 -07:00
verify-prometheus-imports.sh kubelet: Force deleted pods can fail to move out of terminating 2023-03-08 22:03:51 -06:00
verify-publishing-bot.py update verify script to check deprecated fields 2023-09-25 21:37:40 +05:30
verify-readonly-packages.sh remove clearly unnecessary lingering BUILD file references 2022-10-04 16:47:25 -07:00
verify-shellcheck.sh Bump shellcheck to 0.9.0 2024-01-26 16:26:40 -08:00
verify-spelling.sh move linting dependencies to hack/tools/tools.go 2020-04-20 13:45:38 -04:00
verify-staging-meta-files.sh Add comments in several hack/verify-*.sh(s-v) 2020-01-21 19:10:46 +09:00
verify-test-code.sh e2e framework: deprecate gomega wrappers 2023-02-23 09:51:42 +01:00
verify-test-featuregates.sh add test for the registered feature gates 2024-01-07 18:10:25 +02:00
verify-test-images.sh Add comments in several hack/verify-*.sh(s-v) 2020-01-21 19:10:46 +09:00
verify-testing-import.sh enable testing import check for kubeadm binary 2024-01-25 19:56:42 +08:00
verify-typecheck-providerless.sh Add KUBE_PROVIDERLESS for CI jobs to run with providerless tag 2024-01-07 15:20:57 -05:00
verify-typecheck.sh Revert "Make verify-typecheck.sh only check valid targets for a platform" 2024-01-22 20:45:25 -08:00
verify-vendor-licenses.sh Remove docker remote/docker-machine from build scripts 2020-12-30 12:37:51 -05:00
verify-vendor.sh Improve vendor verification works for each staging repo 2023-01-10 09:30:47 -05:00
verify-yamlfmt.sh hack: move common "verify generated" shell code into function 2023-08-22 20:39:23 +02:00

Kubernetes hack GuideLines

This document describes how you can use the scripts from hack directory and gives a brief introduction and explanation of these scripts.

Overview

The hack directory contains many scripts that ensure continuous development of kubernetes, enhance the robustness of the code, improve development efficiency, etc. The explanations and descriptions of these scripts are helpful for contributors. For details, refer to the following guidelines.

Key scripts

  • verify-all.sh: This script is a vestigial redirection, Please do not add "real" logic. It is equivalent to make verify.
  • update-all.sh: This script is a vestigial redirection, Please do not add "real" logic. The true target of this makerule is hack/make-rules/update.sh.It is equivalent to make update.

Attention

Note that all scripts must be run from the Kubernetes root directory. We should run hack/verify-all.sh before submitting a PR and if anything fails run hack/update-all.sh.