diff --git a/Makefile b/Makefile index ded7221d..5310c17b 100644 --- a/Makefile +++ b/Makefile @@ -1,43 +1,106 @@ --include .env --include help.mk - -HUB_IMAGE=nspccdev/neofs +#!/usr/bin/make -f +REPO ?= $(shell go list -m) VERSION ?= "$(shell git describe --tags 2>/dev/null || git rev-parse --short HEAD | sed 's/^v//')" -BUILD_VERSION ?= "$(shell git describe --abbrev=0 --tags | sed 's/^v//')" -.PHONY: format deps image publish +BIN_NAME=neofs-s3-gw +HUB_IMAGE="nspccdev/$(BIN_NAME)" +HUB_TAG ?= "$(shell echo ${VERSION} | sed 's/^v//')" +BINDIR = bin +BIN = "$(BINDIR)/$(BIN_NAME)" -# Show current version -version: - @echo $(BUILD_VERSION) +.PHONY: help all dep clean format test cover lint docker/lint image-push image dirty-image + +# Make all binaries +all: $(BIN) + +$(BIN): $(BINDIR) dep + @echo "⇒ Build $@" + CGO_ENABLED=0 \ + go build -v -trimpath \ + -ldflags "-X main.Version=$(VERSION)" \ + -o $@ ./cmd/gate + +$(BINDIR): + @echo "⇒ Ensure dir: $@" + @mkdir -p $@ + +# Pull go dependencies +dep: + @printf "⇒ Download requirements: " + @CGO_ENABLED=0 \ + go mod download && echo OK + @printf "⇒ Tidy requirements: " + @CGO_ENABLED=0 \ + go mod tidy -v && echo OK + +# Run tests +test: + @go test ./... -cover + +# Run tests with race detection and produce coverage output +cover: + @go test -v -race ./... -coverprofile=coverage.txt -covermode=atomic + @go tool cover -html=coverage.txt -o coverage.html # Reformat code format: - @[ ! -z `which goimports` ] || (echo "install goimports" && exit 2) - @for f in `find . -type f -name '*.go' -not -path './vendor/*' -not -name '*.pb.go' -prune`; do \ - echo "⇒ Processing $$f"; \ - goimports -w $$f; \ - done + @echo "⇒ Processing gofmt check" + @gofmt -s -w ./ + @echo "⇒ Processing goimports check" + @goimports -w ./ -# Check and ensure dependencies -deps: - @printf "⇒ Ensure vendor: " - @go mod tidy -v && echo OK || (echo fail && exit 2) - @printf "⇒ Download requirements: " - @go mod download && echo OK || (echo fail && exit 2) - @printf "⇒ Store vendor localy: " - @go mod vendor && echo OK || (echo fail && exit 2) - -# Build current docker image -image: deps - @echo "⇒ Build docker-image" +# Build clean Docker image +image: + @echo "⇒ Build NeoFS S3 Gateway docker image " @docker build \ - --build-arg VERSION=$(BUILD_VERSION) \ - -f Dockerfile \ - -t $(HUB_IMAGE)-s3-gate:$(BUILD_VERSION) . + --build-arg REPO=$(REPO) \ + --build-arg VERSION=$(VERSION) \ + --rm \ + -f Dockerfile \ + -t $(HUB_IMAGE):$(HUB_TAG) . -# Publish docker image -publish: - @echo "${B}${G}⇒ publish docker image ${R}" - @docker push $(HUB_IMAGE)-s3-gate:$(VERSION) \ No newline at end of file +# Push Docker image to the hub +image-push: + @echo "⇒ Publish image" + @docker push $(HUB_IMAGE):$(HUB_TAG) + +# Build dirty Docker image +dirty-image: + @echo "⇒ Build NeoFS S3 Gateway dirty docker image " + @docker build \ + --build-arg REPO=$(REPO) \ + --build-arg VERSION=$(VERSION) \ + --rm \ + -f Dockerfile.dirty \ + -t $(HUB_IMAGE)-dirty:$(HUB_TAG) . + +# Run linters +lint: + @golangci-lint --timeout=5m run + +# Run linters in Docker +docker/lint: + docker run --rm -it \ + -v `pwd`:/src \ + -u `stat -c "%u:%g" .` \ + --env HOME=/src \ + golangci/golangci-lint:v1.40 bash -c 'cd /src/ && make lint' + +# Show current version +version: + @echo $(VERSION) + +# Show this help prompt +help: + @echo ' Usage:' + @echo '' + @echo ' make ' + @echo '' + @echo ' Targets:' + @echo '' + @awk '/^#/{ comment = substr($$0,3) } comment && /^[a-zA-Z][a-zA-Z0-9_-]+ ?:/{ print " ", $$1, comment }' $(MAKEFILE_LIST) | column -t -s ':' | grep -v 'IGNORE' | sort -u + +# Clean up +clean: + rm -rf $(BINDIR)