-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
187 lines (161 loc) · 5.7 KB
/
Makefile
File metadata and controls
187 lines (161 loc) · 5.7 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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
binary=tech
dockeruser=hatlonely
gituser=hpifu
repository=go-tech
version=$(shell git describe --tags)
export GOPATH=$(shell pwd)/../../../../
export PATH:=${PATH}:${GOPATH}/bin:$(shell pwd)/third/go/bin:$(shell pwd)/third/protobuf/bin:$(shell pwd)/third/cloc-1.76:$(shell pwd)/third/redis-3.2.8/src
.PHONY: all
all: third vendor output test stat
.PHONY: deploy
deploy:
mkdir -p /var/docker/${repository}/log
docker stack deploy -c stack.yml ${repository}
.PHONY: remove
remove:
docker stack rm ${repository}
.PHONY: push
push:
docker push ${dockeruser}/${repository}:${version}
.PHONY: buildenv
buildenv:
if [ -z "$(shell docker network ls --filter name=testnet -q)" ]; then \
docker network create -d bridge testnet; \
fi
# if [ -z "$(shell docker ps --filter name=test-elasticsearch -q)" ]; then \
# docker run --name test-elasticsearch --hostname test-elasticsearch --network testnet -e "discovery.type=single-node" -d elasticsearch:7.3.2; \
# fi
if [ -z "$(shell docker ps --filter name=test-mysql -q)" ]; then \
docker run --name test-mysql --hostname test-mysql --network testnet -e MYSQL_ROOT_PASSWORD=keaiduo1 -d hatlonely/mysql:v1.0.1; \
fi
if [ -z "$(shell docker ps --filter name=go-build-env -q)" ]; then \
docker run --name go-build-env --network testnet -d hatlonely/go-env:v1.0.1 tail -f /dev/null; \
fi
.PHONY: cleanbuildenv
cleanbuildenv:
if [ ! -z "$(shell docker ps --filter name=go-build-env -q)" ]; then \
docker stop go-build-env && docker rm go-build-env; \
fi
# if [ ! -z "$(shell docker ps --filter name=test-elasticsearch -q)" ]; then \
# docker stop test-elasticsearch && docker rm test-elasticsearch; \
# fi
if [ ! -z "$(shell docker ps --filter name=test-mysql -q)" ]; then \
docker stop test-mysql && docker rm test-mysql; \
fi
if [ ! -z "$(shell docker network ls --filter name=testnet -q)" ]; then \
docker network rm testnet; \
fi
.PHONY: image
image: buildenv
docker exec go-build-env rm -rf /data/src/${gituser}/${repository}
docker exec go-build-env mkdir -p /data/src/${gituser}/${repository}
docker cp . go-build-env:/data/src/${gituser}/${repository}
docker exec go-build-env bash -c "cd /data/src/${gituser}/${repository} && make output"
mkdir -p docker/
docker cp go-build-env:/data/src/${gituser}/${repository}/output/${repository} docker/
docker build --tag=hatlonely/${repository}:${version} .
cat stack.tpl.yml | sed 's/\$${version}/${version}/g' | sed 's/\$${repository}/${repository}/g' > stack.yml
.PHONY: dockertest
dockertest: buildenv
# docker exec go-build-env rm -rf /data/src/${gituser}/${repository}
# docker exec go-build-env mkdir -p /data/src/${gituser}/${repository}
# docker cp . go-build-env:/data/src/${gituser}/${repository}
docker exec go-build-env bash -c "cd /data/src/${gituser}/${repository} && make test"
.PHONY: dockerbehave
dockerbehave: buildenv
# docker exec go-build-env rm -rf /data/src/${gituser}/${repository}
# docker exec go-build-env mkdir -p /data/src/${gituser}/${repository}
# docker cp . go-build-env:/data/src/${gituser}/${repository}
docker exec go-build-env bash -c "cd /data/src/${gituser}/${repository} && make behave"
output: cmd/*/*.go internal/*/*.go scripts/version.sh Makefile vendor
@echo "compile"
@go build -i -ldflags "-X 'main.AppVersion=`sh scripts/version.sh`'" cmd/${binary}/main.go && \
mkdir -p output/${repository}/bin && mv main output/${repository}/bin/${binary} && \
mkdir -p output/${repository}/configs && cp configs/${binary}/* output/${repository}/configs && \
mkdir -p output/${repository}/log
vendor: go.mod
@echo "install golang dependency"
go mod vendor
%_easyjson.go: %.go
easyjson $<
%.pb.go: %.proto
protoc --gofast_out=plugins=grpc:. $<
.PHONY: test
test: vendor
@echo "Run unit tests"
cd internal && go test -cover ./...
.PHONY: behave
behave: output
behave features
.PHONY: stat
stat: cloc gocyclo
@echo "code statistics"
cloc internal Makefile --by-file
@echo "circle complexity statistics"
gocyclo internal
@gocyclo internal | awk '{sum+=$$1}END{printf("complexity: %s", sum)}'
.PHONY: clean
clean:
rm -rf output
.PHONY: deep_clean
deep_clean:
rm -rf output vendor third
third: protoc golang cloc gocyclo easyjson
.PHONY: protoc
protoc: golang
@hash protoc 2>/dev/null || { \
echo "install protobuf codegen tool protoc" && \
mkdir -p third && cd third && \
wget https://github.com/google/protobuf/releases/download/v3.2.0/protobuf-cpp-3.2.0.tar.gz && \
tar -xzvf protobuf-cpp-3.2.0.tar.gz && \
cd protobuf-3.2.0 && \
./configure --prefix=`pwd`/../protobuf && \
make -j8 && \
make install && \
cd ../.. && \
protoc --version; \
}
@hash protoc-gen-go 2>/dev/null || { \
echo "install protobuf golang plugin protoc-gen-go" && \
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}; \
}
.PHONY: golang
golang:
@hash go 2>/dev/null || { \
echo "install go1.9" && \
mkdir -p third && cd third && \
wget https://dl.google.com/go/go1.9.linux-amd64.tar.gz && \
tar -xzvf go1.9.linux-amd64.tar.gz && \
cd .. && \
go version; \
}
.PHONY: cloc
cloc:
@hash cloc 2>/dev/null || { \
echo "install cloc" && \
mkdir -p third && cd third && \
wget https://github.com/AlDanial/cloc/archive/v1.76.zip && \
unzip v1.76.zip; \
}
.PHONY: gocyclo
gocyclo: golang
@hash gocyclo 2>/dev/null || { \
echo "install gocyclo" && \
go get -u github.com/fzipp/gocyclo; \
}
.PHONY: easyjson
easyjson: golang
@hash easyjson 2>/dev/null || { \
echo "install easyjson" && \
go get -u github.com/mailru/easyjson/...; \
}
.PHONY: redis
redis:
@hash redis 2>/dev/null || { \
echo "install redis" && \
mkdir -p third && cd third && \
wget http://download.redis.io/releases/redis-3.2.8.tar.gz && \
tar -xzvf redis-3.2.8.tar.gz && \
cd redis-3.2.8 && \
make -j8; \
}