GO_CMD ?= go
DRY_RUN ?=
PUSH ?=
BUCKET ?=
GH_RELEASE ?=
VERSION ?= $(shell ./hack/get-version.sh)
BASE_REF ?= $(shell git rev-parse --abbrev-ref HEAD)
EXTRA_TAGS ?=
SUPPORTED_KUBE_RELEASES ?= $(shell cat ./supported_releases.txt)
NUMBER_SUPPORTED_KUBE_RELEASES ?= 1
KUBE_RELEASES ?= $(shell echo $(SUPPORTED_KUBE_RELEASES) | cut -d ' ' -f 1-$(NUMBER_SUPPORTED_KUBE_RELEASES))
LATEST_KUBE_RELEASE ?= $(shell echo $(SUPPORTED_KUBE_RELEASES) | cut -d ' ' -f 1)
BINARY ?= kwok kwokctl
IMAGE_PREFIX ?=
BINARY_PREFIX ?=
BINARY_NAME ?=
STAGING ?= false
GOOS ?= $(shell go env GOOS)
GOARCH ?= $(shell go env GOARCH)
ifeq ($(STAGING),true)
STAGING_IMAGE_PREFIX ?= $(IMAGE_PREFIX)
STAGING_PREFIX ?= $(shell ./hack/get-staging.sh)
else
STAGING_IMAGE_PREFIX = $(IMAGE_PREFIX)
STAGING_PREFIX =
endif
PRE_RELEASE ?=
ifeq ($(STAGING_IMAGE_PREFIX),)
KWOK_IMAGE ?= kwok
CLUSTER_IMAGE ?= cluster
else
KWOK_IMAGE ?= $(STAGING_IMAGE_PREFIX)/kwok
CLUSTER_IMAGE ?= $(STAGING_IMAGE_PREFIX)/cluster
endif
PLATFORM ?= $(GOOS)/$(GOARCH)
IMAGE_PLATFORMS ?= linux/amd64 linux/arm64
BINARY_PLATFORMS ?= linux/amd64 linux/arm64 darwin/amd64 darwin/arm64 windows/amd64 windows/arm64
MANIFESTS ?= kwok kwokctl stage/fast metrics/usage
BUILDER ?= docker
DOCKER_CLI_EXPERIMENTAL ?= enabled
.PHONY: default
default: help
.PHONY: unit-test
unit-test:
@$(GO_CMD) test ./pkg/...
.PHONY: verify
verify:
@./hack/verify-all.sh
.PHONY: update
update:
@./hack/update-all.sh
.PHONY: build
build:
@./hack/releases.sh \
$(addprefix --bin=, $(BINARY)) \
$(addprefix --extra-tag=, $(EXTRA_TAGS)) \
--platform=${PLATFORM} \
--bucket=${BUCKET} \
--gh-release=${GH_RELEASE} \
--image-prefix=${IMAGE_PREFIX} \
--binary-prefix=${BINARY_PREFIX} \
--binary-name=${BINARY_NAME} \
--version=${VERSION} \
--kube-version=v${LATEST_KUBE_RELEASE} \
--staging-prefix=${STAGING_PREFIX} \
--pre-release=${PRE_RELEASE} \
--dry-run=${DRY_RUN} \
--push=${PUSH}
.PHONY: build-image
build-image:
ifeq ($(GOOS),linux)
@make BINARY=kwok build && \
make image
else ifeq ($(GOOS),darwin)
@make BINARY=kwok BINARY_PLATFORMS=linux/$(GOARCH) cross-build && \
make IMAGE_PLATFORMS=linux/$(GOARCH) cross-image
else
@echo "Unsupported OS: $(GOOS)"
endif
.PHONY: build-cluster-image
build-cluster-image:
ifeq ($(GOOS),linux)
@make build image cluster-image
else ifeq ($(GOOS),darwin)
@make BINARY_PLATFORMS=linux/$(GOARCH) cross-build && \
make IMAGE_PLATFORMS=linux/$(GOARCH) cross-image cross-cluster-image
else
@echo "Unsupported OS: $(GOOS)"
endif
.PHONY: cross-build
cross-build:
@./hack/releases.sh \
$(addprefix --bin=, $(BINARY)) \
$(addprefix --platform=, $(BINARY_PLATFORMS)) \
$(addprefix --extra-tag=, $(EXTRA_TAGS)) \
--bucket=${BUCKET} \
--gh-release=${GH_RELEASE} \
--image-prefix=${IMAGE_PREFIX} \
--binary-prefix=${BINARY_PREFIX} \
--binary-name=${BINARY_NAME} \
--version=${VERSION} \
--kube-version=v${LATEST_KUBE_RELEASE} \
--staging-prefix=${STAGING_PREFIX} \
--pre-release=${PRE_RELEASE} \
--dry-run=${DRY_RUN} \
--push=${PUSH}
.PHONY: image
image:
@./images/kwok/build.sh \
$(addprefix --extra-tag=, $(EXTRA_TAGS)) \
--image=${KWOK_IMAGE} \
--version=${VERSION} \
--staging-prefix=${STAGING_PREFIX} \
--dry-run=${DRY_RUN} \
--builder=${BUILDER} \
--push=${PUSH}
.PHONY: cross-image
cross-image:
@./images/kwok/build.sh \
$(addprefix --platform=, $(IMAGE_PLATFORMS)) \
$(addprefix --extra-tag=, $(EXTRA_TAGS)) \
--image=${KWOK_IMAGE} \
--version=${VERSION} \
--staging-prefix=${STAGING_PREFIX} \
--dry-run=${DRY_RUN} \
--builder=${BUILDER} \
--push=${PUSH}
.PHONY: cluster-image
cluster-image:
@./images/cluster/build.sh \
$(addprefix --kube-version=v, $(KUBE_RELEASES)) \
$(addprefix --extra-tag=, $(EXTRA_TAGS)) \
--image=${CLUSTER_IMAGE} \
--version=${VERSION} \
--staging-prefix=${STAGING_PREFIX} \
--dry-run=${DRY_RUN} \
--builder=${BUILDER} \
--push=${PUSH}
.PHONY: cross-cluster-image
cross-cluster-image:
@./images/cluster/build.sh \
$(addprefix --platform=, $(IMAGE_PLATFORMS)) \
$(addprefix --kube-version=v, $(KUBE_RELEASES)) \
$(addprefix --extra-tag=, $(EXTRA_TAGS)) \
--image=${CLUSTER_IMAGE} \
--version=${VERSION} \
--staging-prefix=${STAGING_PREFIX} \
--dry-run=${DRY_RUN} \
--builder=${BUILDER} \
--push=${PUSH}
.PHONY: manifests
manifests:
@./hack/manifests.sh \
$(addprefix --kustomize=, $(MANIFESTS)) \
--bucket=${BUCKET} \
--gh-release=${GH_RELEASE} \
--image-prefix=${IMAGE_PREFIX} \
--version=${VERSION} \
--staging-prefix=${STAGING_PREFIX} \
--dry-run=${DRY_RUN} \
--push=${PUSH}
.PHONY: integration-test
integration-test:
@echo "Not implemented yet"
.PHONY: e2e-test
e2e-test:
@./hack/requirements.sh kubectl buildx kind kustomize
@PATH=$(PWD)/bin:${PATH} ./hack/e2e-test.sh \
--skip=nerdctl \
--skip=podman \
--skip=kind \
--skip=benchmark \
--skip=kwokctl_binary_port_forward
.PHONY: release
release:
@./hack/requirements.sh go gsutil buildx kustomize
@PATH=$(PWD)/bin:${PATH} make manifests cross-build cross-image cross-cluster-image
.PHONY: help
help:
@cat $(MAKEFILE_LIST) | grep -e '^
.PRECIOUS: %.cast
%.cast: %.demo
@WORK_DIR=$(shell dirname $<) \
ROOT_DIR=$(shell pwd) \
./hack/democtl.sh "$<" "$@" \
--ps1='\033[1;96m~/sigs.k8s.io/kwok\033[1;94m$$\033[0m '
.PRECIOUS: %.svg
%.svg: %.cast
@./hack/democtl.sh "$<" "$@" \
--term xresources \
--profile ./.xresources
%.mp4: %.cast
@./hack/democtl.sh "$<" "$@"