Makefile 11 KB

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