Makefile 8.7 KB
Newer Older
martianzhang's avatar
martianzhang 已提交
1 2 3 4 5 6
# This how we want to name the binary output
#
# use checkmake linter https://github.com/mrtazz/checkmake
# $ checkmake Makefile
#
BINARY=soar
martianzhang's avatar
martianzhang 已提交
7
GOPATH ?= $(shell go env GOPATH)
martianzhang's avatar
martianzhang 已提交
8 9
GO111MODULE:=off
export GO111MODULE
martianzhang's avatar
martianzhang 已提交
10 11 12 13
# Ensure GOPATH is set before running build process.
ifeq "$(GOPATH)" ""
  $(error Please set the environment variable GOPATH before running `make`)
endif
martianzhang's avatar
martianzhang 已提交
14
PATH := ${GOPATH}/bin:$(PATH)
martianzhang's avatar
martianzhang 已提交
15
GCFLAGS=-gcflags "all=-trimpath=${GOPATH}"
martianzhang's avatar
martianzhang 已提交
16 17 18 19
VERSION_TAG := $(shell git describe --tags --always)
VERSION_VERSION := $(shell git log --date=iso --pretty=format:"%cd" -1) $(VERSION_TAG)
VERSION_COMPILE := $(shell date +"%F %T %z") by $(shell go version)
VERSION_BRANCH  := $(shell git rev-parse --abbrev-ref HEAD)
martianzhang's avatar
martianzhang 已提交
20
VERSION_GIT_DIRTY := $(shell git diff --no-ext-diff 2>/dev/null | wc -l | awk '{print $1}')
martianzhang's avatar
martianzhang 已提交
21
VERSION_DEV_PATH:= $(shell pwd)
22
LDFLAGS=-ldflags="-s -w -X 'github.com/XiaoMi/soar/common.Version=$(VERSION_VERSION)' -X 'github.com/XiaoMi/soar/common.Compile=$(VERSION_COMPILE)' -X 'github.com/XiaoMi/soar/common.Branch=$(VERSION_BRANCH)' -X 'github.com/XiaoMi/soar/common.GitDirty=$(VERSION_GIT_DIRTY)' -X 'github.com/XiaoMi/soar/common.DevPath=$(VERSION_DEV_PATH)'"
martianzhang's avatar
martianzhang 已提交
23

martianzhang's avatar
martianzhang 已提交
24 25 26 27
# These are the values we want to pass for VERSION  and BUILD
BUILD_TIME=`date +%Y%m%d%H%M`
COMMIT_VERSION=`git rev-parse HEAD`

28
# colors compatible setting
29 30 31 32
CRED:=$(shell tput setaf 1 2>/dev/null)
CGREEN:=$(shell tput setaf 2 2>/dev/null)
CYELLOW:=$(shell tput setaf 3 2>/dev/null)
CEND:=$(shell tput sgr0 2>/dev/null)
33

34
# Add mysql version for testing `MYSQL_RELEASE=percona MYSQL_VERSION=5.7 make docker`
martianzhang's avatar
martianzhang 已提交
35
# MySQL 5.1 `MYSQL_RELEASE=vsamov/mysql-5.1.73 make docker`
36 37
# MYSQL_RELEASE: mysql, percona, mariadb ...
# MYSQL_VERSION: latest, 8.0, 5.7, 5.6, 5.5 ...
martianzhang's avatar
martianzhang 已提交
38
# use mysql:latest as default
39
MYSQL_RELEASE := $(or ${MYSQL_RELEASE}, ${MYSQL_RELEASE}, mysql)
martianzhang's avatar
martianzhang 已提交
40 41 42 43 44
MYSQL_VERSION := $(or ${MYSQL_VERSION}, ${MYSQL_VERSION}, latest)

.PHONY: all
all: | fmt build

martianzhang's avatar
martianzhang 已提交
45
.PHONY: go_version_check
46
GO_VERSION_MIN=1.12
martianzhang's avatar
martianzhang 已提交
47 48 49 50
# Parse out the x.y or x.y.z version and output a single value x*10000+y*100+z (e.g., 1.9 is 10900)
# that allows the three components to be checked in a single comparison.
VER_TO_INT:=awk '{split(substr($$0, match ($$0, /[0-9\.]+/)), a, "."); print a[1]*10000+a[2]*100+a[3]}'
go_version_check:
51
	@echo "$(CGREEN)Go version check ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
52 53 54 55 56
	@if test $(shell go version | $(VER_TO_INT) ) -lt \
  	$(shell echo "$(GO_VERSION_MIN)" | $(VER_TO_INT)); \
  	then printf "go version $(GO_VERSION_MIN)+ required, found: "; go version; exit 1; \
		else echo "go version check pass";	fi

martianzhang's avatar
martianzhang 已提交
57 58 59
# Dependency check
.PHONY: deps
deps:
60
	@echo "$(CGREEN)Dependency check ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
61 62
	@bash ./deps.sh
	# The retool tools.json is setup from retool-install.sh
martianzhang's avatar
martianzhang 已提交
63
	# some packages download need more open internet access
martianzhang's avatar
martianzhang 已提交
64
	retool sync
martianzhang's avatar
martianzhang 已提交
65
	#retool do gometalinter.v2 --install
martianzhang's avatar
martianzhang 已提交
66 67 68

# Code format
.PHONY: fmt
martianzhang's avatar
martianzhang 已提交
69
fmt: go_version_check
70
	@echo "$(CGREEN)Run gofmt on all source files ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
71 72 73 74 75 76 77 78
	@echo "gofmt -l -s -w ..."
	@ret=0 && for d in $$(go list -f '{{.Dir}}' ./... | grep -v /vendor/); do \
		gofmt -l -s -w $$d/*.go || ret=$$? ; \
	done ; exit $$ret

# Run golang test cases
.PHONY: test
test:
79
	@echo "$(CGREEN)Run all test cases ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
80
	@go test $(LDFLAGS) -timeout 10m -race ./...
martianzhang's avatar
martianzhang 已提交
81 82
	@echo "test Success!"

martianzhang's avatar
martianzhang 已提交
83
# Rule golang test cases with `-update` flag
84
.PHONY: test-update
martianzhang's avatar
martianzhang 已提交
85
test-update:
86
	@echo "$(CGREEN)Run all test cases with -update flag ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
87
	@go test $(LDFLAGS) ./... -update
martianzhang's avatar
martianzhang 已提交
88 89
	@echo "test-update Success!"

90 91 92 93 94 95 96 97
# Using bats test framework run all cli test cases
# https://github.com/sstephenson/bats
.PHONY: test-cli
test-cli: build
	@echo "$(CGREEN)Run all cli test cases ...$(CEND)"
	bats ./test
	@echo "test-cli Success!"

martianzhang's avatar
martianzhang 已提交
98 99 100 101
# Code Coverage
# colorful coverage numerical >=90% GREEN, <80% RED, Other YELLOW
.PHONY: cover
cover: test
102
	@echo "$(CGREEN)Run test cover check ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
103 104 105
	@go test $(LDFLAGS) -coverpkg=./... -coverprofile=coverage.data ./... | column -t
	@go tool cover -html=coverage.data -o coverage.html
	@go tool cover -func=coverage.data -o coverage.txt
martianzhang's avatar
martianzhang 已提交
106 107
	@tail -n 1 coverage.txt | awk '{sub(/%/, "", $$NF); \
		if($$NF < 80) \
108
			{print "$(CRED)"$$0"%$(CEND)"} \
martianzhang's avatar
martianzhang 已提交
109
		else if ($$NF >= 90) \
110
			{print "$(CGREEN)"$$0"%$(CEND)"} \
martianzhang's avatar
martianzhang 已提交
111
		else \
112
			{print "$(CYELLOW)"$$0"%$(CEND)"}}'
martianzhang's avatar
martianzhang 已提交
113 114

# Builds the project
martianzhang's avatar
martianzhang 已提交
115
build: fmt
116
	@echo "$(CGREEN)Building ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
117
	@mkdir -p bin
martianzhang's avatar
martianzhang 已提交
118
	@ret=0 && for d in $$(go list -f '{{if (eq .Name "main")}}{{.ImportPath}}{{end}}' ./...); do \
martianzhang's avatar
martianzhang 已提交
119
		b=$$(basename $${d}) ; \
martianzhang's avatar
martianzhang 已提交
120
		GO111MODULE=auto go build ${LDFLAGS} ${GCFLAGS} -o bin/$${b} $$d || ret=$$? ; \
martianzhang's avatar
martianzhang 已提交
121 122 123 124 125
	done ; exit $$ret
	@echo "build Success!"

# Installs our project: copies binaries
install: build
126
	@echo "$(CGREEN)Install ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
127 128 129 130 131
	go install ./...
	@echo "install Success!"

# Generate doc use -list* command
.PHONY: doc
martianzhang's avatar
martianzhang 已提交
132
doc: build
133
	@echo "$(CGREEN)Auto generate doc ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
134 135 136
	./bin/soar -list-heuristic-rules > doc/heuristic.md
	./bin/soar -list-rewrite-rules > doc/rewrite.md
	./bin/soar -list-report-types > doc/report_type.md
martianzhang's avatar
martianzhang 已提交
137 138 139

# Add or change a heuristic rule
.PHONY: heuristic
martianzhang's avatar
martianzhang 已提交
140
heuristic: doc
141
	@echo "$(CGREEN)Update Heuristic rule golden files ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
142 143 144 145 146 147 148
	go test github.com/XiaoMi/soar/advisor -v -update -run TestListHeuristicRules
	go test github.com/XiaoMi/soar/advisor -v -update -run TestMergeConflictHeuristicRules
	docker stop soar-mysql 2>/dev/null || true

# Update vitess vendor
.PHONY: vitess
vitess:
149
	@echo "$(CGREEN)Update vitess deps ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
150 151 152 153 154
	govendor fetch -v vitess.io/vitess/...

# Update tidb vendor
.PHONY: tidb
tidb:
155
	@echo "$(CGREEN)Update tidb deps ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
156 157 158 159 160
	govendor fetch -v github.com/pingcap/tidb/...

# make pingcap parser
.PHONY: pingcap-parser
pingcap-parser: tidb
161
	@echo "$(CGREEN)Update pingcap parser deps ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
162
	govendor fetch -v github.com/pingcap/parser/...
martianzhang's avatar
martianzhang 已提交
163 164 165

# Update all vendor
.PHONY: vendor
martianzhang's avatar
martianzhang 已提交
166
vendor: vitess pingcap-parser
martianzhang's avatar
martianzhang 已提交
167 168
# gometalinter
.PHONY: lint
martianzhang's avatar
martianzhang 已提交
169
lint: build
170
	@echo "$(CGREEN)Run linter check ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
171
	CGO_ENABLED=0 GOMODULE111=off retool do gometalinter.v2 -j 1 --config doc/example/metalinter.json ./...
martianzhang's avatar
martianzhang 已提交
172 173
	GOMODULE111=off retool do revive -formatter friendly --exclude vendor/... -config doc/example/revive.toml ./...
	GOMODULE111=off retool do golangci-lint --tests=false run
martianzhang's avatar
martianzhang 已提交
174 175 176
	@echo "gometalinter check your code is pretty good"

.PHONY: release
martianzhang's avatar
martianzhang 已提交
177
release: build
178
	@echo "$(CGREEN)Cross platform building for release ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
179
	@mkdir -p release
martianzhang's avatar
martianzhang 已提交
180
	@for GOOS in darwin linux windows; do \
181
		for GOARCH in amd64; do \
martianzhang's avatar
martianzhang 已提交
182 183 184
			for d in $$(go list -f '{{if (eq .Name "main")}}{{.ImportPath}}{{end}}' ./...); do \
				b=$$(basename $${d}) ; \
				echo "Building $${b}.$${GOOS}-$${GOARCH} ..."; \
martianzhang's avatar
martianzhang 已提交
185
				GO111MODULE=auto CGO_ENABLED=0 GOOS=$${GOOS} GOARCH=$${GOARCH} go build ${GCFLAGS} ${LDFLAGS} -v -o release/$${b}.$${GOOS}-$${GOARCH} $$d 2>/dev/null ; \
martianzhang's avatar
martianzhang 已提交
186 187 188 189 190 191
			done ; \
		done ;\
	done

.PHONY: docker
docker:
martianzhang's avatar
martianzhang 已提交
192
	@echo "$(CGREEN)Build mysql test environment ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
193
	@docker stop soar-mysql 2>/dev/null || true
194
	@docker wait soar-mysql 2>/dev/null >/dev/null || true
195
	@echo "docker run --name soar-mysql $(MYSQL_RELEASE):$(MYSQL_VERSION)"
martianzhang's avatar
martianzhang 已提交
196 197 198 199
	@docker run --name soar-mysql --rm -d \
	-e MYSQL_ROOT_PASSWORD=1tIsB1g3rt \
	-e MYSQL_DATABASE=sakila \
	-p 3306:3306 \
200
	-v `pwd`/test/sql/init.sql.gz:/docker-entrypoint-initdb.d/init.sql.gz \
201 202
	$(MYSQL_RELEASE):$(MYSQL_VERSION) \
	--sql-mode ""
martianzhang's avatar
martianzhang 已提交
203

martianzhang's avatar
martianzhang 已提交
204
	@echo "waiting for sakila database initializing "
205 206 207 208 209
	@timeout=180; while [ $${timeout} -gt 0 ] ; do \
		if ! docker exec soar-mysql mysql --user=root --password=1tIsB1g3rt --host "127.0.0.1" --silent -NBe "do 1" >/dev/null 2>&1 ; then \
			timeout=`expr $$timeout - 1`; \
			printf '.' ;  sleep 1 ; \
		else \
martianzhang's avatar
martianzhang 已提交
210
			echo "." ; echo "mysql test environment is ready!" ; break ; \
211 212 213 214 215
		fi ; \
		if [ $$timeout = 0 ] ; then \
			echo "." ; echo "$(CRED)docker soar-mysql start timeout(180 s)!$(CEND)" ; exit 1 ; \
		fi ; \
	done
martianzhang's avatar
martianzhang 已提交
216

217 218
.PHONY: docker-connect
docker-connect:
219
	@docker exec -it soar-mysql mysql --user=root --password=1tIsB1g3rt --host "127.0.0.1" sakila
martianzhang's avatar
martianzhang 已提交
220

221 222 223 224
# attach docker container with bash interactive mode
.PHONY: docker-it
docker-it:
	docker exec -it soar-mysql /bin/bash
martianzhang's avatar
martianzhang 已提交
225 226

.PHONY: daily
227
daily: | deps fmt vendor docker cover doc lint release install test-cli clean logo
228
	@echo "$(CGREEN)daily build finished ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
229

martianzhang's avatar
martianzhang 已提交
230
# vendor, docker will cost long time, if all those are ready, daily-quick will much more fast.
martianzhang's avatar
martianzhang 已提交
231
.PHONY: daily-quick
232
daily-quick: | deps fmt cover test-cli doc lint logo
233
	@echo "$(CGREEN)daily-quick build finished ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
234

martianzhang's avatar
martianzhang 已提交
235 236
.PHONY: logo
logo:
237
	@echo "$(CYELLOW)"
martianzhang's avatar
martianzhang 已提交
238
	@cat doc/images/logo.ascii
239
	@echo "$(CEND)"
martianzhang's avatar
martianzhang 已提交
240 241 242 243

# Cleans our projects: deletes binaries
.PHONY: clean
clean:
244
	@echo "$(CGREEN)Cleanup ...$(CEND)"
martianzhang's avatar
martianzhang 已提交
245 246 247 248 249 250
	go clean
	@for GOOS in darwin linux windows; do \
	    for GOARCH in 386 amd64; do \
			rm -f ${BINARY}.$${GOOS}-$${GOARCH} ;\
		done ;\
	done
251
	rm -f ${BINARY} coverage.* test/tmp/*
martianzhang's avatar
martianzhang 已提交
252 253 254
	find . -name "*.log" -delete
	git clean -fi
	docker stop soar-mysql 2>/dev/null || true