c9969f5be9
This commit improves the tooling for the repo and makes all go binaries managed with go mod. This ensures all tooling is vendored.
294 lines
9.2 KiB
Makefile
294 lines
9.2 KiB
Makefile
export GO111MODULE=on
|
|
.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
|
|
|
|
ARCH ?= amd64
|
|
ALL_ARCH := amd64 arm arm64
|
|
DOCKER_ARCH := "" arm "arm64 armv8"
|
|
IMAGE_ARCH := amd64 armhf arm64
|
|
BINS := $(addprefix bin/$(ARCH)/,kg kgctl)
|
|
PROJECT := kilo
|
|
PKG := github.com/squat/$(PROJECT)
|
|
REGISTRY ?= index.docker.io
|
|
IMAGE ?= squat/$(PROJECT)
|
|
|
|
TAG := $(shell git describe --abbrev=0 --tags HEAD 2>/dev/null)
|
|
COMMIT := $(shell git rev-parse HEAD)
|
|
VERSION := $(COMMIT)
|
|
ifneq ($(TAG),)
|
|
ifeq ($(COMMIT), $(shell git rev-list -n1 $(TAG)))
|
|
VERSION := $(TAG)
|
|
endif
|
|
endif
|
|
DIRTY := $(shell test -z "$$(git diff --shortstat 2>/dev/null)" || echo -dirty)
|
|
VERSION := $(VERSION)$(DIRTY)
|
|
LD_FLAGS := -ldflags '-X $(PKG)/pkg/version.Version=$(VERSION)'
|
|
SRC := $(shell find . -type f -name '*.go' -not -path "./vendor/*")
|
|
GO_FILES ?= $$(find . -name '*.go' -not -path './vendor/*')
|
|
GO_PKGS ?= $$(go list ./... | grep -v "$(PKG)/vendor")
|
|
|
|
CLIENT_GEN_BINARY := bin/client-gen
|
|
DEEPCOPY_GEN_BINARY := bin/deepcopy-gen
|
|
INFORMER_GEN_BINARY := bin/informer-gen
|
|
LISTER_GEN_BINARY := bin/lister-gen
|
|
OPENAPI_GEN_BINARY := bin/openapi-gen
|
|
GOLINT_BINARY := bin/golint
|
|
|
|
BUILD_IMAGE ?= golang:1.12.1-alpine
|
|
|
|
build: $(BINS)
|
|
|
|
build-%:
|
|
@$(MAKE) --no-print-directory ARCH=$* build
|
|
|
|
container-latest-%:
|
|
@$(MAKE) --no-print-directory ARCH=$* container-latest
|
|
|
|
container-%:
|
|
@$(MAKE) --no-print-directory ARCH=$* container
|
|
|
|
push-latest-%:
|
|
@$(MAKE) --no-print-directory ARCH=$* push-latest
|
|
|
|
push-%:
|
|
@$(MAKE) --no-print-directory ARCH=$* push
|
|
|
|
all-build: $(addprefix build-, $(ALL_ARCH))
|
|
|
|
all-container: $(addprefix container-, $(ALL_ARCH))
|
|
|
|
all-push: $(addprefix push-, $(ALL_ARCH))
|
|
|
|
all-container-latest: $(addprefix container-latest-, $(ALL_ARCH))
|
|
|
|
all-push-latest: $(addprefix push-latest-, $(ALL_ARCH))
|
|
|
|
generate: client deepcopy informer lister openapi
|
|
|
|
client: pkg/k8s/clientset/versioned/typed/kilo/v1alpha1/peer.go
|
|
pkg/k8s/clientset/versioned/typed/kilo/v1alpha1/peer.go: .header pkg/k8s/apis/kilo/v1alpha1/types.go $(CLIENT_GEN_BINARY)
|
|
$(CLIENT_GEN_BINARY) \
|
|
--clientset-name versioned \
|
|
--input-base "" \
|
|
--input $(PKG)/pkg/k8s/apis/kilo/v1alpha1 \
|
|
--output-base $(CURDIR) \
|
|
--output-package $(PKG)/pkg/k8s/clientset \
|
|
--go-header-file=.header \
|
|
--logtostderr
|
|
rm -r pkg/k8s/clientset || true
|
|
mv $(PKG)/pkg/k8s/clientset pkg/k8s
|
|
rm -r github.com || true
|
|
go fmt ./pkg/k8s/clientset/...
|
|
|
|
deepcopy: pkg/k8s/apis/kilo/v1alpha1/zz_generated.deepcopy.go
|
|
pkg/k8s/apis/kilo/v1alpha1/zz_generated.deepcopy.go: .header pkg/k8s/apis/kilo/v1alpha1/types.go $(DEEPCOPY_GEN_BINARY)
|
|
$(DEEPCOPY_GEN_BINARY) \
|
|
--input-dirs ./$(@D) \
|
|
--go-header-file=.header \
|
|
--logtostderr \
|
|
--output-base $(CURDIR) \
|
|
--output-file-base zz_generated.deepcopy
|
|
mv $(PKG)/$@ $@ || true
|
|
rm -r github.com || true
|
|
go fmt $@
|
|
|
|
informer: pkg/k8s/informers/kilo/v1alpha1/peer.go
|
|
pkg/k8s/informers/kilo/v1alpha1/peer.go: .header pkg/k8s/apis/kilo/v1alpha1/types.go $(INFORMER_GEN_BINARY)
|
|
$(INFORMER_GEN_BINARY) \
|
|
--input-dirs $(PKG)/pkg/k8s/apis/kilo/v1alpha1 \
|
|
--go-header-file=.header \
|
|
--logtostderr \
|
|
--versioned-clientset-package $(PKG)/pkg/k8s/clientset/versioned \
|
|
--listers-package $(PKG)/pkg/k8s/listers \
|
|
--output-base $(CURDIR) \
|
|
--output-package $(PKG)/pkg/k8s/informers \
|
|
--single-directory
|
|
rm -r pkg/k8s/informers || true
|
|
mv $(PKG)/pkg/k8s/informers pkg/k8s
|
|
rm -r github.com || true
|
|
go fmt ./pkg/k8s/informers/...
|
|
|
|
lister: pkg/k8s/listers/kilo/v1alpha1/peer.go
|
|
pkg/k8s/listers/kilo/v1alpha1/peer.go: .header pkg/k8s/apis/kilo/v1alpha1/types.go $(LISTER_GEN_BINARY)
|
|
$(LISTER_GEN_BINARY) \
|
|
--input-dirs $(PKG)/pkg/k8s/apis/kilo/v1alpha1 \
|
|
--go-header-file=.header \
|
|
--logtostderr \
|
|
--output-base $(CURDIR) \
|
|
--output-package $(PKG)/pkg/k8s/listers
|
|
rm -r pkg/k8s/listers || true
|
|
mv $(PKG)/pkg/k8s/listers pkg/k8s
|
|
rm -r github.com || true
|
|
go fmt ./pkg/k8s/listers/...
|
|
|
|
openapi: pkg/k8s/apis/kilo/v1alpha1/openapi_generated.go
|
|
pkg/k8s/apis/kilo/v1alpha1/openapi_generated.go: pkg/k8s/apis/kilo/v1alpha1/types.go $(OPENAPI_GEN_BINARY)
|
|
$(OPENAPI_GEN_BINARY) \
|
|
--input-dirs $(PKG)/$(@D),k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/api/core/v1 \
|
|
--output-base $(CURDIR) \
|
|
--output-package ./$(@D) \
|
|
--logtostderr \
|
|
--report-filename /dev/null \
|
|
--go-header-file=.header
|
|
go fmt $@
|
|
|
|
$(BINS): $(SRC) go.mod
|
|
@mkdir -p bin/$(ARCH)
|
|
@echo "building: $@"
|
|
@docker run --rm \
|
|
-u $$(id -u):$$(id -g) \
|
|
-v $$(pwd):/$(PROJECT) \
|
|
-w /$(PROJECT) \
|
|
$(BUILD_IMAGE) \
|
|
/bin/sh -c " \
|
|
GOARCH=$(ARCH) \
|
|
GOOS=linux \
|
|
GOCACHE=/$(PROJECT)/.cache \
|
|
CGO_ENABLED=0 \
|
|
go build -mod=vendor -o $@ \
|
|
$(LD_FLAGS) \
|
|
./cmd/$(@F)/... \
|
|
"
|
|
|
|
fmt:
|
|
@echo $(GO_PKGS)
|
|
gofmt -w -s $(GO_FILES)
|
|
|
|
lint: header $(GOLINT_BINARY)
|
|
@echo 'go vet $(GO_PKGS)'
|
|
@vet_res=$$(GO111MODULE=on go vet -mod=vendor $(GO_PKGS) 2>&1); if [ -n "$$vet_res" ]; then \
|
|
echo ""; \
|
|
echo "Go vet found issues. Please check the reported issues"; \
|
|
echo "and fix them if necessary before submitting the code for review:"; \
|
|
echo "$$vet_res"; \
|
|
exit 1; \
|
|
fi
|
|
@echo '$(GOLINT_BINARY) $(GO_PKGS)'
|
|
@lint_res=$$($(GOLINT_BINARY) $(GO_PKGS)); if [ -n "$$lint_res" ]; then \
|
|
echo ""; \
|
|
echo "Golint found style issues. Please check the reported issues"; \
|
|
echo "and fix them if necessary before submitting the code for review:"; \
|
|
echo "$$lint_res"; \
|
|
exit 1; \
|
|
fi
|
|
@echo 'gofmt -d -s $(GO_FILES)'
|
|
@fmt_res=$$(gofmt -d -s $(GO_FILES)); if [ -n "$$fmt_res" ]; then \
|
|
echo ""; \
|
|
echo "Gofmt found style issues. Please check the reported issues"; \
|
|
echo "and fix them if necessary before submitting the code for review:"; \
|
|
echo "$$fmt_res"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
unit:
|
|
go test -mod=vendor --race ./...
|
|
|
|
test: lint unit
|
|
|
|
header: .header
|
|
@HEADER=$$(sed "s/YEAR/$$(date '+%Y')/" .header); \
|
|
HEADER_LEN=$$(wc -l .header | awk '{print $$1}'); \
|
|
FILES=; \
|
|
for f in $(GO_FILES); do \
|
|
for i in 0 1 2 3 4 5; do \
|
|
FILE=$$(tail -n +$$i $$f | head -n $$HEADER_LEN); \
|
|
[ "$$FILE" = "$$HEADER" ] && continue 2; \
|
|
done; \
|
|
FILES="$$FILES$$f "; \
|
|
done; \
|
|
if [ -n "$$FILES" ]; then \
|
|
printf 'the following files are missing the license header: %s\n' "$$FILES"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
container: .container-$(ARCH)-$(VERSION) container-name
|
|
.container-$(ARCH)-$(VERSION): $(BINS) Dockerfile
|
|
@i=0; for a in $(ALL_ARCH); do [ "$$a" = $(ARCH) ] && break; i=$$((i+1)); done; \
|
|
ia=""; \
|
|
j=0; for a in $(IMAGE_ARCH); do [ "$$i" -eq "$$j" ] && ia="$$a" && break; j=$$((j+1)); done; \
|
|
docker build -t $(IMAGE):$(ARCH)-$(VERSION) --build-arg FROM=multiarch/alpine:$$ia-v3.9 --build-arg GOARCH=$(ARCH) .
|
|
@docker images -q $(IMAGE):$(ARCH)-$(VERSION) > $@
|
|
|
|
container-latest: .container-$(ARCH)-$(VERSION)
|
|
@docker tag $(IMAGE):$(ARCH)-$(VERSION) $(IMAGE):$(ARCH)-latest
|
|
@echo "container: $(IMAGE):$(ARCH)-latest"
|
|
|
|
container-name:
|
|
@echo "container: $(IMAGE):$(ARCH)-$(VERSION)"
|
|
|
|
manifest: .manifest-$(VERSION) manifest-name
|
|
.manifest-$(VERSION): Dockerfile $(addprefix push-, $(ALL_ARCH))
|
|
@docker manifest create --amend $(IMAGE):$(VERSION) $(addsuffix -$(VERSION), $(addprefix squat/$(PROJECT):, $(ALL_ARCH)))
|
|
@$(MAKE) --no-print-directory manifest-annotate
|
|
@docker manifest push $(IMAGE):$(VERSION) > $@
|
|
|
|
manifest-latest: .manifest-$(VERSION) $(addprefix push-latest-, $(ALL_ARCH))
|
|
@docker manifest create --amend $(IMAGE):latest $(addsuffix -latest, $(addprefix squat/$(PROJECT):, $(ALL_ARCH)))
|
|
@$(MAKE) --no-print-directory manifest-annotate
|
|
@docker manifest push $(IMAGE):latest
|
|
@echo "manifest: $(IMAGE):latest"
|
|
|
|
manifest-annotate:
|
|
@i=0; \
|
|
for a in $(ALL_ARCH); do \
|
|
annotate=; \
|
|
j=0; for da in $(DOCKER_ARCH); do \
|
|
if [ "$$j" -eq "$$i" ] && [ -n "$$da" ]; then \
|
|
annotate="docker manifest annotate $(IMAGE):$(VERSION) $(IMAGE):$$a-$(VERSION) --os linux --arch"; \
|
|
k=0; for ea in $$da; do \
|
|
[ "$$k" = 0 ] && annotate="$$annotate $$ea"; \
|
|
[ "$$k" != 0 ] && annotate="$$annotate --variant $$ea"; \
|
|
k=$$((k+1)); \
|
|
done; \
|
|
$$annotate; \
|
|
fi; \
|
|
j=$$((j+1)); \
|
|
done; \
|
|
i=$$((i+1)); \
|
|
done
|
|
|
|
manifest-name:
|
|
@echo "manifest: $(IMAGE_ROOT):$(VERSION)"
|
|
|
|
push: .push-$(ARCH)-$(VERSION) push-name
|
|
.push-$(ARCH)-$(VERSION): .container-$(ARCH)-$(VERSION)
|
|
@docker push $(REGISTRY)/$(IMAGE):$(ARCH)-$(VERSION)
|
|
@docker images -q $(IMAGE):$(ARCH)-$(VERSION) > $@
|
|
|
|
push-latest: container-latest
|
|
@docker push $(REGISTRY)/$(IMAGE):$(ARCH)-latest
|
|
@echo "pushed: $(IMAGE):$(ARCH)-latest"
|
|
|
|
push-name:
|
|
@echo "pushed: $(IMAGE):$(ARCH)-$(VERSION)"
|
|
|
|
clean: container-clean bin-clean
|
|
rm -r .cache
|
|
|
|
container-clean:
|
|
rm -rf .container-* .push-*
|
|
|
|
bin-clean:
|
|
rm -rf bin
|
|
|
|
vendor:
|
|
go mod tidy
|
|
go mod vendor
|
|
|
|
$(CLIENT_GEN_BINARY):
|
|
go build -mod=vendor -o $@ k8s.io/code-generator/cmd/client-gen
|
|
|
|
$(DEEPCOPY_GEN_BINARY):
|
|
go build -mod=vendor -o $@ k8s.io/code-generator/cmd/deepcopy-gen
|
|
|
|
$(INFORMER_GEN_BINARY):
|
|
go build -mod=vendor -o $@ k8s.io/code-generator/cmd/informer-gen
|
|
|
|
$(LISTER_GEN_BINARY):
|
|
go build -mod=vendor -o $@ k8s.io/code-generator/cmd/lister-gen
|
|
|
|
$(OPENAPI_GEN_BINARY):
|
|
go build -mod=vendor -o $@ k8s.io/kube-openapi/cmd/openapi-gen
|
|
|
|
$(GOLINT_BINARY):
|
|
go build -mod=vendor -o $@ golang.org/x/lint/golint
|