-
Notifications
You must be signed in to change notification settings - Fork 73
/
Makefile
171 lines (137 loc) · 5.58 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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
GOLANGCI_VERSION=v1.61.0
COVERAGE=coverage.out
GIT_SHA?=$(shell git rev-parse HEAD)
ATLAS_SOURCE_FILES?=./cmd/atlas
ifeq ($(OS),Windows_NT)
ATLAS_VERSION?=$(shell powershell -Command "(git describe --match 'atlascli/v*') -replace '.*v(.*)', '$$1'")
ATLAS_BINARY_NAME=atlas.exe
else
ATLAS_VERSION?=$(shell git describe --match "atlascli/v*" | cut -d "v" -f 2)
ATLAS_BINARY_NAME=atlas
endif
ATLAS_DESTINATION=./bin/$(ATLAS_BINARY_NAME)
ATLAS_INSTALL_PATH="${GOPATH}/bin/$(ATLAS_BINARY_NAME)"
LOCALDEV_IMAGE?=docker.io/mongodb/mongodb-atlas-local
LINKER_FLAGS=-s -w -X github.com/mongodb/mongodb-atlas-cli/atlascli/internal/version.GitCommit=${GIT_SHA} -X github.com/mongodb/mongodb-atlas-cli/atlascli/internal/version.Version=${ATLAS_VERSION} -X github.com/mongodb/mongodb-atlas-cli/atlascli/internal/cli/deployments/options.LocalDevImage=${LOCALDEV_IMAGE}
ATLAS_E2E_BINARY?=../../../bin/${ATLAS_BINARY_NAME}
DEBUG_FLAGS=all=-N -l
TEST_CMD?=go test
UNIT_TAGS?=unit
E2E_TAGS?=e2e
E2E_TIMEOUT?=60m
E2E_PARALLEL?=1
E2E_EXTRA_ARGS?=
ifeq ($(OS),Windows_NT)
export PATH := .\bin;$(shell go env GOPATH)\bin;$(PATH)
else
export PATH := ./bin:$(shell go env GOPATH)/bin:$(PATH)
endif
export TERM := linux-m
export GO111MODULE := on
export GOTOOLCHAIN := local
export ATLAS_E2E_BINARY
.PHONY: pre-commit
pre-commit: ## Run pre-commit hook
@echo "==> Running pre-commit hook..."
@scripts/pre-commit.sh
.PHONY: deps
deps: ## Download go module dependencies
@echo "==> Installing go.mod dependencies..."
go mod download
go mod tidy
.PHONY: devtools
devtools: ## Install dev tools
@echo "==> Installing dev tools..."
go install github.com/google/addlicense@latest
go install github.com/golang/mock/mockgen@latest
go install golang.org/x/tools/cmd/goimports@latest
go install github.com/google/go-licenses@latest
go install mvdan.cc/sh/v3/cmd/shfmt@latest
go install github.com/icholy/gomajor@latest
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin $(GOLANGCI_VERSION)
.PHONY: setup
setup: deps devtools link-git-hooks ## Set up dev env
.PHONY: link-git-hooks
link-git-hooks: ## Install git hooks
@echo "==> Installing all git hooks..."
find .git/hooks -type l -exec rm {} \;
find .githooks -type f -exec ln -sf ../../{} .git/hooks/ \;
.PHONY: fmt
fmt: ## Format changed go
@scripts/fmt.sh
.PHONY: fmt-all
fmt-all: ### Format all go files with goimports and gofmt
find . -name "*.go" -not -path "./vendor/*" -not -path "./internal/mocks" -exec gofmt -w "{}" \;
find . -name "*.go" -not -path "./vendor/*" -not -path "./internal/mocks" -exec goimports -l -w "{}" \;
.PHONY: test
test: unit-test fuzz-normalizer-test
.PHONY: lint
lint: ## Run linter
golangci-lint run
.PHONY: fix-lint
fix-lint: ## Fix linting errors
golangci-lint run --fix
.PHONY: check
check: test fix-lint ## Run tests and linters
.PHONY: check-templates
check-templates:
go run ./tools/templates-checker
.PHONY: addcopy
addcopy:
@scripts/add-copy.sh
.PHONY: generate
generate: gen-docs gen-mocks gen-code ## Generate docs, mocks, code, all auto generated assets
.PHONY: gen-code
gen-code: ## Generate code
@echo "==> Generating code"
go run ./tools/cli-generator
.PHONY: gen-mocks
gen-mocks: ## Generate mocks
@echo "==> Generating mocks"
rm -rf ./internal/mocks
go generate ./internal...
.PHONY: gen-docs
gen-docs: ## Generate docs for atlascli commands
@echo "==> Generating docs"
go run -ldflags "$(LINKER_FLAGS)" ./tools/docs/main.go
.PHONY: build
build: ## Generate an atlas binary in ./bin
@echo "==> Building $(ATLAS_BINARY_NAME) binary"
go build -ldflags "$(LINKER_FLAGS)" $(BUILD_FLAGS) -o $(ATLAS_DESTINATION) $(ATLAS_SOURCE_FILES)
.PHONY: build-debug
build-debug: ## Generate a binary in ./bin for debugging atlascli
@echo "==> Building $(ATLAS_BINARY_NAME) binary for debugging"
go build -gcflags="$(DEBUG_FLAGS)" -ldflags "$(LINKER_FLAGS)" $(BUILD_FLAGS) -o $(ATLAS_DESTINATION) $(ATLAS_SOURCE_FILES)
.PHONY: e2e-test
e2e-test: build ## Run E2E tests
# the target assumes the MCLI_* environment variables are exported
@echo "==> Running E2E tests..."
$(TEST_CMD) -v -p 1 -parallel $(E2E_PARALLEL) -timeout $(E2E_TIMEOUT) -tags="$(E2E_TAGS)" ./test/e2e... $(E2E_EXTRA_ARGS)
.PHONY: fuzz-normalizer-test
fuzz-normalizer-test: ## Run fuzz test
@echo "==> Running fuzz test..."
$(TEST_CMD) -fuzz=Fuzz -fuzztime 50s --tags="$(UNIT_TAGS)" -race ./internal/kubernetes/operator/resources
.PHONY: unit-test
unit-test: ## Run unit-tests
@echo "==> Running unit tests..."
$(TEST_CMD) --tags="$(UNIT_TAGS)" -race -cover -count=1 -coverprofile $(COVERAGE) ./...
.PHONY: install
install: ## Install a binary in $GOPATH/bin
@echo "==> Installing $(ATLAS_BINARY_NAME) to $(ATLAS_INSTALL_PATH)"
go install -ldflags "$(LINKER_FLAGS)" $(ATLAS_SOURCE_FILES)
@echo "==> Done..."
.PHONY: list
list: ## List all make targets
@${MAKE} -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | sort
.PHONY: check-library-owners
check-library-owners: ## Check that all the dependencies in go.mod has a owner in library_owners.json
@echo "==> Check library_owners.json"
go run ./tools/libraryowners/main.go
.PHONY: update-atlas-sdk
update-atlas-sdk: ## Update the atlas-sdk dependency
./scripts/update-sdk.sh
.PHONY: help
.DEFAULT_GOAL := help
help:
@grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'