kubernetes/hack
Patrick Ohly 65b841c077
Generate go.work files
This creates go.work and enables Go Workspaces.  This is a file that
includes info on k/k and all the staging modules.

This depends on go 1.22 and setting FORCE_HOST_GO=true (for kube
scripts, which try to be hermetic).

Make this part of the normal update/verify sequence.

The top-level go.work file contains no replace statements. Instead, the
replace statements in the individual go.mod files are used. For this to
work, replace statements in the individual go.mod files have to be
consistent.

hack/tools has different dependencies and can't be in the main
workspace, so this adds a go.work just for that.  Without this, go tries
to consider all deps in all modules and pick one that works for all.
This is problematic because there are so many of them that it is
difficult to manage.

Likewise for k8s.io/code-generator/examples and
k8s.io/kms/internal/plugins/_mock - add trivial go.work files.

For example k/k depends on an older version of a lib that gloangci-lint
needs (transitively) and it breaks.

This also updates vendor (needed to make go happy), and removes
vendor'ed symlinks.  This breaks a LOT of our build tools, which will be
fixed subsequently.

Result: `go` commands work across modules:

Before:
```
$ go list ./pkg/proxy/iptables/ ./staging/src/k8s.io/api/core/v1/
main module (k8s.io/kubernetes) does not contain package k8s.io/kubernetes/staging/src/k8s.io/api/core/v1

$ go build ./pkg/proxy/iptables/ ./staging/src/k8s.io/api
main module (k8s.io/kubernetes) does not contain package k8s.io/kubernetes/staging/src/k8s.io/api

$ go test ./pkg/proxy/iptables/ ./staging/src/k8s.io/api
main module (k8s.io/kubernetes) does not contain package k8s.io/kubernetes/staging/src/k8s.io/api
```

After:
```
$ go list ./pkg/proxy/iptables/ ./staging/src/k8s.io/api/core/v1/
k8s.io/kubernetes/pkg/proxy/iptables
k8s.io/api/core/v1

$ go build ./pkg/proxy/iptables/ ./staging/src/k8s.io/api

$ go test ./pkg/proxy/iptables/ ./staging/src/k8s.io/api
ok  	k8s.io/kubernetes/pkg/proxy/iptables	0.360s
ok  	k8s.io/api	2.302s
```

Result: `make` fails:

```
$ make
go version go1.22rc1 linux/amd64
+++ [0106 12:11:03] Building go targets for linux/amd64
    k8s.io/kubernetes/cmd/kube-proxy (static)
    k8s.io/kubernetes/cmd/kube-apiserver (static)
    k8s.io/kubernetes/cmd/kube-controller-manager (static)
    k8s.io/kubernetes/cmd/kubelet (non-static)
    k8s.io/kubernetes/cmd/kubeadm (static)
    k8s.io/kubernetes/cmd/kube-scheduler (static)
    k8s.io/component-base/logs/kube-log-runner (static)
    k8s.io/kube-aggregator (static)
    k8s.io/apiextensions-apiserver (static)
    k8s.io/kubernetes/cluster/gce/gci/mounter (static)
    k8s.io/kubernetes/cmd/kubectl (static)
    k8s.io/kubernetes/cmd/kubectl-convert (static)
    github.com/onsi/ginkgo/v2/ginkgo (non-static)
    k8s.io/kubernetes/test/e2e/e2e.test (test)
    k8s.io/kubernetes/test/conformance/image/go-runner (non-static)
    k8s.io/kubernetes/cmd/kubemark (static)
    github.com/onsi/ginkgo/v2/ginkgo (non-static)
    k8s.io/kubernetes/test/e2e_node/e2e_node.test (test)
test/e2e/e2e.go:35:2: cannot find package "k8s.io/api/apps/v1" in any of:
	/home/thockin/src/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/api/apps/v1 (vendor tree)
	/home/thockin/src/kubernetes/_output/local/.gimme/versions/go1.22rc1.linux.amd64/src/k8s.io/api/apps/v1 (from $GOROOT)
	/home/thockin/src/kubernetes/_output/local/go/src/k8s.io/api/apps/v1 (from $GOPATH)
	... more ...
	... more ...
	... more ...
!!! [0106 12:13:41] Call tree:
!!! [0106 12:13:41]  1: /home/thockin/src/kubernetes/hack/lib/golang.sh:948 kube::golang::build_binaries_for_platform(...)
!!! [0106 12:13:41]  2: hack/make-rules/build.sh:27 kube::golang::build_binaries(...)
!!! [0106 12:13:41] Call tree:
!!! [0106 12:13:41]  1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...)
!!! [0106 12:13:41] Call tree:
!!! [0106 12:13:41]  1: hack/make-rules/build.sh:27 kube::golang::build_binaries(...)
make: *** [Makefile:96: all] Error 1
```

Again, this requires go 1.22 (e.g. gotip), as go 1.21.x does not have
`go work vendor` support.

TO REPEAT:
    ( \
      ./hack/update-go-workspace.sh; \
      ./hack/update-vendor.sh; \
      ./hack/update-go-workspace.sh; \
    )
2024-02-29 00:22:06 -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
jenkins Defer builds to test-cmd and test-integration targets 2023-02-01 15:35:14 -05:00
lib Merge pull request #122880 from Jefftree/agg-discovery-v2-types 2024-02-20 21:03:22 -08:00
make-rules Generate go.work files 2024-02-29 00:22:06 -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
build-cross.sh
build-go.sh
cherry_pick_pull.sh Update cherry_pick_pull.sh 2022-06-26 09:21:05 +05:30
dev-build-and-push.sh
dev-build-and-up.sh
dev-push-conformance.sh Build Ginkgo binary 2022-07-08 10:46:11 +08:00
e2e-node-test.sh
generate-docs.sh
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
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
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
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
run-in-gopath.sh
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
test-integration.sh
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 codegen: Use long flag names for clarity 2024-01-14 16:12:09 -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 Add CRD compatibility objects 2023-02-27 14:12:59 -05:00
update-generated-docs.sh
update-generated-proto-bindings-dockerized.sh Check protoc version strictly 2023-01-26 18:00:06 -05:00
update-generated-protobuf-dockerized.sh Check protoc version strictly 2023-01-26 18:00:06 -05: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 Generate go.work files 2024-02-29 00:22:06 -08:00
update-gofmt.sh Make update-gofmt use ls-files 2023-01-22 15:16:23 -08:00
update-golangci-lint-config.sh golangci-lint: suppress one issue, demote others to "hints" 2023-08-22 20:39:23 +02:00
update-import-aliases.sh
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 cleanup update-mocks.sh 2023-04-21 16:15:21 -07:00
update-netparse-cve.sh Make update-netparse-cve use ls-files 2023-01-22 15:21:37 -08:00
update-openapi-spec.sh automatically setup etcd when running verify/update openapi-spec.sh 2023-10-25 11:22:45 -07: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 Generate go.work files 2024-02-29 00:22:06 -08:00
update-yamlfmt.sh call kube::golang::setup_env before setting up worktree 2023-04-21 16:15:21 -07: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
verify-cli-conventions.sh
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 hack/verify-description.sh: correctly look for versioned API types 2021-03-02 21:50:40 +05:30
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 Fix the name violation in apiextensions.k8s.io/v1,CustomResourceConversion, remove the failures file 2023-01-19 22:08:29 +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
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 cleanup verify-gofmt.sh 2021-03-07 12:51:33 -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 Add/update prechecks to verify-govulncheck.sh 2023-09-27 21:05:17 +05:30
verify-import-aliases.sh
verify-import-boss.sh Restrict what imports get into code within test/e2e_node 2023-08-21 15:04:23 -04:00
verify-imports.sh
verify-internal-modules.sh hack: move common "verify generated" shell code into function 2023-08-22 20:39:23 +02:00
verify-licenses.sh Missed a spot! testing verify-licenses.sh 2024-01-25 15:26:43 -05: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 verify-no-vendor-cycles: set up Go environment 2023-11-10 10:58:53 +01: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 Capture discovery API output in test fixtures 2023-05-15 14:18:18 -04: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
verify-staging-meta-files.sh
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
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.