4b2f6c6692
This commit modifies the build tooling so that we use the official alipne build images rather than the images from the multiarch org. This requires new logic to parse docker manifests but results in a cleaner solution with fewer architecture definitions. Signed-off-by: Lucas Servén Marín <lserven@gmail.com>
299 lines
9.5 KiB
Makefile
299 lines
9.5 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 := "amd64" "arm v7" "arm64 v8"
|
|
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.13.4-alpine
|
|
BASE_IMAGE ?= alpine:3.11
|
|
|
|
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=$$(cat .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 | sed "s/[0-9]\{4\}/YEAR/"); \
|
|
[ "$$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=""; iv=""; \
|
|
j=0; for a in $(DOCKER_ARCH); do \
|
|
[ "$$i" -eq "$$j" ] && ia=$$(echo "$$a" | awk '{print $$1}') && iv=$$(echo "$$a" | awk '{print $$2}') && break; j=$$((j+1)); \
|
|
done; \
|
|
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); \
|
|
docker build -t $(IMAGE):$(ARCH)-$(VERSION) --build-arg FROM=$(BASE_IMAGE)@$$SHA --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-$(VERSION)
|
|
@docker manifest push $(IMAGE):$(VERSION) > $@
|
|
|
|
manifest-latest: Dockerfile $(addprefix push-latest-, $(ALL_ARCH))
|
|
@docker manifest create --amend $(IMAGE):latest $(addsuffix -latest, $(addprefix squat/$(PROJECT):, $(ALL_ARCH)))
|
|
@$(MAKE) --no-print-directory manifest-annotate-latest
|
|
@docker manifest push $(IMAGE):latest
|
|
@echo "manifest: $(IMAGE):latest"
|
|
|
|
manifest-annotate: manifest-annotate-$(VERSION)
|
|
|
|
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):$* $(IMAGE):$$a-$* --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
|