kraken
/
Makefile
264 строки · 8.7 Кб
1SHELL = /bin/bash -o pipefail
2GO = go
3
4# Flags to pass to go build
5BUILD_FLAGS = -gcflags '-N -l'
6BUILD_QUIET ?= -q
7
8GOLANG_IMAGE ?= golang:1.14
9GOPROXY ?= $(shell go env GOPROXY)
10
11# Where to find your project
12PROJECT_ROOT = github.com/uber/kraken
13PACKAGE_VERSION ?= $(shell git describe --always --tags)
14
15ALL_SRC = $(shell find . -name "*.go" | grep -v \
16-e ".*/\..*" \
17-e ".*/_.*" \
18-e ".*/mocks.*" \
19-e ".*/*.pb.go")
20
21ALL_PKGS = $(shell go list $(sort $(dir $(ALL_SRC))))
22
23# ==== BASIC ====
24
25BUILD_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.
29CROSS_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
31LINUX_BINS = \
32agent/agent \
33build-index/build-index \
34origin/origin \
35proxy/proxy \
36tools/bin/testfs/testfs \
37tracker/tracker
38
39REGISTRY ?= gcr.io/uber-container-tools
40
41$(LINUX_BINS):: $(ALL_SRC)
42$(CROSS_COMPILER)
43
44define tag_image
45docker tag $(1):$(PACKAGE_VERSION) $(1):dev
46docker tag $(1):$(PACKAGE_VERSION) $(REGISTRY)/$(1):$(PACKAGE_VERSION)
47endef
48
49.PHONY: images
50images: $(LINUX_BINS)
51docker build $(BUILD_QUIET) -t kraken-agent:$(PACKAGE_VERSION) -f docker/agent/Dockerfile ./
52docker build $(BUILD_QUIET) -t kraken-build-index:$(PACKAGE_VERSION) -f docker/build-index/Dockerfile ./
53docker build $(BUILD_QUIET) -t kraken-origin:$(PACKAGE_VERSION) -f docker/origin/Dockerfile ./
54docker build $(BUILD_QUIET) -t kraken-proxy:$(PACKAGE_VERSION) -f docker/proxy/Dockerfile ./
55docker build $(BUILD_QUIET) -t kraken-testfs:$(PACKAGE_VERSION) -f docker/testfs/Dockerfile ./
56docker build $(BUILD_QUIET) -t kraken-tracker:$(PACKAGE_VERSION) -f docker/tracker/Dockerfile ./
57docker 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
67publish: images
68docker push $(REGISTRY)/kraken-agent:$(PACKAGE_VERSION)
69docker push $(REGISTRY)/kraken-build-index:$(PACKAGE_VERSION)
70docker push $(REGISTRY)/kraken-origin:$(PACKAGE_VERSION)
71docker push $(REGISTRY)/kraken-proxy:$(PACKAGE_VERSION)
72docker push $(REGISTRY)/kraken-testfs:$(PACKAGE_VERSION)
73docker push $(REGISTRY)/kraken-tracker:$(PACKAGE_VERSION)
74docker push $(REGISTRY)/kraken-herd:$(PACKAGE_VERSION)
75
76clean::
77@rm -f $(LINUX_BINS)
78
79.PHONY: bins
80bins: $(LINUX_BINS)
81
82# ==== TEST ====
83.PHONY: unit-test
84unit-test:
85-rm coverage.txt
86$(GO) test -timeout=30s -race -coverprofile=coverage.txt $(ALL_PKGS) --tags "unit"
87
88.PHONY: docker_stop
89docker_stop:
90-docker ps -a --format '{{.Names}}' | grep kraken | while read n; do docker rm -f $$n; done
91
92venv: requirements-tests.txt
93virtualenv --python=$(shell which python2) --setuptools venv
94source venv/bin/activate
95venv/bin/pip install -r requirements-tests.txt
96
97.PHONY: integration
98FILE?=
99NAME?=test_
100USERNAME:=$(shell id -u -n)
101USERID:=$(shell id -u)
102integration: venv $(LINUX_BINS) docker_stop tools/bin/puller/puller
103docker build $(BUILD_QUIET) -t kraken-agent:$(PACKAGE_VERSION) -f docker/agent/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
104docker build $(BUILD_QUIET) -t kraken-build-index:$(PACKAGE_VERSION) -f docker/build-index/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
105docker build $(BUILD_QUIET) -t kraken-origin:$(PACKAGE_VERSION) -f docker/origin/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
106docker build $(BUILD_QUIET) -t kraken-proxy:$(PACKAGE_VERSION) -f docker/proxy/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
107docker build $(BUILD_QUIET) -t kraken-testfs:$(PACKAGE_VERSION) -f docker/testfs/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
108docker build $(BUILD_QUIET) -t kraken-tracker:$(PACKAGE_VERSION) -f docker/tracker/Dockerfile --build-arg USERID=$(USERID) --build-arg USERNAME=$(USERNAME) ./
109PACKAGE_VERSION=$(PACKAGE_VERSION) venv/bin/py.test --timeout=120 -v -k $(NAME) test/python/$(FILE)
110
111.PHONY: runtest
112NAME?=test_
113runtest: venv docker_stop
114source venv/bin/activate
115venv/bin/py.test --timeout=120 -v -k $(NAME) test/python
116
117.PHONY: devcluster
118devcluster: $(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
125TOOLS = \
126tools/bin/puller/puller \
127tools/bin/reload/reload \
128tools/bin/visualization/visualization
129
130tools/bin/puller/puller:: $(wildcard tools/bin/puller/puller/*.go)
131$(CROSS_COMPILER)
132
133tools/bin/reload/reload:: $(wildcard tools/bin/reload/reload/*.go)
134$(CROSS_COMPILER)
135
136tools/bin/visualization/visualization:: $(wildcard tools/bin/visualization/visualization/*.go)
137$(CROSS_COMPILER)
138
139.PHONY: tools
140tools: $(TOOLS)
141
142# Creates a release summary containing the build revisions of each component
143# for the specified version.
144releases/%:
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.
156PROTOC_BIN = protoc
157
158PROTO = $(GEN_DIR)/proto/p2p/p2p.pb.go
159
160GEN_DIR = gen/go
161
162.PHONY: protoc
163protoc:
164mkdir -p $(GEN_DIR)
165go 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`.
171mockgen = $(shell go env GOPATH)/bin/mockgen
172
173define lowercase
174$(shell tr '[:upper:]' '[:lower:]' <<< $(1))
175endef
176
177define add_mock
178mkdir -p mocks/$(1)
179$(mockgen) \
180-destination=mocks/$(1)/$(call lowercase,$(2)).go \
181-package mock$(notdir $(1)) \
182$(PROJECT_ROOT)/$(1) $(2)
183endef
184
185.PHONY: mocks
186mocks:
187rm -rf mocks
188mkdir -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.
195sed -i '' s,github.com/uber/kraken/vendor/,, mocks/lib/backend/s3backend/s3.go
196
197$(call add_mock,lib/backend/gcsbackend,GCS)
198sed -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
259kubecluster:
260cd ./examples/k8s && bash deploy.sh
261
262.PHONY: docs
263docs:
264@./scripts/mkdocs.sh -q serve
265