1GO_VERSION ?= 1.17.5
2GOOS ?= linux
3GOARCH ?= amd64
4GOPATH ?= $(shell go env GOPATH)
5COMPOSE_PROJECT_NAME := ${TAG}-$(shell git rev-parse --abbrev-ref HEAD)
6BRANCH_NAME ?= $(shell git rev-parse --abbrev-ref HEAD | sed "s!/!-!g")
7ifeq (${BRANCH_NAME},main)
8TAG    := $(shell git rev-parse --short HEAD)-go${GO_VERSION}
9TRACKED_BRANCH := true
10LATEST_TAG := latest
11else
12TAG    := $(shell git rev-parse --short HEAD)-${BRANCH_NAME}-go${GO_VERSION}
13ifneq (,$(findstring release-,$(BRANCH_NAME)))
14TRACKED_BRANCH := true
15LATEST_TAG := ${BRANCH_NAME}-latest
16endif
17endif
18CUSTOMTAG ?=
19
20FILEEXT :=
21ifeq (${GOOS},windows)
22FILEEXT := .exe
23endif
24
25DOCKER_BUILD := docker build \
26	--build-arg TAG=${TAG}
27
28.DEFAULT_GOAL := help
29.PHONY: help
30help:
31	@awk 'BEGIN { \
32		FS = ":.*##"; \
33		printf "\nUsage:\n  make \033[36m<target>\033[0m\n"\
34	} \
35	/^[a-zA-Z_-]+:.*?##/ { \
36		printf "  \033[36m%-17s\033[0m %s\n", $$1, $$2 \
37	} \
38	/^##@/ { \
39		printf "\n\033[1m%s\033[0m\n", substr($$0, 5) \
40	} ' $(MAKEFILE_LIST)
41
42##@ Dependencies
43
44.PHONY: build-dev-deps
45build-dev-deps: ## Install dependencies for builds
46	go get golang.org/x/tools/cover
47	go get github.com/go-bindata/go-bindata/go-bindata
48	go get github.com/josephspurrier/goversioninfo/cmd/goversioninfo
49
50.PHONY: lint
51lint: ## Analyze and find programs in source code
52	@echo "Running ${@}"
53	@golangci-lint run
54
55.PHONY: goimports-fix
56goimports-fix: ## Applies goimports to every go file (excluding vendored files)
57	goimports -w -local storj.io $$(find . -type f -name '*.go' -not -path "*/vendor/*")
58
59.PHONY: goimports-st
60goimports-st: ## Applies goimports to every go file in `git status` (ignores untracked files)
61	@git status --porcelain -uno|grep .go|grep -v "^D"|sed -E 's,\w+\s+(.+->\s+)?,,g'|xargs -I {} goimports -w -local storj.io {}
62
63.PHONY: build-packages
64build-packages: build-packages-race build-packages-normal build-satellite-npm build-storagenode-npm build-multinode-npm build-satellite-admin-npm ## Test docker images locally
65build-packages-race:
66	go build -v ./...
67build-packages-normal:
68	go build -v -race ./...
69build-satellite-npm:
70	cd web/satellite && npm ci
71build-storagenode-npm:
72	cd web/storagenode && npm ci
73build-multinode-npm:
74	cd web/multinode && npm ci
75build-satellite-admin-npm:
76	cd satellite/admin/ui && npm ci
77
78##@ Simulator
79
80# Allow the caller to set GATEWAYPATH if desired. This controls where the new
81# go module is created to install the specific gateway version.
82ifndef GATEWAYPATH
83GATEWAYPATH=.build/gateway-tmp
84endif
85.PHONY: install-sim
86install-sim: ## install storj-sim
87	@echo "Running ${@}"
88	go install -race -v \
89		storj.io/storj/cmd/satellite \
90		storj.io/storj/cmd/storagenode \
91		storj.io/storj/cmd/storj-sim \
92		storj.io/storj/cmd/versioncontrol \
93		storj.io/storj/cmd/uplink \
94		storj.io/storj/cmd/identity \
95		storj.io/storj/cmd/certificates \
96		storj.io/storj/cmd/multinode
97
98	## install the latest stable version of Gateway-ST
99	go install -race -v storj.io/gateway@latest
100
101##@ Test
102
103.PHONY: test
104test: ## Run tests on source code (jenkins)
105	go test -race -v -cover -coverprofile=.coverprofile ./...
106	@echo done
107
108.PHONY: test-sim
109test-sim: ## Test source with storj-sim (jenkins)
110	@echo "Running ${@}"
111	@./scripts/test-sim.sh
112
113.PHONY: test-sim-redis-unavailability
114test-sim-redis-unavailability: ## Test source with Redis availability with storj-sim (jenkins)
115	@echo "Running ${@}"
116	@./scripts/test-sim-redis-up-and-down.sh
117
118
119.PHONY: test-certificates
120test-certificates: ## Test certificate signing service and storagenode setup (jenkins)
121	@echo "Running ${@}"
122	@./scripts/test-certificates.sh
123
124.PHONY: test-sim-backwards-compatible
125test-sim-backwards-compatible: ## Test uploading a file with lastest release (jenkins)
126	@echo "Running ${@}"
127	@./scripts/test-sim-backwards.sh
128
129.PHONY: check-monitoring
130check-monitoring: ## Check for locked monkit calls that have changed
131	@echo "Running ${@}"
132	@check-monitoring ./... | diff -U0 ./monkit.lock - \
133	|| (echo "Locked monkit metrics have been changed. **Notify #team-data** and run \`go run github.com/storj/ci/check-monitoring -out monkit.lock ./...\` to update monkit.lock file." \
134	&& exit 1)
135
136.PHONY: test-wasm-size
137test-wasm-size: ## Test that the built .wasm code has not increased in size
138	@echo "Running ${@}"
139	@./scripts/test-wasm-size.sh
140
141##@ Build
142
143.PHONY: storagenode-console
144storagenode-console:
145	# build web assets
146	rm -rf web/storagenode/dist
147	# install npm dependencies and build the binaries
148	docker run --rm -i \
149		--mount type=bind,src="${PWD}",dst=/go/src/storj.io/storj \
150		-w /go/src/storj.io/storj/web/storagenode \
151		-e HOME=/tmp \
152		-u $(shell id -u):$(shell id -g) \
153		node:16.11.1 \
154	  /bin/bash -c "npm ci && npm run build"
155	# embed web assets into go
156	go-bindata -prefix web/storagenode/ -fs -o storagenode/console/consoleassets/bindata.resource.go -pkg consoleassets web/storagenode/dist/... web/storagenode/static/...
157	# configure existing go code to know about the new assets
158	/usr/bin/env echo -e '\nfunc init() { FileSystem = AssetFile() }' >> storagenode/console/consoleassets/bindata.resource.go
159	gofmt -w -s storagenode/console/consoleassets/bindata.resource.go
160
161.PHONY: multinode-console
162multinode-console:
163	# build web assets
164	rm -rf web/multinode/dist
165	# install npm dependencies and build the binaries
166	docker run --rm -i \
167		--mount type=bind,src="${PWD}",dst=/go/src/storj.io/storj \
168		-w /go/src/storj.io/storj/web/multinode \
169		-e HOME=/tmp \
170		-u $(shell id -u):$(shell id -g) \
171		node:16.11.1 \
172	  /bin/bash -c "npm ci && npm run build"
173	# embed web assets into go
174	go-bindata -prefix web/multinode/ -fs -o multinode/console/consoleassets/bindata.resource.go -pkg consoleassets web/multinode/dist/... web/multinode/static/...
175	# configure existing go code to know about the new assets
176	/usr/bin/env echo -e '\nfunc init() { FileSystem = AssetFile() }' >> multinode/console/consoleassets/bindata.resource.go
177	gofmt -w -s multinode/console/consoleassets/bindata.resource.go
178
179.PHONY: satellite-admin-ui
180satellite-admin-ui:
181	# build web assets
182	rm -rf satellite/admin/ui/public/build
183	# install npm dependencies for being embedded by Go embed.
184	docker run --rm -i \
185		--mount type=bind,src="${PWD}",dst=/go/src/storj.io/storj \
186		-w /go/src/storj.io/storj/satellite/admin/ui \
187		-e HOME=/tmp \
188		-u $(shell id -u):$(shell id -g) \
189		node:16.11.1 \
190	  /bin/bash -c "npm ci && npm run build"
191
192.PHONY: satellite-wasm
193satellite-wasm:
194	docker run --rm -i -v "${PWD}":/go/src/storj.io/storj -e GO111MODULE=on \
195	-e GOOS=js -e GOARCH=wasm -e GOARM=6 -e CGO_ENABLED=1 \
196	-v /tmp/go-cache:/tmp/.cache/go-build -v /tmp/go-pkg:/go/pkg \
197	-w /go/src/storj.io/storj -e GOPROXY -e TAG=${TAG} -u $(shell id -u):$(shell id -g) storjlabs/golang:${GO_VERSION} \
198	scripts/build-wasm.sh ;\
199
200.PHONY: images
201images: satellite-image storagenode-image uplink-image versioncontrol-image ## Build satellite, storagenode, uplink, and versioncontrol Docker images
202	echo Built version: ${TAG}
203
204.PHONY: satellite-image
205satellite-image: satellite_linux_arm satellite_linux_arm64 satellite_linux_amd64 ## Build satellite Docker image
206	${DOCKER_BUILD} --pull=true -t storjlabs/satellite:${TAG}${CUSTOMTAG}-amd64 \
207		-f cmd/satellite/Dockerfile .
208	${DOCKER_BUILD} --pull=true -t storjlabs/satellite:${TAG}${CUSTOMTAG}-arm32v6 \
209		--build-arg=GOARCH=arm --build-arg=DOCKER_ARCH=arm32v6 \
210		-f cmd/satellite/Dockerfile .
211	${DOCKER_BUILD} --pull=true -t storjlabs/satellite:${TAG}${CUSTOMTAG}-arm64v8 \
212		--build-arg=GOARCH=arm64 --build-arg=DOCKER_ARCH=arm64v8 \
213		-f cmd/satellite/Dockerfile .
214
215.PHONY: storagenode-image
216storagenode-image: storagenode_linux_arm storagenode_linux_arm64 storagenode_linux_amd64 ## Build storagenode Docker image
217	${DOCKER_BUILD} --pull=true -t storjlabs/storagenode:${TAG}${CUSTOMTAG}-amd64 \
218		-f cmd/storagenode/Dockerfile .
219	${DOCKER_BUILD} --pull=true -t storjlabs/storagenode:${TAG}${CUSTOMTAG}-arm32v6 \
220		--build-arg=GOARCH=arm --build-arg=DOCKER_ARCH=arm32v6 \
221		-f cmd/storagenode/Dockerfile .
222	${DOCKER_BUILD} --pull=true -t storjlabs/storagenode:${TAG}${CUSTOMTAG}-arm64v8 \
223		--build-arg=GOARCH=arm64 --build-arg=DOCKER_ARCH=arm64v8 \
224		-f cmd/storagenode/Dockerfile .
225.PHONY: uplink-image
226uplink-image: uplink_linux_arm uplink_linux_arm64 uplink_linux_amd64 ## Build uplink Docker image
227	${DOCKER_BUILD} --pull=true -t storjlabs/uplink:${TAG}${CUSTOMTAG}-amd64 \
228		-f cmd/uplink/Dockerfile .
229	${DOCKER_BUILD} --pull=true -t storjlabs/uplink:${TAG}${CUSTOMTAG}-arm32v6 \
230		--build-arg=GOARCH=arm --build-arg=DOCKER_ARCH=arm32v6 \
231		-f cmd/uplink/Dockerfile .
232	${DOCKER_BUILD} --pull=true -t storjlabs/uplink:${TAG}${CUSTOMTAG}-arm64v8 \
233		--build-arg=GOARCH=arm64 --build-arg=DOCKER_ARCH=arm64v8 \
234		-f cmd/uplink/Dockerfile .
235.PHONY: versioncontrol-image
236versioncontrol-image: versioncontrol_linux_arm versioncontrol_linux_arm64 versioncontrol_linux_amd64 ## Build versioncontrol Docker image
237	${DOCKER_BUILD} --pull=true -t storjlabs/versioncontrol:${TAG}${CUSTOMTAG}-amd64 \
238		-f cmd/versioncontrol/Dockerfile .
239	${DOCKER_BUILD} --pull=true -t storjlabs/versioncontrol:${TAG}${CUSTOMTAG}-arm32v6 \
240		--build-arg=GOARCH=arm --build-arg=DOCKER_ARCH=arm32v6 \
241		-f cmd/versioncontrol/Dockerfile .
242	${DOCKER_BUILD} --pull=true -t storjlabs/versioncontrol:${TAG}${CUSTOMTAG}-arm64v8 \
243		--build-arg=GOARCH=arm64 --build-arg=DOCKER_ARCH=arm64v8 \
244		-f cmd/versioncontrol/Dockerfile .
245
246.PHONY: binary
247binary: CUSTOMTAG = -${GOOS}-${GOARCH}
248binary:
249	@if [ -z "${COMPONENT}" ]; then echo "Try one of the following targets instead:" \
250		&& for b in binaries ${BINARIES}; do echo "- $$b"; done && exit 1; fi
251	mkdir -p release/${TAG}
252	mkdir -p /tmp/go-cache /tmp/go-pkg
253	rm -f cmd/${COMPONENT}/resource.syso
254	if [ "${GOARCH}" = "amd64" ]; then sixtyfour="-64"; fi; \
255	[ "${GOOS}" = "windows" ] && [ "${GOARCH}" = "amd64" ] && goversioninfo $$sixtyfour -o cmd/${COMPONENT}/resource.syso \
256	-original-name ${COMPONENT}_${GOOS}_${GOARCH}${FILEEXT} \
257	-description "${COMPONENT} program for Storj" \
258        -product-ver-major "$(shell git describe --tags --exact-match --match "v[0-9]*\.[0-9]*\.[0-9]*" | awk -F'.' 'BEGIN {v=0} {gsub("v", "", $$0); v=$$1} END {print v}' )" \
259                -ver-major "$(shell git describe --tags --exact-match --match "v[0-9]*\.[0-9]*\.[0-9]*" | awk -F'.' 'BEGIN {v=0} {gsub("v", "", $$0); v=$$1} END {print v}' )" \
260        -product-ver-minor "$(shell git describe --tags --exact-match --match "v[0-9]*\.[0-9]*\.[0-9]*" | awk -F'.' 'BEGIN {v=0} {v=$$2} END {print v}')" \
261                -ver-minor "$(shell git describe --tags --exact-match --match "v[0-9]*\.[0-9]*\.[0-9]*" | awk -F'.' 'BEGIN {v=0} {v=$$2} END {print v}')" \
262        -product-ver-patch "$(shell git describe --tags --exact-match --match "v[0-9]*\.[0-9]*\.[0-9]*" | awk -F'.' 'BEGIN {v=0} {v=$$3} END {print v}' | awk -F'-' 'BEGIN {v=0} {v=$$1} END {print v}')" \
263                -ver-patch "$(shell git describe --tags --exact-match --match "v[0-9]*\.[0-9]*\.[0-9]*" | awk -F'.' 'BEGIN {v=0} {v=$$3} END {print v}' | awk -F'-' 'BEGIN {v=0} {v=$$1} END {print v}')" \
264        -product-version "$(shell git describe --tags --exact-match --match "v[0-9]*\.[0-9]*\.[0-9]*" | awk -F'-' 'BEGIN {v=0} {v=$$1} END {print v}' || echo "dev" )" \
265        -special-build "$(shell git describe --tags --exact-match --match "v[0-9]*\.[0-9]*\.[0-9]*" | awk -F'-' 'BEGIN {v=0} {v=$$2} END {print v}' )" \
266	resources/versioninfo.json || echo "goversioninfo is not installed, metadata will not be created"
267	docker run --rm -i -v "${PWD}":/go/src/storj.io/storj -e GO111MODULE=on \
268	-e GOOS=${GOOS} -e GOARCH=${GOARCH} -e GOARM=6 -e CGO_ENABLED=1 \
269	-v /tmp/go-cache:/tmp/.cache/go-build -v /tmp/go-pkg:/go/pkg \
270	-w /go/src/storj.io/storj -e GOPROXY -u $(shell id -u):$(shell id -g) storjlabs/golang:${GO_VERSION} \
271	scripts/release.sh build $(EXTRA_ARGS) -o release/${TAG}/$(COMPONENT)_${GOOS}_${GOARCH}${FILEEXT} \
272	storj.io/storj/cmd/${COMPONENT}
273
274	if [ "${COMPONENT}" = "satellite" ] && [ "${GOOS}" = "linux" ] && [ "${GOARCH}" = "amd64" ]; \
275	then \
276		echo "Building wasm code"; \
277		$(MAKE) satellite-wasm; \
278	fi
279
280	chmod 755 release/${TAG}/$(COMPONENT)_${GOOS}_${GOARCH}${FILEEXT}
281	[ "${FILEEXT}" = ".exe" ] && storj-sign release/${TAG}/$(COMPONENT)_${GOOS}_${GOARCH}${FILEEXT} || echo "Skipping signing"
282	rm -f release/${TAG}/${COMPONENT}_${GOOS}_${GOARCH}.zip
283
284.PHONY: binary-check
285binary-check:
286	@if [ -f release/${TAG}/${COMPONENT}_${GOOS}_${GOARCH} ] || [ -f release/${TAG}/${COMPONENT}_${GOOS}_${GOARCH}.exe ]; \
287	then \
288		echo "release/${TAG}/${COMPONENT}_${GOOS}_${GOARCH} exists"; \
289	else \
290		echo "Making ${COMPONENT}"; \
291		$(MAKE) binary; \
292	fi
293
294.PHONY: certificates_%
295certificates_%:
296	$(MAKE) binary-check COMPONENT=certificates GOARCH=$(word 3, $(subst _, ,$@)) GOOS=$(word 2, $(subst _, ,$@))
297.PHONY: identity_%
298identity_%:
299	$(MAKE) binary-check COMPONENT=identity GOARCH=$(word 3, $(subst _, ,$@)) GOOS=$(word 2, $(subst _, ,$@))
300.PHONY: inspector_%
301inspector_%:
302	$(MAKE) binary-check COMPONENT=inspector GOARCH=$(word 3, $(subst _, ,$@)) GOOS=$(word 2, $(subst _, ,$@))
303.PHONY: satellite_%
304satellite_%: satellite-admin-ui
305	$(MAKE) binary-check COMPONENT=satellite GOARCH=$(word 3, $(subst _, ,$@)) GOOS=$(word 2, $(subst _, ,$@))
306.PHONY: storagenode_%
307storagenode_%: storagenode-console
308	$(MAKE) binary-check COMPONENT=storagenode GOARCH=$(word 3, $(subst _, ,$@)) GOOS=$(word 2, $(subst _, ,$@))
309.PHONY: storagenode-updater_%
310storagenode-updater_%:
311	EXTRA_ARGS="-tags=service" $(MAKE) binary-check COMPONENT=storagenode-updater GOARCH=$(word 3, $(subst _, ,$@)) GOOS=$(word 2, $(subst _, ,$@))
312.PHONY: uplink_%
313uplink_%:
314	$(MAKE) binary-check COMPONENT=uplink GOARCH=$(word 3, $(subst _, ,$@)) GOOS=$(word 2, $(subst _, ,$@))
315.PHONY: versioncontrol_%
316versioncontrol_%:
317	$(MAKE) binary-check COMPONENT=versioncontrol GOARCH=$(word 3, $(subst _, ,$@)) GOOS=$(word 2, $(subst _, ,$@))
318.PHONY: multinode_%
319multinode_%: multinode-console
320	$(MAKE) binary-check COMPONENT=multinode GOARCH=$(word 3, $(subst _, ,$@)) GOOS=$(word 2, $(subst _, ,$@))
321.PHONY: uplinkng_%
322uplinkng_%:
323	$(MAKE) binary-check COMPONENT=uplinkng GOARCH=$(word 3, $(subst _, ,$@)) GOOS=$(word 2, $(subst _, ,$@))
324
325
326COMPONENTLIST := certificates identity inspector satellite storagenode storagenode-updater uplink versioncontrol multinode uplinkng
327OSARCHLIST    := linux_amd64 linux_arm linux_arm64 windows_amd64 freebsd_amd64
328BINARIES      := $(foreach C,$(COMPONENTLIST),$(foreach O,$(OSARCHLIST),$C_$O))
329.PHONY: binaries
330binaries: ${BINARIES} ## Build certificates, identity, inspector, satellite, storagenode, uplink, versioncontrol and multinode binaries (jenkins)
331
332.PHONY: sign-windows-installer
333sign-windows-installer:
334	storj-sign release/${TAG}/storagenode_windows_amd64.msi
335
336##@ Deploy
337
338.PHONY: push-images
339push-images: ## Push Docker images to Docker Hub (jenkins)
340	# images have to be pushed before a manifest can be created
341	# satellite
342	for c in satellite storagenode uplink versioncontrol ; do \
343		docker push storjlabs/$$c:${TAG}${CUSTOMTAG}-amd64 \
344		&& docker push storjlabs/$$c:${TAG}${CUSTOMTAG}-arm32v6 \
345		&& docker push storjlabs/$$c:${TAG}${CUSTOMTAG}-arm64v8 \
346		&& for t in ${TAG}${CUSTOMTAG} ${LATEST_TAG}; do \
347			docker manifest create storjlabs/$$c:$$t \
348			storjlabs/$$c:${TAG}${CUSTOMTAG}-amd64 \
349			storjlabs/$$c:${TAG}${CUSTOMTAG}-arm32v6 \
350			storjlabs/$$c:${TAG}${CUSTOMTAG}-arm64v8 \
351			&& docker manifest annotate storjlabs/$$c:$$t storjlabs/$$c:${TAG}${CUSTOMTAG}-amd64 --os linux --arch amd64 \
352			&& docker manifest annotate storjlabs/$$c:$$t storjlabs/$$c:${TAG}${CUSTOMTAG}-arm32v6 --os linux --arch arm --variant v6 \
353			&& docker manifest annotate storjlabs/$$c:$$t storjlabs/$$c:${TAG}${CUSTOMTAG}-arm64v8 --os linux --arch arm64 --variant v8 \
354			&& docker manifest push --purge storjlabs/$$c:$$t \
355		; done \
356	; done
357
358.PHONY: binaries-upload
359binaries-upload: ## Upload binaries to Google Storage (jenkins)
360	cd "release/${TAG}"; for f in *; do \
361		zipname=$$(echo $${f} | sed 's/.exe//g') \
362		&& filename=$$(echo $${f} | sed 's/_.*\.exe/.exe/g' | sed 's/_.*\.msi/.msi/g' | sed 's/_.*//g') \
363		&& if [ "$${f}" != "$${filename}" ]; then \
364			ln $${f} $${filename} \
365			&& zip -r "$${zipname}.zip" "$${filename}" \
366			&& rm $${filename} \
367		; else \
368			zip -r "$${zipname}.zip" "$${filename}" \
369		; fi \
370	; done
371	cd "release/${TAG}"; gsutil -m cp -r *.zip "gs://storj-v3-alpha-builds/${TAG}/"
372
373##@ Clean
374
375.PHONY: clean
376clean: binaries-clean clean-images ## Clean docker test environment, local release binaries, and local Docker images
377
378.PHONY: binaries-clean
379binaries-clean: ## Remove all local release binaries (jenkins)
380	rm -rf release
381
382.PHONY: clean-images
383clean-images:
384	-docker rmi storjlabs/satellite:${TAG}${CUSTOMTAG}
385	-docker rmi storjlabs/storagenode:${TAG}${CUSTOMTAG}
386	-docker rmi storjlabs/uplink:${TAG}${CUSTOMTAG}
387	-docker rmi storjlabs/versioncontrol:${TAG}${CUSTOMTAG}
388
389##@ Tooling
390
391.PHONY: diagrams
392diagrams:
393	archview -root "storj.io/storj/satellite.Core"     -skip-class "Peer,Master Database" -trim-prefix storj.io/storj/satellite/ ./satellite/... | dot -T svg -o satellite-core.svg
394	archview -root "storj.io/storj/satellite.API"      -skip-class "Peer,Master Database" -trim-prefix storj.io/storj/satellite/ ./satellite/... | dot -T svg -o satellite-api.svg
395	archview -root "storj.io/storj/satellite.Repairer" -skip-class "Peer,Master Database" -trim-prefix storj.io/storj/satellite/ ./satellite/... | dot -T svg -o satellite-repair.svg
396	archview -skip-class "Peer,Master Database" -trim-prefix storj.io/storj/satellite/   ./satellite/...   | dot -T svg -o satellite.svg
397	archview -skip-class "Peer,Master Database" -trim-prefix storj.io/storj/storagenode/ ./storagenode/... | dot -T svg -o storage-node.svg
398
399.PHONY: diagrams-graphml
400diagrams-graphml:
401	archview -root "storj.io/storj/satellite.Core"     -skip-class "Peer,Master Database" -trim-prefix storj.io/storj/satellite/ -out satellite-core.graphml   ./satellite/...
402	archview -root "storj.io/storj/satellite.API"      -skip-class "Peer,Master Database" -trim-prefix storj.io/storj/satellite/ -out satellite-api.graphml    ./satellite/...
403	archview -root "storj.io/storj/satellite.Repairer" -skip-class "Peer,Master Database" -trim-prefix storj.io/storj/satellite/ -out satellite-repair.graphml ./satellite/...
404	archview -skip-class "Peer,Master Database" -trim-prefix storj.io/storj/satellite/   -out satellite.graphml    ./satellite/...
405	archview -skip-class "Peer,Master Database" -trim-prefix storj.io/storj/storagenode/ -out storage-node.graphml ./storagenode/...
406
407.PHONY: bump-dependencies
408bump-dependencies:
409	go get storj.io/common@main storj.io/private@main storj.io/uplink@main
410	go mod tidy
411	cd testsuite;\
412		go get storj.io/common@main storj.io/storj@main storj.io/uplink@main;\
413		go mod tidy;
414
415update-proto-lock:
416	protolock commit --ignore "satellite/internalpb,storagenode/internalpb"
417