blob: 1998650c0e97d106fa0ae4b0661f633361f3d0af [file] [log] [blame]
# Common User-Settable Flags
# ==========================
PREFIX?=gcr.io/google_containers
FLAGS=
ARCH?=amd64
GOLANG_VERSION?=1.10
# You can set this variable for testing and the built image will also be tagged with this name
IMAGE_NAME?=$(PREFIX)/metrics-server-$(ARCH):$(VERSION)
# by default, build the current arch's binary
# (this needs to be pre-include, for some reason)
all: _output/$(ARCH)/metrics-server
# Constants
# =========
ALL_ARCHITECTURES=amd64 arm arm64 ppc64le s390x
ML_PLATFORMS=linux/amd64,linux/arm,linux/arm64,linux/ppc64le,linux/s390x
# Calculated Variables
# ====================
REPO_DIR:=$(shell pwd)
LDFLAGS=-w $(VERSION_LDFLAGS)
# get the appropriate version information
include hack/Makefile.buildinfo
# Set default base image dynamically for each arch
ifeq ($(ARCH),amd64)
BASEIMAGE?=busybox
endif
ifeq ($(ARCH),arm)
BASEIMAGE?=arm32v7/busybox
endif
ifeq ($(ARCH),arm64)
BASEIMAGE?=arm64v8/busybox
endif
ifeq ($(ARCH),ppc64le)
BASEIMAGE?=ppc64le/busybox
endif
ifeq ($(ARCH),s390x)
BASEIMAGE?=s390x/busybox
endif
# Rules
# =====
.PHONY: all test-unit container container-* clean container-only container-only-* tmp-dir push do-push-* sub-push-*
# Build Rules
# -----------
pkg/generated/openapi/zz_generated.openapi.go:
go run vendor/k8s.io/kube-openapi/cmd/openapi-gen/openapi-gen.go --logtostderr -i k8s.io/metrics/pkg/apis/metrics/v1beta1,k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/apimachinery/pkg/api/resource,k8s.io/apimachinery/pkg/version -p github.com/kubernetes-incubator/metrics-server/pkg/generated/openapi/ -O zz_generated.openapi -h $(REPO_DIR)/hack/boilerplate.go.txt -r /dev/null
# building depends on all go files (this is mostly redundant in the face of go 1.10's incremental builds,
# but it allows us to safely write actual dependency rules in our makefile)
src_deps=$(shell find pkg cmd -type f -name "*.go" -and ! -name "zz_generated.*.go")
_output/%/metrics-server: $(src_deps) pkg/generated/openapi/zz_generated.openapi.go
GOARCH=$* CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o _output/$*/metrics-server github.com/kubernetes-incubator/metrics-server/cmd/metrics-server
# Image Rules
# -----------
# build a container using containerized build (the current arch by default)
container: container-$(ARCH)
container-%: pkg/generated/openapi/zz_generated.openapi.go tmpdir
# Run the build in a container in order to have reproducible builds
docker run --rm -v $(TEMP_DIR):/build -v $(REPO_DIR):/go/src/github.com/kubernetes-incubator/metrics-server -w /go/src/github.com/kubernetes-incubator/metrics-server golang:$(GOLANG_VERSION) /bin/bash -c "\
GOARCH=$(ARCH) CGO_ENABLED=0 go build -ldflags \"$(LDFLAGS)\" -o /build/metrics-server github.com/kubernetes-incubator/metrics-server/cmd/metrics-server"
# copy the base Dockerfile into the temp dir, and set the base image
cp deploy/docker/Dockerfile $(TEMP_DIR)
sed -i -e "s|BASEIMAGE|$(BASEIMAGE)|g" $(TEMP_DIR)/Dockerfile
# run the actual build
docker build --pull -t $(IMAGE_NAME) $(TEMP_DIR)
# remove our TEMP_DIR, as needed
rm -rf $(TEMP_DIR)
# build a container using a locally-built binary (the current arch by default)
container-only: container-only-$(ARCH)
container-only-%: _output/$(ARCH)/metrics-server tmpdir
# copy the base Dockerfile and binary into the temp dir, and set the base image
cp deploy/docker/Dockerfile $(TEMP_DIR)
cp _output/$(ARCH)/metrics-server $(TEMP_DIR)
sed -i -e "s|BASEIMAGE|$(BASEIMAGE)|g" $(TEMP_DIR)/Dockerfile
# run the actual build
docker build --pull -t $(IMAGE_NAME) $(TEMP_DIR)
# remove our TEMP_DIR, as needed
rm -rf $(TEMP_DIR)
# Official Container Push Rules
# -----------------------------
# do the actual push for official images
do-push-%:
# push with main tag
docker push $(PREFIX)/metrics-server-$*:$(VERSION)
# push alternate tags
ifeq ($(ARCH),amd64)
# TODO: Remove this and push the manifest list as soon as it's working
docker tag $(PREFIX)/metrics-server-$*:$(VERSION) $(PREFIX)/metrics-server:$(VERSION)
docker push $(PREFIX)/metrics-server:$(VERSION)
endif
# do build and then push a given official image
sub-push-%: container-% do-push-% ;
# do build and then push all official images
push: gcr-login $(addprefix sub-push-,$(ALL_ARCHITECTURES)) ;
# TODO: push with manifest-tool?
# Should depend on target: ./manifest-tool
# log in to the official container registry
gcr-login:
ifeq ($(findstring gcr.io,$(PREFIX)),gcr.io)
@echo "If you are pushing to a gcr.io registry, you have to be logged in via 'docker login'; 'gcloud docker push' can't push manifest lists yet."
@echo "This script is automatically logging you in now with 'gcloud docker -a'"
gcloud docker -a
endif
# Utility Rules
# -------------
clean:
rm -rf _output
rm pkg/generated/openapi/zz_generated.openapi.go
fmt:
find pkg cmd -type f -name "*.go" | xargs gofmt -s -w
test-unit: pkg/generated/openapi/zz_generated.openapi.go
ifeq ($(ARCH),amd64)
GOARCH=$(ARCH) go test --test.short -race ./pkg/... $(FLAGS)
else
GOARCH=$(ARCH) go test --test.short ./pkg/... $(FLAGS)
endif
# set up a temporary director when we need it
# it's the caller's responsibility to clean it up
tmpdir:
$(eval TEMP_DIR:=$(shell mktemp -d /tmp/metrics-server.XXXXXX))