HAS_LINT := $(shell command -v golangci-lint;) HAS_YAMLLINT := $(shell command -v yamllint;) HAS_SHELLCHECK := $(shell command -v shellcheck;) HAS_SETUP_ENVTEST := $(shell command -v setup-envtest;) HAS_MOCKGEN := $(shell command -v mockgen;) COMMIT := v1beta1-$(shell git rev-parse --short=7 HEAD) KATIB_REGISTRY := ghcr.io/kubeflow/katib CPU_ARCH ?= linux/amd64,linux/arm64 CONTROLLER_GEN_VERSION ?= v0.18.0 ENVTEST_K8S_VERSION ?= 1.34.0 ENVTEST_VERSION ?= release-0.22 MOCKGEN_VERSION ?= $(shell grep 'go.uber.org/mock' go.mod | cut -d ' ' -f 2) GO_VERSION=$(shell grep '^go' go.mod | cut -d ' ' -f 2) GOPATH ?= $(shell go env GOPATH) TEST_TENSORFLOW_EVENT_FILE_PATH ?= $(CURDIR)/test/unit/v1beta1/metricscollector/testdata/tfevent-metricscollector/logs # Run tests .PHONY: test test: envtest KUBEBUILDER_ASSETS="$(shell setup-envtest use $(ENVTEST_K8S_VERSION) -p path)" go test ./pkg/... ./cmd/... -coverprofile coverage.out envtest: ifndef HAS_SETUP_ENVTEST go install sigs.k8s.io/controller-runtime/tools/setup-envtest@$(ENVTEST_VERSION) $(info "setup-envtest has been installed") endif $(info "setup-envtest has already installed") check: generated-codes go-mod fmt vet lint fmt: hack/verify-gofmt.sh lint: ifndef HAS_LINT go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.64.7 $(info "golangci-lint has been installed") endif hack/verify-golangci-lint.sh yamllint: ifndef HAS_YAMLLINT pip install --prefer-binary yamllint $(info "yamllint has been installed") endif hack/verify-yamllint.sh vet: go vet ./pkg/... ./cmd/... shellcheck: ifndef HAS_SHELLCHECK bash hack/install-shellcheck.sh $(info "shellcheck has been installed") endif hack/verify-shellcheck.sh update: hack/update-gofmt.sh # Deploy Katib v1beta1 manifests using Kustomize into a k8s cluster. deploy: bash scripts/v1beta1/deploy.sh $(WITH_DATABASE_TYPE) # Undeploy Katib v1beta1 manifests using Kustomize from a k8s cluster undeploy: bash scripts/v1beta1/undeploy.sh generated-codes: generate ifneq ($(shell bash hack/verify-generated-codes.sh '.'; echo $$?),0) $(error 'Please run "make generate" to generate codes') endif go-mod: sync-go-mod ifneq ($(shell bash hack/verify-generated-codes.sh 'go.*'; echo $$?),0) $(error 'Please run "go mod tidy -go $(GO_VERSION)" to sync Go modules') endif sync-go-mod: go mod tidy -go $(GO_VERSION) .PHONY: go-mod-download go-mod-download: go mod download CONTROLLER_GEN = $(shell pwd)/bin/controller-gen .PHONY: controller-gen controller-gen: @GOBIN=$(shell pwd)/bin GO111MODULE=on go install sigs.k8s.io/controller-tools/cmd/controller-gen@${CONTROLLER_GEN_VERSION} # Run this if you update any existing controller APIs. # 1. Generate deepcopy, clientset, listers, informers for the APIs (hack/update-codegen.sh) # 2. Generate open-api for the APIs (hack/update-openapigen) # 3. Generate Python SDK for Katib (hack/gen-python-sdk/gen-sdk.sh) # 4. Generate gRPC manager APIs (pkg/apis/manager/v1beta1/build.sh and pkg/apis/manager/health/build.sh) # 5. Generate Go mock codes generate: go-mod-download controller-gen ifndef HAS_MOCKGEN go install go.uber.org/mock/mockgen@$(MOCKGEN_VERSION) $(info "mockgen has been installed") endif go generate ./pkg/... ./cmd/... hack/gen-python-sdk/gen-sdk.sh CONTAINER_RUNTIME=$(CONTAINER_RUNTIME) hack/python-api/gen-api.sh hack/update-proto.sh hack/update-mockgen.sh # Build images for the Katib v1beta1 components. build: generate ifeq ($(and $(REGISTRY),$(TAG),$(CPU_ARCH)),) $(error REGISTRY and TAG must be set. Usage: make build REGISTRY= TAG= CPU_ARCH=) endif bash scripts/v1beta1/build.sh $(REGISTRY) $(TAG) $(CPU_ARCH) # Build and push Katib images from the latest master commit. push-latest: generate bash scripts/v1beta1/build.sh $(KATIB_REGISTRY) latest $(CPU_ARCH) bash scripts/v1beta1/build.sh $(KATIB_REGISTRY) $(COMMIT) $(CPU_ARCH) bash scripts/v1beta1/push.sh $(KATIB_REGISTRY) latest bash scripts/v1beta1/push.sh $(KATIB_REGISTRY) $(COMMIT) # Build and push Katib images for the given tag. push-tag: ifeq ($(TAG),) $(error TAG must be set. Usage: make push-tag TAG=) endif bash scripts/v1beta1/build.sh $(KATIB_REGISTRY) $(TAG) $(CPU_ARCH) bash scripts/v1beta1/push.sh $(KATIB_REGISTRY) $(TAG) # Release a new version of Katib. release: ifeq ($(and $(BRANCH),$(TAG)),) $(error BRANCH and TAG must be set. Usage: make release BRANCH= TAG=) endif bash scripts/v1beta1/release.sh $(BRANCH) $(TAG) # Update all Katib images. update-images: ifeq ($(and $(OLD_PREFIX),$(NEW_PREFIX),$(TAG)),) $(error OLD_PREFIX, NEW_PREFIX, and TAG must be set. \ Usage: make update-images OLD_PREFIX= NEW_PREFIX= TAG= \ For more information, check this file: scripts/v1beta1/update-images.sh) endif bash scripts/v1beta1/update-images.sh $(OLD_PREFIX) $(NEW_PREFIX) $(TAG) # Prettier UI format check for Katib v1beta1. prettier-check: npm run format:check --prefix pkg/ui/v1beta1/frontend # Update boilerplate for the source code. update-boilerplate: ./hack/boilerplate/update-boilerplate.sh prepare-pytest: pip install --prefer-binary -r test/unit/v1beta1/requirements.txt pip install --prefer-binary -r cmd/suggestion/hyperopt/v1beta1/requirements.txt pip install --prefer-binary -r cmd/suggestion/optuna/v1beta1/requirements.txt pip install --prefer-binary -r cmd/suggestion/hyperband/v1beta1/requirements.txt pip install --prefer-binary -r cmd/suggestion/nas/enas/v1beta1/requirements.txt pip install --prefer-binary -r cmd/suggestion/nas/darts/v1beta1/requirements.txt pip install --prefer-binary -r cmd/suggestion/pbt/v1beta1/requirements.txt pip install --prefer-binary -r cmd/earlystopping/medianstop/v1beta1/requirements.txt pip install --prefer-binary -r cmd/metricscollector/v1beta1/tfevent-metricscollector/requirements.txt # `TypeIs` was introduced in typing-extensions 4.10.0, and torch 2.6.0 requires typing-extensions>=4.10.0. # REF: https://github.com/kubeflow/katib/pull/2504 # TODO (tenzen-y): Once we upgrade libraries depended on typing-extensions==4.5.0, we can remove this line. pip install typing-extensions==4.10.0 prepare-pytest-testdata: ifeq ("$(wildcard $(TEST_TENSORFLOW_EVENT_FILE_PATH))", "") python examples/v1beta1/trial-images/tf-mnist-with-summaries/mnist.py --epochs 5 --batch-size 200 --log-path $(TEST_TENSORFLOW_EVENT_FILE_PATH) endif # TODO(Electronic-Waste): Remove the import rewrite when protobuf supports `python_package` option. # REF: https://github.com/protocolbuffers/protobuf/issues/7061 pytest: prepare-pytest prepare-pytest-testdata pytest ./test/unit/v1beta1/suggestion --ignore=./test/unit/v1beta1/suggestion/test_skopt_service.py pytest ./test/unit/v1beta1/earlystopping pytest ./test/unit/v1beta1/metricscollector cp ./pkg/apis/manager/v1beta1/python/api_pb2.py ./sdk/python/v1beta1/kubeflow/katib/katib_api_pb2.py cp ./pkg/apis/manager/v1beta1/python/api_pb2_grpc.py ./sdk/python/v1beta1/kubeflow/katib/katib_api_pb2_grpc.py sed -i "s/api_pb2/kubeflow\.katib\.katib_api_pb2/g" ./sdk/python/v1beta1/kubeflow/katib/katib_api_pb2_grpc.py pytest ./sdk/python/v1beta1/kubeflow/katib rm ./sdk/python/v1beta1/kubeflow/katib/katib_api_pb2.py ./sdk/python/v1beta1/kubeflow/katib/katib_api_pb2_grpc.py # The skopt service doesn't work appropriately with Python 3.11. # So, we need to run the test with Python 3.9. # TODO (tenzen-y): Once we stop to support skopt, we can remove this test. # REF: https://github.com/kubeflow/katib/issues/2280 pytest-skopt: pip install six pip install --prefer-binary -r test/unit/v1beta1/requirements.txt pip install --prefer-binary -r cmd/suggestion/skopt/v1beta1/requirements.txt pytest ./test/unit/v1beta1/suggestion/test_skopt_service.py