github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/Makefile (about) 1 APP = lekcije 2 COMMANDS = crawler daily_reporter follow_reminder notifier server teacher_error_resetter 3 GO_TEST ?= gotestsum -- -v -race -p=1 # To avoid database operations conflict 4 GO_TEST_E2E ?= go test -v -p=1 5 DB_HOST = 192.168.99.100 6 LINT_PACKAGES = $(shell go list ./... | grep -v proto_gen) 7 IMAGE_TAG ?= latest 8 PID = $(APP).pid 9 10 11 all: build 12 13 .PHONY: setup 14 setup: install-tools 15 16 .PHONY: install-tools 17 install-tools: 18 @go list -e -f='{{ join .Imports "\n" }}' ./tools.go | tr -d [ | tr -d ] | xargs -I{} go install {} 19 20 .PHONY: install 21 install: 22 go install github.com/oinume/lekcije/backend/cmd/lekcije 23 24 .PHONY: build 25 build: $(foreach command,$(COMMANDS),go/build/$(command)) 26 27 # TODO: find server/cmd -type d | xargs basename 28 # OR CLIENTS=hoge fuga proto: $(foreach var,$(CLIENTS),proto/$(var)) 29 go/build/%: 30 GO111MODULE=on go build -o bin/lekcije_$* ./cmd/$* 31 32 clean: 33 ${RM} $(foreach command,$(COMMANDS),bin/lekcije_$(command)) 34 35 .PHONY: db/goose/% 36 db/goose/%: ## Run goose up|down|status 37 goose -dir ./db/migrations mysql "$(MYSQL_USER):$(MYSQL_PASSWORD)@tcp($(MYSQL_HOST):$(MYSQL_PORT))/$(MYSQL_DATABASE)?charset=utf8mb4&parseTime=true&loc=UTC" $* 38 39 .PHONY: db/reset 40 db/reset: ## Reset databases 41 mysql -h $(MYSQL_HOST) -P $(MYSQL_PORT) -u$(MYSQL_USER) -p$(MYSQL_PASSWORD) -e "DROP DATABASE IF EXISTS $(MYSQL_DATABASE)" 42 mysql -h $(MYSQL_HOST) -P $(MYSQL_PORT) -u$(MYSQL_USER) -p$(MYSQL_PASSWORD) -e "DROP DATABASE IF EXISTS $(MYSQL_DATABASE)_test" 43 mysql -h $(MYSQL_HOST) -P $(MYSQL_PORT) -uroot -proot < db/docker-entrypoint-initdb.d/create_database.sql 44 45 .PHONY: db/connect 46 db/connect: ## Connect to database with envs 47 mysql -h $(MYSQL_HOST) -P $(MYSQL_PORT) -u$(MYSQL_USER) -p$(MYSQL_PASSWORD) $(MYSQL_DATABASE) 48 49 .PHONY: db/generate 50 db/generate: ## Generate Go code into model2 dir with sqlboiler 51 go run ./tools/cmd/sqlboiler/main.go > db/sqlboiler.toml 52 grep 'Code generated by SQLBoiler' -l -r ./model2 | xargs rm -f 53 sqlboiler -c db/sqlboiler.toml mysql 54 55 .PHONY: gqlgen 56 gqlgen: ## Run `gqlgen generate` 57 go run github.com/99designs/gqlgen generate 58 59 .PHONY: mock/generate 60 mock/generate: ## Generate mock files with moq 61 find . -name "*.moq.go" | xargs rm -f 62 go generate ./... 63 64 .PHONY: test 65 test: go/test 66 67 .PHONY: test/db/goose/% 68 test/db/goose/%: ## Run goose up|down|status for test database 69 goose -dir ./db/migrations mysql "$(MYSQL_USER):$(MYSQL_PASSWORD)@tcp($(MYSQL_HOST):$(MYSQL_PORT))/$(MYSQL_DATABASE_TEST)?charset=utf8mb4&parseTime=true&loc=UTC" $* 70 71 .PHONY: go/test 72 go/test: 73 $(GO_TEST) ./... 74 75 .PHONY: go/goimports 76 go/goimports: 77 goimports -w -local github.com/oinume/lekcije ./backend 78 79 .PHONY: go/lint 80 go/lint: ## Run golangci-lint 81 docker run --rm -v ${GOPATH}/pkg/mod:/go/pkg/mod -v $(shell pwd):/app -v $(shell go env GOCACHE):/cache/go -e GOCACHE=/cache/go -e GOLANGCI_LINT_CACHE=/cache/go -w /app golangci/golangci-lint:v1.52.2 golangci-lint run --modules-download-mode=readonly /app/... 82 83 .PHONY: docker/build/server 84 docker/build/server: 85 docker build --pull -f docker/Dockerfile-server \ 86 --tag asia.gcr.io/oinume-lekcije/server:$(IMAGE_TAG) . 87 88 kill: 89 kill `cat $(PID)` 2> /dev/null || true 90 91 restart: kill clean go/build/server 92 bin/$(APP)_server & echo $$! > $(PID) 93 94 watch: restart 95 fswatch -o -e ".*" -e vendor -e node_modules -e .venv -i "\\.go$$" . | xargs -n1 -I{} make restart || make kill 96 97 .PHONY: sync-go-mod-from-root 98 sync-go-mod-from-root: ## Sync go.mod from root directory 99 cp -f ../go.* ./ 100 perl -i -p -e "s!module github.com/oinume/lekcije!module github.com/oinume/lekcije/backend!" go.mod 101 go mod tidy 102 103 .PHONY: help 104 help: ## show this help 105 @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n\nTargets:\n"} /^[\/a-zA-Z_-]+:.*?##/ { printf " \033[36m%-20s\033[0m %s\n", $$1, $$2 }' $(MAKEFILE_LIST)