forked from kubernetes-sigs/metrics-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
147 lines (117 loc) · 5.12 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# 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))