-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
140 lines (122 loc) · 5.12 KB
/
Makefile
File metadata and controls
140 lines (122 loc) · 5.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
PWD = $(CURDIR)
# Название сервиса
SERVICE_NAME = argen
# 8 символов последнего коммита
LAST_COMMIT_HASH = $(shell git rev-parse HEAD | cut -c -8)
# Таймаут для тестов
TEST_TIMEOUT?=120s
# Тег golang-ci
GOLANGCI_TAG:=1.64.8
# Путь до бинарников
LOCAL_BIN:=$(CURDIR)/bin
# Путь до бинарника golang-ci
GOLANGCI_BIN:=$(LOCAL_BIN)/golangci-lint
# Минимальная верси гошки
MIN_GO_VERSION = 1.24.0
# Версии для сборки
RELEASE = $(shell git describe --tags --always)
# Время сборки
BUILD_DATE = $(shell TZ=UTC-3 date +%Y%m%d-%H%M)
# Операционка
OSNAME = $(shell uname)
# ld флаги
LD_FLAGS = "-X 'main.BuildCommit=$(LAST_COMMIT_HASH)' -X 'main.Version=$(RELEASE)' -X 'main.BuildTime=$(BUILD_DATE)' -X 'main.BuildOS=$(OSNAME)'"
# по дефолту просто make соберёт argen
default: build
# Добавляет флаг для тестирования на наличие гонок
ifdef GO_RACE_DETECTOR
FLAGS += -race
endif
##################### Проверки для запуска golang-ci #####################
# Проверка локальной версии бинаря
ifneq ($(wildcard $(GOLANGCI_BIN)),)
GOLANGCI_BIN_VERSION:=$(shell $(GOLANGCI_BIN) --version)
ifneq ($(GOLANGCI_BIN_VERSION),)
GOLANGCI_BIN_VERSION_SHORT:=$(shell echo "$(GOLANGCI_BIN_VERSION)" | sed -E 's/.* version (.*) built from .* on .*/\1/g')
else
GOLANGCI_BIN_VERSION_SHORT:=0
endif
ifneq "$(GOLANGCI_TAG)" "$(word 1, $(sort $(GOLANGCI_TAG) $(GOLANGCI_BIN_VERSION_SHORT)))"
GOLANGCI_BIN:=
endif
endif
# Проверка глобальной версии бинаря
ifneq (, $(shell which golangci-lint))
GOLANGCI_VERSION:=$(shell golangci-lint --version 2> /dev/null )
ifneq ($(GOLANGCI_VERSION),)
GOLANGCI_VERSION_SHORT:=$(shell echo "$(GOLANGCI_VERSION)"|sed -E 's/.* version (.*) built from .* on .*/\1/g')
else
GOLANGCI_VERSION_SHORT:=0
endif
ifeq "$(GOLANGCI_TAG)" "$(word 1, $(sort $(GOLANGCI_TAG) $(GOLANGCI_VERSION_SHORT)))"
GOLANGCI_BIN:=$(shell which golangci-lint)
endif
endif
##################### Конец проверок golang-ci #####################
# Устанавливает линтер
.PHONY: install-lint
install-lint:
ifeq ($(wildcard $(GOLANGCI_BIN)),)
$(info #Downloading golangci-lint v$(GOLANGCI_TAG))
tmp=$$(mktemp -d) && cd $$tmp && pwd && go mod init temp && go get -d github.com/golangci/golangci-lint/cmd/golangci-lint@v$(GOLANGCI_TAG) && \
go build -ldflags "-X 'main.version=$(GOLANGCI_TAG)' -X 'main.commit=test' -X 'main.date=test'" -o $(LOCAL_BIN)/golangci-lint github.com/golangci/golangci-lint/cmd/golangci-lint && \
rm -rf $$tmp
GOLANGCI_BIN:=$(LOCAL_BIN)/golangci-lint
endif
# Линтер проверяет лишь отличия от мастера
.PHONY: lint
lint: install-lint
$(GOLANGCI_BIN) run --config=.golangci.yml ./... --new-from-rev=origin/main --build-tags=activerecord
# Линтер проходится по всему коду
.PHONY: full-lint
full-lint: install-lint
$(GOLANGCI_BIN) run --config=.golangci.yml ./... --build-tags=activerecord
# Linter will check only diffs with main branch (default)
.PHONY: lint-fix
lint-fix: lint
$(GOLANGCI_BIN) run --fix --config=.golangci.yml ./... --build-tags=activerecord
# создание отчета о покрытии тестами
.PHONY: cover
cover:
go test -timeout=$(TEST_TIMEOUT) -v -coverprofile=coverage.out ./... && go tool cover -html=coverage.out
.PHONY: generate
generate:
go generate ./...
# Запустить unit тесты
.PHONY: test
test:
echo "Start testing activerecord \n"
go test -parallel=10 $(PWD)/... -coverprofile=cover.out -timeout=$(TEST_TIMEOUT)
.PHONY: install
install:
go install -ldflags=$(LD_FLAGS) ./...
.PHONY: install-tool
install-tool:
go install github.com/vektra/mockery/v2@v2.46.0
# Сборка сервиса
.PHONY: build
build:
./scripts/goversioncheck.sh $(MIN_GO_VERSION) && go build -o bin/$(SERVICE_NAME) -ldflags=$(LD_FLAGS) $(PWD)/cmd/$(SERVICE_NAME)
# Устанавливает в локальный проект хук, который проверяет запускает линтеры
.PHONY: pre-commit-hook
pre-commit-hook:
touch ./.git/hooks/pre-commit
echo '#!/bin/sh' > ./.git/hooks/pre-commit
echo 'make generate' >> ./.git/hooks/pre-commit
echo 'make lint' >> ./.git/hooks/pre-commit
chmod +x ./.git/hooks/pre-commit
# Устанавливает в локальный проект хук, который проверяет запускает линтеры
.PHONY: pre-push-hook
pre-push-hook:
touch ./.git/hooks/pre-push
echo '#!/bin/sh' > ./.git/hooks/pre-push
echo 'make cover' >> ./.git/hooks/pre-push
chmod +x ./.git/hooks/pre-push
# Запуск MkDocs сервера для документации
.PHONY: run-mkdoc
run-mkdoc: ## Run MkDocs dev server for documentation
docker run --rm -p 8000:8000 -v $(PWD):/docs squidfunk/mkdocs-material serve --dev-addr=0.0.0.0:8000 --watch-theme
# Сборка документации
.PHONY: build-docs
build-docs: ## Build documentation
docker run --rm -v $(PWD):/docs squidfunk/mkdocs-material build --strict