kraken

Форк
0
/
Makefile 
264 строки · 8.7 Кб
1
SHELL = /bin/bash -o pipefail
2
GO = go
3

4
# Flags to pass to go build
5
BUILD_FLAGS = -gcflags '-N -l'
6
BUILD_QUIET ?= -q
7

8
GOLANG_IMAGE ?= golang:1.14
9
GOPROXY ?= $(shell go env GOPROXY)
10

11
# Where to find your project
12
PROJECT_ROOT = github.com/uber/kraken
13
PACKAGE_VERSION ?= $(shell git describe --always --tags)
14

15
ALL_SRC = $(shell find . -name "*.go" | grep -v \
16
	-e ".*/\..*" \
17
	-e ".*/_.*" \
18
	-e ".*/mocks.*" \
19
	-e ".*/*.pb.go")
20

21
ALL_PKGS = $(shell go list $(sort $(dir $(ALL_SRC))))
22

23
# ==== BASIC ====
24

25
BUILD_LINUX = GOOS=linux GOARCH=amd64 $(GO) build -i -o $@ $(BUILD_FLAGS) $(BUILD_GC_FLAGS) $(BUILD_VERSION_FLAGS) ./$(dir $@)
26

27
# Cross compiling cgo for sqlite3 is not well supported in Mac OSX.
28
# This workaround builds the binary inside a linux container.
29
CROSS_COMPILER = docker run --rm -it -v $(shell pwd):/go/src/github.com/uber/kraken -w /go/src/github.com/uber/kraken -e GOPROXY=$(GOPROXY) $(GOLANG_IMAGE) go build -o ./$@ ./$(dir $@)
30

31
LINUX_BINS = \
32
	agent/agent \
33
	build-index/build-index \
34
	origin/origin \
35
	proxy/proxy \
36
	tools/bin/testfs/testfs \
37
	tracker/tracker
38

39
REGISTRY ?= gcr.io/uber-container-tools
40

41
$(LINUX_BINS):: $(ALL_SRC)
42
	$(CROSS_COMPILER)
43

44
define tag_image
45
	docker tag $(1):$(PACKAGE_VERSION) $(1):dev
46
	docker tag $(1):$(PACKAGE_VERSION) $(REGISTRY)/$(1):$(PACKAGE_VERSION)
47
endef
48

49
.PHONY: images
50
images: $(LINUX_BINS)
51
	docker build $(BUILD_QUIET) -t kraken-agent:$(PACKAGE_VERSION) -f docker/agent/Dockerfile ./
52
	docker build $(BUILD_QUIET) -t kraken-build-index:$(PACKAGE_VERSION) -f docker/build-index/Dockerfile ./
53
	docker build $(BUILD_QUIET) -t kraken-origin:$(PACKAGE_VERSION) -f docker/origin/Dockerfile ./
54
	docker build $(BUILD_QUIET) -t kraken-proxy:$(PACKAGE_VERSION) -f docker/proxy/Dockerfile ./
55
	docker build $(BUILD_QUIET) -t kraken-testfs:$(PACKAGE_VERSION) -f docker/testfs/Dockerfile ./
56
	docker build $(BUILD_QUIET) -t kraken-tracker:$(PACKAGE_VERSION) -f docker/tracker/Dockerfile ./
57
	docker build $(BUILD_QUIET) -t kraken-herd:$(PACKAGE_VERSION) -f docker/herd/Dockerfile ./
58
	$(call tag_image,kraken-agent)
59
	$(call tag_image,kraken-build-index)
60
	$(call tag_image,kraken-origin)
61
	$(call tag_image,kraken-proxy)
62
	$(call tag_image,kraken-testfs)
63
	$(call tag_image,kraken-tracker)
64
	$(call tag_image,kraken-herd)
65

66
.PHONY: publish
67
publish: images
68
	docker push $(REGISTRY)/kraken-agent:$(PACKAGE_VERSION)
69
	docker push $(REGISTRY)/kraken-build-index:$(PACKAGE_VERSION)
70
	docker push $(REGISTRY)/kraken-origin:$(PACKAGE_VERSION)
71
	docker push $(REGISTRY)/kraken-proxy:$(PACKAGE_VERSION)
72
	docker push $(REGISTRY)/kraken-testfs:$(PACKAGE_VERSION)
73
	docker push $(REGISTRY)/kraken-tracker:$(PACKAGE_VERSION)
74
	docker push $(REGISTRY)/kraken-herd:$(PACKAGE_VERSION)
75

76
clean::
77
	@rm -f $(LINUX_BINS)
78

79
.PHONY: bins
80
bins: $(LINUX_BINS)
81

82
# ==== TEST ====
83
.PHONY: unit-test
84
unit-test:
85
	-rm coverage.txt
86
	$(GO) test -timeout=30s -race -coverprofile=coverage.txt $(ALL_PKGS) --tags "unit"
87

88
.PHONY: docker_stop
89
docker_stop:
90
	-docker ps -a --format '{{.Names}}' | grep kraken | while read n; do docker rm -f $$n; done
91

92
venv: requirements-tests.txt
93
	virtualenv --python=$(shell which python2) --setuptools venv
94
	source venv/bin/activate
95
	venv/bin/pip install -r requirements-tests.txt
96

97
.PHONY: integration
98
FILE?=
99
NAME?=test_
100
USERNAME:=$(shell id -u -n)
101
USERID:=$(shell id -u)
102
integration: venv $(LINUX_BINS) docker_stop tools/bin/puller/puller
103
	docker build $(BUILD_QUIET) -t kraken-agent:$(PACKAGE_VERSION) -f docker/agent/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
104
	docker build $(BUILD_QUIET) -t kraken-build-index:$(PACKAGE_VERSION) -f docker/build-index/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
105
	docker build $(BUILD_QUIET) -t kraken-origin:$(PACKAGE_VERSION) -f docker/origin/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
106
	docker build $(BUILD_QUIET) -t kraken-proxy:$(PACKAGE_VERSION) -f docker/proxy/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
107
	docker build $(BUILD_QUIET) -t kraken-testfs:$(PACKAGE_VERSION) -f docker/testfs/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
108
	docker build $(BUILD_QUIET) -t kraken-tracker:$(PACKAGE_VERSION) -f docker/tracker/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
109
	PACKAGE_VERSION=$(PACKAGE_VERSION) venv/bin/py.test --timeout=120 -v -k $(NAME) test/python/$(FILE)
110

111
.PHONY: runtest
112
NAME?=test_
113
runtest: venv docker_stop
114
	source venv/bin/activate
115
	venv/bin/py.test --timeout=120 -v -k $(NAME) test/python
116

117
.PHONY: devcluster
118
devcluster: $(LINUX_BINS) docker_stop images
119
	./examples/devcluster/herd_start_container.sh
120
	./examples/devcluster/agent_one_start_container.sh
121
	./examples/devcluster/agent_two_start_container.sh
122

123
# ==== TOOLS ====
124

125
TOOLS = \
126
	tools/bin/puller/puller \
127
	tools/bin/reload/reload \
128
	tools/bin/visualization/visualization
129

130
tools/bin/puller/puller:: $(wildcard tools/bin/puller/puller/*.go)
131
	$(CROSS_COMPILER)
132

133
tools/bin/reload/reload:: $(wildcard tools/bin/reload/reload/*.go)
134
	$(CROSS_COMPILER)
135

136
tools/bin/visualization/visualization:: $(wildcard tools/bin/visualization/visualization/*.go)
137
	$(CROSS_COMPILER)
138

139
.PHONY: tools
140
tools: $(TOOLS)
141

142
# Creates a release summary containing the build revisions of each component
143
# for the specified version.
144
releases/%:
145
	./scripts/release.sh $(subst releases/,,$@)
146

147
# ==== CODE GENERATION ====
148

149
# In order for kraken to be imported by other projects, we need to check in all
150
# the generated code, otherwise dependency management tools would report errors
151
# caused by missing dependencies of kraken itself.
152

153
# protoc must be installed on the system to make this work.
154
# Install it by by following instructions on:
155
# https://github.com/protocolbuffers/protobuf.
156
PROTOC_BIN = protoc
157

158
PROTO = $(GEN_DIR)/proto/p2p/p2p.pb.go
159

160
GEN_DIR = gen/go
161

162
.PHONY: protoc
163
protoc:
164
	mkdir -p $(GEN_DIR)
165
	go get -u github.com/golang/protobuf/protoc-gen-go
166
	$(PROTOC_BIN) --plugin=$(shell go env GOPATH)/bin/protoc-gen-go --go_out=$(GEN_DIR) $(subst .pb.go,.proto,$(subst $(GEN_DIR)/,,$(PROTO)))
167

168
# mockgen must be installed on the system to make this work.
169
# Install it by running:
170
# `go get github.com/golang/mock/mockgen`.
171
mockgen = $(shell go env GOPATH)/bin/mockgen
172

173
define lowercase
174
$(shell tr '[:upper:]' '[:lower:]' <<< $(1))
175
endef
176

177
define add_mock
178
	mkdir -p mocks/$(1)
179
	$(mockgen) \
180
		-destination=mocks/$(1)/$(call lowercase,$(2)).go \
181
		-package mock$(notdir $(1)) \
182
		$(PROJECT_ROOT)/$(1) $(2)
183
endef
184

185
.PHONY: mocks
186
mocks:
187
	rm -rf mocks
188
	mkdir -p $(shell go env GOPATH)/bin
189

190
	$(call add_mock,agent/agentclient,Client)
191

192
	$(call add_mock,lib/backend/s3backend,S3)
193
	# mockgen doesn't play nice when importing vendor code. Must strip the vendor prefix
194
	# from the imports.
195
	sed -i '' s,github.com/uber/kraken/vendor/,, mocks/lib/backend/s3backend/s3.go
196

197
	$(call add_mock,lib/backend/gcsbackend,GCS)
198
	sed -i '' s,github.com/uber/kraken/vendor/,, mocks/lib/backend/gcsbackend/gcs.go
199

200
	$(call add_mock,lib/hashring,Ring)
201
	$(call add_mock,lib/hashring,Watcher)
202

203
	$(call add_mock,lib/backend/hdfsbackend/webhdfs,Client)
204

205
	$(call add_mock,lib/hostlist,List)
206

207
	$(call add_mock,lib/healthcheck,Checker)
208
	$(call add_mock,lib/healthcheck,Filter)
209
	$(call add_mock,lib/healthcheck,PassiveFilter)
210

211
	$(call add_mock,tracker/originstore,Store)
212

213
	$(call add_mock,build-index/tagstore,Store)
214
	$(call add_mock,build-index/tagstore,FileStore)
215

216
	$(call add_mock,build-index/tagtype,DependencyResolver)
217

218
	$(call add_mock,build-index/tagclient,Provider)
219
	$(call add_mock,build-index/tagclient,Client)
220

221
	$(call add_mock,tracker/announceclient,Client)
222

223
	$(call add_mock,utils/dedup,TaskRunner)
224
	$(call add_mock,utils/dedup,IntervalTask)
225

226
	$(call add_mock,lib/backend,Client)
227

228
	$(call add_mock,tracker/peerstore,Store)
229

230
	$(call add_mock,lib/store,FileReadWriter)
231

232
	$(call add_mock,lib/torrent/scheduler,ReloadableScheduler)
233
	$(call add_mock,lib/torrent/scheduler,Scheduler)
234

235
	$(call add_mock,origin/blobclient,Client)
236
	$(call add_mock,origin/blobclient,Provider)
237
	$(call add_mock,origin/blobclient,ClusterClient)
238
	$(call add_mock,origin/blobclient,ClusterProvider)
239
	$(call add_mock,origin/blobclient,ClientResolver)
240

241
	$(call add_mock,lib/containerruntime,Factory)
242
	$(call add_mock,lib/containerruntime/containerd,Client)
243
	$(call add_mock,lib/containerruntime/dockerdaemon,DockerClient)
244
	$(call add_mock,lib/dockerregistry/transfer,ImageTransferer)
245

246
	$(call add_mock,tracker/metainfoclient,Client)
247

248
	$(call add_mock,lib/persistedretry,Store)
249
	$(call add_mock,lib/persistedretry,Task)
250
	$(call add_mock,lib/persistedretry,Executor)
251
	$(call add_mock,lib/persistedretry,Manager)
252

253
	$(call add_mock,lib/persistedretry/tagreplication,RemoteValidator)
254

255
	$(call add_mock,utils/httputil,RoundTripper)
256

257
# ==== MISC ====
258

259
kubecluster:
260
	cd ./examples/k8s && bash deploy.sh
261

262
.PHONY: docs
263
docs:
264
	@./scripts/mkdocs.sh -q serve
265

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.