forked from ProtocolONE/go-core
/
Makefile
163 lines (143 loc) · 5.07 KB
/
Makefile
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
ifndef VERBOSE
.SILENT:
endif
override CURRENT_DIR = $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
override DOCKER_MOUNT_SUFFIX ?= consistent
override GO_PATH = $(shell echo "$(GOPATH)" | cut -d';' -f1 | sed -e "s~^\(.\):~/\1~g" -e "s~\\\~/~g" )
TAG ?= unknown
AWS_DOCKER_IMAGE ?= unknown
CACHE_TAG ?= unknown_cache
GOOS ?= linux
GOARCH ?= amd64
CGO_ENABLED ?= 0
DIND_UID ?= 0
DING_GUID ?= 0
ifeq ($(OS),Windows_NT)
override ROOT_DIR = $(shell echo $(CURRENT_DIR) | sed -e "s:^/./:\U&:g")
else
override ROOT_DIR = $(CURRENT_DIR)
endif
define go_docker
if [ "${GO_PATH}" != "" ]; then VOLUME_PKG_MOD="-v /${GO_PATH}/pkg/mod:/${GO_PATH}/pkg/mod:${DOCKER_MOUNT_SUFFIX}"; fi ;\
. ${ROOT_DIR}/scripts/common.sh ${ROOT_DIR}/scripts ;\
docker run --rm \
-v /${ROOT_DIR}:/${ROOT_DIR}:${DOCKER_MOUNT_SUFFIX} \
$${VOLUME_PKG_MOD} \
-w /${ROOT_DIR} \
-e GOPATH=/${GO_PATH}:/go \
$${GO_IMAGE}:$${GO_IMAGE_TAG} \
sh -c 'GOOS=${GOOS} GOARCH=${GOARCH} CGO_ENABLED=${CGO_ENABLED} TAG=${TAG} $(subst ",,${1}); if [ "${DIND_UID}" != "0" ]; then chown -R ${DIND_UID}:${DIND_GUID} ${ROOT_DIR}; fi'
endef
up: ## initialize required tools
. ${ROOT_DIR}/scripts/common.sh ${ROOT_DIR}/scripts ;\
if [ "${DIND}" != "1" ]; then \
export GO111MODULE=on ;\
go get github.com/google/wire/cmd/wire@v0.3.0 && \
go get -u github.com/golangci/golangci-lint/cmd/golangci-lint ;\
fi;
.PHONY: up
clean: ## remove generated files, tidy vendor dependencies
if [ "${DIND}" = "1" ]; then \
$(call go_docker,"make clean") ;\
else \
export GO111MODULE=on ;\
go mod tidy ;\
rm -rf coverage.out generated/* vendor bin ;\
fi;
.PHONY: clean
dev-test: test lint ## test application in dev env with race and lint
.PHONY: dev-test
dind: ## useful for windows
if [ "${GO_PATH}" != "" ]; then VOLUME_PKG_MOD="-v /${GO_PATH}/pkg/mod:/${GO_PATH}/pkg/mod:${DOCKER_MOUNT_SUFFIX}"; fi ;\
if [ "${DIND}" = "1" ]; then \
echo "Already in DIND" ;\
else \
. ${ROOT_DIR}/scripts/common.sh ${ROOT_DIR}/scripts ;\
docker rm -f dind-$${PROJECT_NAME} &>/dev/null ;\
docker run -it --rm --name dind-$${PROJECT_NAME} --privileged \
-v //var/run/docker.sock://var/run/docker.sock:${DOCKER_MOUNT_SUFFIX} \
-v /${ROOT_DIR}:/${ROOT_DIR}:${DOCKER_MOUNT_SUFFIX} \
$${VOLUME_PKG_MOD} \
-w /${ROOT_DIR} \
-e GOPATH=${GO_PATH} \
$${DIND_IMAGE}:$${DIND_IMAGE_TAG} ;\
fi;
.PHONY: dind
generate: go-generate ## execute all generators
.PHONY: generate
github-test: test-with-coverage ## test application in CI
.PHONY: github-test
go-depends: ## view final versions that will be used in a build for all direct and indirect dependencies
if [ "${DIND}" = "1" ]; then \
$(call go_docker,"make go-depends") ;\
else \
cd $(ROOT_DIR) ;\
GO111MODULE=on go list -m all ;\
fi;
.PHONY: go-depends
go-generate: ## go generate
if [ "${DIND}" = "1" ]; then \
$(call go_docker,"make go-generate") ;\
else \
cd $(ROOT_DIR) ;\
GO111MODULE=on go generate $$(go list ./...) || exit 1 ;\
fi;
.PHONY: go-generate
go-update-all: ## view available minor and patch upgrades for all direct and indirect
if [ "${DIND}" = "1" ]; then \
$(call go_docker,"make go-update-all") ;\
else \
cd $(ROOT_DIR) ;\
GO111MODULE=on go list -u -m all ;\
fi;
.PHONY: go-update-all
lint: ## execute linter
if [ "${DIND}" = "1" ]; then \
$(call go_docker,"make lint") ;\
else \
golangci-lint run --no-config --issues-exit-code=0 --deadline=30m \
--disable-all --enable=deadcode --enable=gocyclo --enable=golint --enable=varcheck \
--enable=structcheck --enable=maligned --enable=errcheck --enable=dupl --enable=ineffassign \
--enable=interfacer --enable=unconvert --enable=goconst --enable=gosec --enable=megacheck ./... ;\
fi;
.PHONY: lint
test-with-coverage: ## test application with race and total coverage
if [ "${DIND}" = "1" ]; then \
$(call go_docker,"make test-with-coverage") ;\
else \
export WD=$(ROOT_DIR) ;\
GO111MODULE=on CGO_ENABLED=1 \
go test -v -race -covermode atomic -coverprofile coverage.out ${TEST_ARGS} ./... || exit 1 ;\
go tool cover -func=coverage.out ;\
fi;
.PHONY: test-with-coverage
test: ## test application with race
if [ "${DIND}" = "1" ]; then \
$(call go_docker,"make test") ;\
else \
export WD=$(ROOT_DIR) ;\
GO111MODULE=on CGO_ENABLED=1 \
go test -race -v ${TEST_ARGS} ./... ;\
fi;
.PHONY: test
vendor: ## update vendor dependencies
if [ "${DIND}" = "1" ]; then \
$(call go_docker,"make vendor") ;\
else \
rm -rf $(ROOT_DIR)/vendor ;\
GO111MODULE=on \
go mod vendor ;\
fi;
.PHONY: vendor
go-download-deps: ## download dependencies
if [ "${DIND}" = "1" ]; then \
$(call go_docker,"make go-download-deps") ;\
else \
GO111MODULE=on \
go get -d ./... ;\
fi;
.PHONY: go-download-deps
help:
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
.PHONY: help
.DEFAULT_GOAL := help