#!/usr/bin/make -f REPO ?= $(shell go list -m) VERSION ?= $(shell git describe --tags --match "v*" --dirty --always --abbrev=8 2>/dev/null || cat VERSION 2>/dev/null || echo "develop") GO_VERSION ?= 1.21 LINT_VERSION ?= 1.56.1 TRUECLOUDLAB_LINT_VERSION ?= 0.0.5 BINDIR = bin METRICS_DUMP_OUT ?= ./metrics-dump.json CMDS = $(notdir $(basename $(wildcard cmd/*))) BINS = $(addprefix $(BINDIR)/, $(CMDS)) # Variables for docker REPO_BASENAME = $(shell basename `go list -m`) HUB_IMAGE ?= "truecloudlab/$(REPO_BASENAME)" HUB_TAG ?= "$(shell echo ${VERSION} | sed 's/^v//')" OUTPUT_LINT_DIR ?= $(shell pwd)/bin LINT_DIR = $(OUTPUT_LINT_DIR)/golangci-lint-$(LINT_VERSION)-v$(TRUECLOUDLAB_LINT_VERSION) TMP_DIR := .cache # Make all binaries .PHONY: all all: $(BINS) .PHONY: $(BINS) $(BINS): $(BINDIR) dep fmts @echo "⇒ Build $@" CGO_ENABLED=0 \ go build -v -trimpath \ -ldflags "-X main.Version=$(VERSION)" \ -o bin/frostfs-s3-lifecycler ./cmd/$(notdir $@) .PHONY: $(BINDIR) $(BINDIR): @echo "⇒ Ensure dir: $@" @mkdir -p $@ # Pull go dependencies .PHONY: dep dep: @printf "⇒ Download requirements: " @CGO_ENABLED=0 \ go mod download && echo OK @printf "⇒ Tidy requirements: " @CGO_ENABLED=0 \ go mod tidy -v && echo OK .PHONY: image image: @echo "⇒ Build FrostFS S3 Lifecycler docker image " @docker build \ --build-arg REPO=$(REPO) \ --build-arg VERSION=$(VERSION) \ --rm \ -f .docker/Dockerfile \ -t $(HUB_IMAGE):$(HUB_TAG) . .PHONY: image-push image-push: @echo "⇒ Publish image" @docker push $(HUB_IMAGE):$(HUB_TAG) .PHONY: dirty-image dirty-image: @echo "⇒ Build FrostFS S3 Lifecycler dirty docker image " @docker build \ --build-arg REPO=$(REPO) \ --build-arg VERSION=$(VERSION) \ --rm \ -f .docker/Dockerfile.dirty \ -t $(HUB_IMAGE)-dirty:$(HUB_TAG) . .PHONY: docker/ docker/%: $(if $(filter $*,all $(BINS)), \ @echo "=> Running 'make $*' in clean Docker environment" && \ docker run --rm -t \ -v `pwd`:/src \ -w /src \ -u `stat -c "%u:%g" .` \ --env HOME=/src \ golang:$(GO_VERSION) make $*,\ @echo "supported docker targets: all $(BINS) lint") # Run tests .PHONY: test test: @go test ./... -cover # Run tests with race detection and produce coverage output .PHONY: cover cover: @go test -v -race ./... -coverprofile=coverage.txt -covermode=atomic @go tool cover -html=coverage.txt -o coverage.html # Run all code formatters .PHONY: fmts fmts: fmt imports # Reformat code .PHONY: fmt fmt: @echo "⇒ Processing gofmt check" @GO111MODULE=on gofmt -s -w ./ # Reformat imports .PHONY: imports imports: @echo "⇒ Processing goimports check" @GO111MODULE=on goimports -w ./ # Install linters .PHONY: lint-install lint-install: @if [ ! -d "$(LINT_DIR)" ]; then \ mkdir -p $(TMP_DIR); \ rm -rf $(TMP_DIR)/linters; \ git -c advice.detachedHead=false clone --branch v$(TRUECLOUDLAB_LINT_VERSION) https://git.frostfs.info/TrueCloudLab/linters.git $(TMP_DIR)/linters; \ make -C $(TMP_DIR)/linters lib CGO_ENABLED=1 OUT_DIR=$(OUTPUT_LINT_DIR); \ rm -rf $(TMP_DIR)/linters; \ rmdir $(TMP_DIR) 2>/dev/null || true; \ CGO_ENABLED=1 GOBIN=$(LINT_DIR) go install github.com/golangci/golangci-lint/cmd/golangci-lint@v$(LINT_VERSION); \ fi # Run linters .PHONY: lint lint: lint-install $(LINT_DIR)/golangci-lint --timeout=5m run # Run linters in Docker .PHONY: docker/lint docker/lint: docker run --rm -it \ -v `pwd`:/src \ -u `stat -c "%u:%g" .` \ --env HOME=/src \ golangci/golangci-lint:v$(LINT_VERSION) bash -c 'cd /src/ && make lint' # Activate pre-commit hooks .PHONY: pre-commit pre-commit: pre-commit install -t pre-commit -t commit-msg # Deactivate pre-commit hooks .PHONY: unpre-commit unpre-commit: pre-commit uninstall -t pre-commit -t commit-msg .PHONY: clean clean: @rm -rf $(DIRS) # Show current version .PHONY: version version: @echo $(VERSION) # Dump metrics (use METRICS_DUMP_OUT variable to override default out file './metrics-dump.json') .PHONY: dump-metrics dump-metrics: @go test ./internal/metrics -run TestDescribeAll --tags=dump_metrics --out=$(abspath $(METRICS_DUMP_OUT)) include help.mk