Makefile 5.67 KB
.PHONY: help docker docker-push realize qa critic vet codegen integration

GO        = go
GOGET     = $(GO) get -u
GOTEST    ?= go test

BASEPKGS = system compose messaging
IMAGES   = corteza-server-system corteza-server-compose corteza-server-messaging corteza-server
TESTABLE = messaging system compose pkg internal

# Run watcher with a different event-trigger delay, eg:
# $> WATCH_DELAY=5s make watch.test.integration
WATCH_DELAY ?= 1s

# Run go test cmd with flags, eg:
# $> TEST_FLAGS="-v" make test.integration
# $> TEST_FLAGS="-v -run SpecialTest" make test.integration
TEST_FLAGS ?=

COVER_MODE    ?= count
COVER_PROFILE ?= .cover.out
COVER_FLAGS   ?= -covermode=$(COVER_MODE)  -coverprofile=$(COVER_PROFILE)

# Cover package maps for tests tasks
COVER_PKGS_messaging   = ./messaging/...
COVER_PKGS_system      = ./system/...
COVER_PKGS_compose     = ./compose/...
COVER_PKGS_pkg         = ./pkg/...
COVER_PKGS_all         = $(COVER_PKGS_pkg),$(COVER_PKGS_messaging),$(COVER_PKGS_system),$(COVER_PKGS_compose)
COVER_PKGS_integration = $(COVER_PKGS_all)

TEST_SUITE_pkg         = ./pkg/...
TEST_SUITE_services    = ./compose/... ./messaging/... ./system/...
TEST_SUITE_unit        = $(TEST_SUITE_pkg) $(TEST_SUITE_services)
TEST_SUITE_integration = ./tests/...
TEST_SUITE_all         = $(TEST_SUITE_unit) $(TEST_SUITE_integration)

DEV_MINIO_PORT ?= 9000


########################################################################################################################
# Tool bins
REALIZE     = ${GOPATH}/bin/realize
GOCRITIC    = ${GOPATH}/bin/gocritic
MOCKGEN     = ${GOPATH}/bin/mockgen
STATICCHECK = ${GOPATH}/bin/staticcheck
PROTOGEN    = ${GOPATH}/bin/protoc-gen-go

# Using nodemon in development environment for "watch.*" tasks
# https://nodemon.io
NODEMON      = /usr/local/bin/nodemon
WATCHER      = $(NODEMON) --delay ${WATCH_DELAY} -e go -w . --exec

help:
	@echo
	@echo Usage: make [target]
	@echo
	@echo - docker-images: builds docker images locally
	@echo - docker-push:   push built images
	@echo
	@echo - vet - run go vet on all code
	@echo - critic - run go critic on all code
	@echo - test.all - run all tests
	@echo - test.unit - run all unit tests
	@echo - test.integration - run all integration tests
	@echo
	@echo See tests/README.md for more info
	@echo


docker-images: $(IMAGES:%=docker-image.%)

docker-image.%: Dockerfile.%
	@ docker build --no-cache --rm -f Dockerfile.$* -t cortezaproject/$*:latest .

docker-push: $(IMAGES:%=docker-push.%)

docker-push.%: Dockerfile.%
	@ docker push cortezaproject/$*:latest


########################################################################################################################
# Development

realize: $(REALIZE)
	$(REALIZE) start

codegen: $(PROTOGEN)
	./codegen.sh

mailhog.up:
	docker run --rm --publish 8025:8025 --publish 1025:1025 mailhog/mailhog

minio.up:
	# Runs temp minio server
	# No volume because we do not want the data to persist
	docker run --rm --publish 9000:$(DEV_MINIO_PORT) --env-file .env minio/minio server /data

watch.test.%: $(NODEMON)
	# Development helper - watches for file
	# changes & reruns  tests
	$(WATCHER) "make test.$* || exit 0"

########################################################################################################################
# Quality Assurance

# Adds -coverprofile flag to test flags
# and executes test.cover... task
test.coverprofile.%:
	@ TEST_FLAGS="$(TEST_FLAGS) -coverprofile=$(COVER_PROFILE)" make test.cover.$*

# Adds -coverpkg flag
test.cover.%:
	@ TEST_FLAGS="$(TEST_FLAGS) -coverpkg=$(COVER_PKGS_$*)" make test.$*

# Runs integration tests
test.integration:
	$(GOTEST) $(TEST_FLAGS) $(TEST_SUITE_integration)

# Runs one suite from integration tests
test.integration.%:
	$(GOTEST) $(TEST_FLAGS) ./tests/$*/...

# Runs ALL tests
test.all:
	$(GOTEST) $(TEST_FLAGS) $(TEST_SUITE_all)

# Unit testing testing messaging, system or compose
test.unit.%:
	$(GOTEST) $(TEST_FLAGS) ./$*/...

# Runs ALL tests
test.unit:
	$(GOTEST) $(TEST_FLAGS) $(TEST_SUITE_unit)

# Testing pkg
test.pkg:
	$(GOTEST) $(TEST_FLAGS) $(TEST_SUITE_pkg)

test: test.unit

# Outputs cross-package imports that should not be there.
test.cross-dep:
	@ grep -rE "github.com/cortezaproject/corteza-server/(compose|messaging)/" system || exit 0
	@ grep -rE "github.com/cortezaproject/corteza-server/(system|messaging)/" compose || exit 0
	@ grep -rE "github.com/cortezaproject/corteza-server/(system|compose)/" messaging || exit 0
	@ grep -rE "github.com/cortezaproject/corteza-server/(system|compose|messaging)/" pkg || exit 0

vet:
	$(GO) vet ./...

critic: $(GOCRITIC)
	$(GOCRITIC) check-project .

staticcheck: $(STATICCHECK)
	$(STATICCHECK) ./pkg/... ./system/... ./messaging/... ./compose/...

qa: vet critic test

mocks: $(MOCKGEN)
	# Cleanup all pre-generated
	rm -rf system/repository/mocks && mkdir -p system/repository/mocks
	rm -rf compose/service/mocks && mkdir -p compose/service/mocks

	$(MOCKGEN) -package repository -source system/repository/user.go         -destination system/repository/mocks/user.go
	$(MOCKGEN) -package repository -source system/repository/credentials.go  -destination system/repository/mocks/credentials.go

	$(MOCKGEN) -package mail  -source pkg/mail/mail.go                           -destination pkg/mail/mail_mock_test.go



########################################################################################################################
# Toolset

$(REALIZE):
	$(GOGET) github.com/tockins/realize

$(GOCRITIC):
	$(GOGET) github.com/go-critic/go-critic/...

$(MOCKGEN):
	$(GOGET) github.com/golang/mock/mockgen

$(STATICCHECK):
	$(GOGET) honnef.co/go/tools/cmd/staticcheck

$(PROTOGEN):
	$(GOGET) github.com/golang/protobuf/protoc-gen-go

$(NODEMON):
	npm install -g nodemon

clean:
	rm -f $(REALIZE) $(GOCRITIC)