Makefile 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. export GO111MODULE=on
  2. .PHONY: push container clean container-name container-latest push-latest fmt lint test unit vendor header generate client deepcopy informer lister openapi manifest manfest-latest manifest-annotate manifest manfest-latest manifest-annotate
  3. ARCH ?= amd64
  4. ALL_ARCH := amd64 arm arm64
  5. DOCKER_ARCH := "" arm "arm64 armv8"
  6. IMAGE_ARCH := amd64 armhf arm64
  7. BINS := $(addprefix bin/$(ARCH)/,kg kgctl)
  8. PROJECT := kilo
  9. PKG := github.com/squat/$(PROJECT)
  10. REGISTRY ?= index.docker.io
  11. IMAGE ?= squat/$(PROJECT)
  12. TAG := $(shell git describe --abbrev=0 --tags HEAD 2>/dev/null)
  13. COMMIT := $(shell git rev-parse HEAD)
  14. VERSION := $(COMMIT)
  15. ifneq ($(TAG),)
  16. ifeq ($(COMMIT), $(shell git rev-list -n1 $(TAG)))
  17. VERSION := $(TAG)
  18. endif
  19. endif
  20. DIRTY := $(shell test -z "$$(git diff --shortstat 2>/dev/null)" || echo -dirty)
  21. VERSION := $(VERSION)$(DIRTY)
  22. LD_FLAGS := -ldflags '-X $(PKG)/pkg/version.Version=$(VERSION)'
  23. SRC := $(shell find . -type f -name '*.go' -not -path "./vendor/*")
  24. GO_FILES ?= $$(find . -name '*.go' -not -path './vendor/*')
  25. GO_PKGS ?= $$(go list ./... | grep -v "$(PKG)/vendor")
  26. CLIENT_GO_VERSION := release-11.0
  27. CODE_GENERATOR_VERSION := release-1.14
  28. KUBE_OPENAPI_VERSION := b3a7cee44
  29. CLIENT_GEN_BINARY:=$(GOPATH)/bin/client-gen
  30. DEEPCOPY_GEN_BINARY:=$(GOPATH)/bin/deepcopy-gen
  31. INFORMER_GEN_BINARY:=$(GOPATH)/bin/informer-gen
  32. LISTER_GEN_BINARY:=$(GOPATH)/bin/lister-gen
  33. OPENAPI_GEN_BINARY:=$(GOPATH)/bin/openapi-gen
  34. BUILD_IMAGE ?= golang:1.12.1-alpine
  35. build: $(BINS)
  36. build-%:
  37. @$(MAKE) --no-print-directory ARCH=$* build
  38. container-latest-%:
  39. @$(MAKE) --no-print-directory ARCH=$* container-latest
  40. container-%:
  41. @$(MAKE) --no-print-directory ARCH=$* container
  42. push-latest-%:
  43. @$(MAKE) --no-print-directory ARCH=$* push-latest
  44. push-%:
  45. @$(MAKE) --no-print-directory ARCH=$* push
  46. all-build: $(addprefix build-, $(ALL_ARCH))
  47. all-container: $(addprefix container-, $(ALL_ARCH))
  48. all-push: $(addprefix push-, $(ALL_ARCH))
  49. all-container-latest: $(addprefix container-latest-, $(ALL_ARCH))
  50. all-push-latest: $(addprefix push-latest-, $(ALL_ARCH))
  51. generate: client deepcopy informer lister openapi
  52. client: pkg/k8s/clientset/versioned/typed/kilo/v1alpha1/peer.go
  53. pkg/k8s/clientset/versioned/typed/kilo/v1alpha1/peer.go: .header pkg/k8s/apis/kilo/v1alpha1/types.go $(CLIENT_GEN_BINARY)
  54. $(CLIENT_GEN_BINARY) \
  55. --clientset-name versioned \
  56. --input-base "" \
  57. --input $(PKG)/pkg/k8s/apis/kilo/v1alpha1 \
  58. --output-base $(CURDIR) \
  59. --output-package $(PKG)/pkg/k8s/clientset \
  60. --go-header-file=.header \
  61. --logtostderr
  62. rm -r pkg/k8s/clientset
  63. mv $(PKG)/pkg/k8s/clientset pkg/k8s
  64. rm -r github.com
  65. go fmt ./pkg/k8s/clientset/...
  66. deepcopy: pkg/k8s/apis/kilo/v1alpha1/zz_generated.deepcopy.go
  67. pkg/k8s/apis/kilo/v1alpha1/zz_generated.deepcopy.go: .header pkg/k8s/apis/kilo/v1alpha1/types.go $(DEEPCOPY_GEN_BINARY)
  68. $(DEEPCOPY_GEN_BINARY) \
  69. --input-dirs ./$(@D) \
  70. --go-header-file=.header \
  71. --logtostderr \
  72. --output-base $(CURDIR) \
  73. --output-file-base zz_generated.deepcopy
  74. mv $(PKG)/$@ $@ || true
  75. rm -r github.com || true
  76. go fmt $@
  77. informer: pkg/k8s/informers/kilo/v1alpha1/peer.go
  78. pkg/k8s/informers/kilo/v1alpha1/peer.go: .header pkg/k8s/apis/kilo/v1alpha1/types.go $(INFORMER_GEN_BINARY)
  79. $(INFORMER_GEN_BINARY) \
  80. --input-dirs $(PKG)/pkg/k8s/apis/kilo/v1alpha1 \
  81. --go-header-file=.header \
  82. --logtostderr \
  83. --versioned-clientset-package $(PKG)/pkg/k8s/clientset/versioned \
  84. --listers-package $(PKG)/pkg/k8s/listers \
  85. --output-base $(CURDIR) \
  86. --output-package $(PKG)/pkg/k8s/informers \
  87. --single-directory
  88. rm -r pkg/k8s/informers
  89. mv $(PKG)/pkg/k8s/informers pkg/k8s
  90. rm -r github.com
  91. go fmt ./pkg/k8s/informers/...
  92. lister: pkg/k8s/listers/kilo/v1alpha1/peer.go
  93. pkg/k8s/listers/kilo/v1alpha1/peer.go: .header pkg/k8s/apis/kilo/v1alpha1/types.go $(LISTER_GEN_BINARY)
  94. $(LISTER_GEN_BINARY) \
  95. --input-dirs $(PKG)/pkg/k8s/apis/kilo/v1alpha1 \
  96. --go-header-file=.header \
  97. --logtostderr \
  98. --output-base $(CURDIR) \
  99. --output-package $(PKG)/pkg/k8s/listers
  100. rm -r pkg/k8s/listers
  101. mv $(PKG)/pkg/k8s/listers pkg/k8s
  102. rm -r github.com
  103. go fmt ./pkg/k8s/listers/...
  104. openapi: pkg/k8s/apis/kilo/v1alpha1/openapi_generated.go
  105. pkg/k8s/apis/kilo/v1alpha1/openapi_generated.go: pkg/k8s/apis/kilo/v1alpha1/types.go $(OPENAPI_GEN_BINARY)
  106. $(OPENAPI_GEN_BINARY) \
  107. --input-dirs $(PKG)/$(@D),k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/api/core/v1 \
  108. --output-base $(CURDIR) \
  109. --output-package ./$(@D) \
  110. --logtostderr \
  111. --report-filename /dev/null \
  112. --go-header-file=.header
  113. go fmt $@
  114. $(BINS): $(SRC) go.mod
  115. @mkdir -p bin/$(ARCH)
  116. @echo "building: $@"
  117. @docker run --rm \
  118. -u $$(id -u):$$(id -g) \
  119. -v $$(pwd):/$(PROJECT) \
  120. -w /$(PROJECT) \
  121. $(BUILD_IMAGE) \
  122. /bin/sh -c " \
  123. GOARCH=$(ARCH) \
  124. GOOS=linux \
  125. GOCACHE=/$(PROJECT)/.cache \
  126. CGO_ENABLED=0 \
  127. go build -mod=vendor -o $@ \
  128. $(LD_FLAGS) \
  129. ./cmd/$(@F)/... \
  130. "
  131. fmt:
  132. @echo $(GO_PKGS)
  133. gofmt -w -s $(GO_FILES)
  134. lint: header
  135. @echo 'go vet $(GO_PKGS)'
  136. @vet_res=$$(GO111MODULE=on go vet -mod=vendor $(GO_PKGS) 2>&1); if [ -n "$$vet_res" ]; then \
  137. echo ""; \
  138. echo "Go vet found issues. Please check the reported issues"; \
  139. echo "and fix them if necessary before submitting the code for review:"; \
  140. echo "$$vet_res"; \
  141. exit 1; \
  142. fi
  143. @echo 'golint $(GO_PKGS)'
  144. @lint_res=$$(golint $(GO_PKGS)); if [ -n "$$lint_res" ]; then \
  145. echo ""; \
  146. echo "Golint found style issues. Please check the reported issues"; \
  147. echo "and fix them if necessary before submitting the code for review:"; \
  148. echo "$$lint_res"; \
  149. exit 1; \
  150. fi
  151. @echo 'gofmt -d -s $(GO_FILES)'
  152. @fmt_res=$$(gofmt -d -s $(GO_FILES)); if [ -n "$$fmt_res" ]; then \
  153. echo ""; \
  154. echo "Gofmt found style issues. Please check the reported issues"; \
  155. echo "and fix them if necessary before submitting the code for review:"; \
  156. echo "$$fmt_res"; \
  157. exit 1; \
  158. fi
  159. unit:
  160. go test -mod=vendor --race ./...
  161. test: lint unit
  162. header: .header
  163. @HEADER=$$(sed "s/YEAR/$$(date '+%Y')/" .header); \
  164. HEADER_LEN=$$(wc -l .header | awk '{print $$1}'); \
  165. FILES=; \
  166. for f in $(GO_FILES); do \
  167. for i in 0 1 2 3 4 5; do \
  168. FILE=$$(tail -n +$$i $$f | head -n $$HEADER_LEN); \
  169. [ "$$FILE" = "$$HEADER" ] && continue 2; \
  170. done; \
  171. FILES="$$FILES$$f "; \
  172. done; \
  173. if [ -n "$$FILES" ]; then \
  174. printf 'the following files are missing the license header: %s\n' "$$FILES"; \
  175. exit 1; \
  176. fi
  177. container: .container-$(ARCH)-$(VERSION) container-name
  178. .container-$(ARCH)-$(VERSION): $(BINS) Dockerfile
  179. @i=0; for a in $(ALL_ARCH); do [ "$$a" = $(ARCH) ] && break; i=$$((i+1)); done; \
  180. ia=""; \
  181. j=0; for a in $(IMAGE_ARCH); do [ "$$i" -eq "$$j" ] && ia="$$a" && break; j=$$((j+1)); done; \
  182. docker build -t $(IMAGE):$(ARCH)-$(VERSION) --build-arg FROM=multiarch/alpine:$$ia-v3.9 --build-arg GOARCH=$(ARCH) .
  183. @docker images -q $(IMAGE):$(ARCH)-$(VERSION) > $@
  184. container-latest: .container-$(ARCH)-$(VERSION)
  185. @docker tag $(IMAGE):$(ARCH)-$(VERSION) $(IMAGE):$(ARCH)-latest
  186. @echo "container: $(IMAGE):$(ARCH)-latest"
  187. container-name:
  188. @echo "container: $(IMAGE):$(ARCH)-$(VERSION)"
  189. manifest: .manifest-$(VERSION) manifest-name
  190. .manifest-$(VERSION): Dockerfile $(addprefix push-, $(ALL_ARCH))
  191. @docker manifest create --amend $(IMAGE):$(VERSION) $(addsuffix -$(VERSION), $(addprefix squat/$(PROJECT):, $(ALL_ARCH)))
  192. @$(MAKE) --no-print-directory manifest-annotate
  193. @docker manifest push $(IMAGE):$(VERSION) > $@
  194. manifest-latest: .manifest-$(VERSION) $(addprefix push-latest-, $(ALL_ARCH))
  195. @docker manifest create --amend $(IMAGE):latest $(addsuffix -latest, $(addprefix squat/$(PROJECT):, $(ALL_ARCH)))
  196. @$(MAKE) --no-print-directory manifest-annotate
  197. @docker manifest push $(IMAGE):latest
  198. @echo "manifest: $(IMAGE):latest"
  199. manifest-annotate:
  200. @i=0; \
  201. for a in $(ALL_ARCH); do \
  202. annotate=; \
  203. j=0; for da in $(DOCKER_ARCH); do \
  204. if [ "$$j" -eq "$$i" ] && [ -n "$$da" ]; then \
  205. annotate="docker manifest annotate $(IMAGE):$(VERSION) $(IMAGE):$$a-$(VERSION) --os linux --arch"; \
  206. k=0; for ea in $$da; do \
  207. [ "$$k" = 0 ] && annotate="$$annotate $$ea"; \
  208. [ "$$k" != 0 ] && annotate="$$annotate --variant $$ea"; \
  209. k=$$((k+1)); \
  210. done; \
  211. $$annotate; \
  212. fi; \
  213. j=$$((j+1)); \
  214. done; \
  215. i=$$((i+1)); \
  216. done
  217. manifest-name:
  218. @echo "manifest: $(IMAGE_ROOT):$(VERSION)"
  219. push: .push-$(ARCH)-$(VERSION) push-name
  220. .push-$(ARCH)-$(VERSION): .container-$(ARCH)-$(VERSION)
  221. @docker push $(REGISTRY)/$(IMAGE):$(ARCH)-$(VERSION)
  222. @docker images -q $(IMAGE):$(ARCH)-$(VERSION) > $@
  223. push-latest: container-latest
  224. @docker push $(REGISTRY)/$(IMAGE):$(ARCH)-latest
  225. @echo "pushed: $(IMAGE):$(ARCH)-latest"
  226. push-name:
  227. @echo "pushed: $(IMAGE):$(ARCH)-$(VERSION)"
  228. clean: container-clean bin-clean
  229. rm -r .cache
  230. container-clean:
  231. rm -rf .container-* .push-*
  232. bin-clean:
  233. rm -rf bin
  234. vendor:
  235. go mod tidy
  236. go mod vendor
  237. $(CLIENT_GEN_BINARY):
  238. go get k8s.io/code-generator/cmd/client-gen@$(CODE_GENERATOR_VERSION)
  239. $(DEEPCOPY_GEN_BINARY):
  240. go get k8s.io/code-generator/cmd/deepcopy-gen@$(CODE_GENERATOR_VERSION)
  241. $(INFORMER_GEN_BINARY):
  242. go get k8s.io/code-generator/cmd/informer-gen@$(CODE_GENERATOR_VERSION)
  243. $(LISTER_GEN_BINARY):
  244. go get k8s.io/code-generator/cmd/lister-gen@$(CODE_GENERATOR_VERSION)
  245. $(OPENAPI_GEN_BINARY):
  246. go get k8s.io/kube-openapi/cmd/openapi-gen@$(KUBE_OPENAPI_VERSION)