-
Notifications
You must be signed in to change notification settings - Fork 24
/
Makefile
143 lines (112 loc) · 4.02 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# Read the .env file and export its variables
ifeq (,$(wildcard ./.env))
$(error .env file not found)
else
include .env
export $(shell sed 's/=.*//' .env)
endif
PROJECT_NAME := $(shell basename "$(PWD)" | tr '[:upper:]' '[:lower:]')
# GIT commit id will be used as version of the application
VERSION ?= $(shell git rev-parse --short HEAD)
LDFLAGS := -ldflags "-X main.version=${VERSION}"
DOCKER_IMAGE_NAME := "$(PROJECT_NAME):$(VERSION)"
DOCKER_CONTAINER_NAME := "$(PROJECT_NAME)-$(VERSION)"
MODULE = $(shell go list -m)
testCoverageCmd := $(shell go tool cover -func=coverage.out | grep total | grep -Eo '[0-9]+\.[0-9]+')
TEST_COVERAGE_THRESHOLD = 50
## start: Starts everything that is required to serve the APIs
start:
docker-compose up -d
make run
## setup: Start the dependencies only
setup:
docker-compose up -d
## run: Run the API server alone (without supplementary services such as DB etc.,)
run:
go run ${LDFLAGS} main.go -version="${VERSION}"
## build: Build the API server binary
build:
CGO_ENABLED=0 go build ${LDFLAGS} -a -o ${PROJECT_NAME} $(MODULE)
## version: Display the current version of the API server
version:
@echo $(VERSION)
## test: Run tests
test:
go test ./... -v -coverprofile coverage.out -covermode count
## coverage: Measures and generate code coverage report
coverage:
@go test ./... -v -coverprofile coverage.out -covermode count
@go tool cover -func=coverage.out | grep total | grep -Eo '[0-9]+\.[0-9]+' | xargs -I {} echo "Total test coverage: {}%"
@go tool cover -html=coverage.out
ci-coverage:
@echo "Current unit test coverage: $(testCoverageCmd)"
@echo "Test Coverage Threshold: $(TEST_COVERAGE_THRESHOLD)"
@echo "-----------------------"
@if [ "$(shell echo "$(testCoverageCmd) < $(TEST_COVERAGE_THRESHOLD)" | bc -l)" -eq 1 ]; then \
echo "Failed, Please add or update tests to improve test code coverage."; \
exit 1; \
else \
echo "OK"; \
fi
## tidy: Tidy go modules
tidy:
go mod tidy
## format: Format go code
format:
go fmt ./...
## lint: Run linter
lint:
golangci-lint run
## lint-fix: Run linter and fix the issues
lint-fix:
golangci-lint run --fix
## clean: Clean all docker resources
clean:
docker-compose down
docker ps --filter name=orders -q | xargs docker stop
docker network ls --filter name=orders -q | xargs docker prune --force
docker volume ls --filter name=orders -q | xargs docker volume rm
## docker-build: Build the API server as a docker image
docker-build:
$(info ---> Building Docker Image: ${DOCKER_IMAGE_NAME}, Exposed Port: ${port})
docker build -t ${DOCKER_IMAGE_NAME} . \
--build-arg port=${port} \
docker-build-debug:
$(info ---> Building Docker Image: ${DOCKER_IMAGE_NAME}, Exposed Port: ${port})
docker build --no-cache --progress plain -t ${DOCKER_IMAGE_NAME} . \
--build-arg port=${port}
## owasp-report: Generate OWASP report
owasp-report:
vacuum html-report -z OpenApi-v1.yaml
## go-work: Generate the go work file
go-work:
go work init .
## docker-run: Run the API server as a docker container
docker-run:
$(info ---> Running Docker Container: ${DOCKER_CONTAINER_NAME} in Environment: ${profile})
docker run --name ${DOCKER_CONTAINER_NAME} -it \
--env environment=${profile} \
$(DOCKER_IMAGE_NAME)
## docker-start: Builds Docker image and runs it.
docker-start: docker-build docker-run
## docker-stop: Stops the docker container
docker-stop:
docker stop $(DOCKER_CONTAINER_NAME)
## docker-remove: Removes the docker images and containers
docker-remove:
docker rm $(DOCKER_CONTAINER_NAME)
docker rmi $(DOCKER_IMAGE_NAME)
## docker-clean: Cleans all docker resources
docker-clean: docker-clean-service-images docker-clean-build-images
## docker-clean-service-images: Stops and Removes the service images
docker-clean-service-images: docker-stop docker-remove
## docker-clean-build-images: Removes build images
docker-clean-build-images:
docker rmi $(docker images --filter label="builder=true")
.PHONY: help
help: Makefile
@echo
@echo " Choose a command to run in "$(PROJECT_NAME)":"
@echo
@sed -n 's/^##//p' $< | column -t -s ':' | sed -e 's/^/ /'
@echo