-
Notifications
You must be signed in to change notification settings - Fork 7
/
Makefile
143 lines (110 loc) · 5.32 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
DEPS := "wget git go docker golint"
BINARY := ebs-optimizer
COVER_PROFILE := /tmp/coverage.out
BUCKET_NAME ?= ebs-optimizer
FLAVOR ?= custom
LOCAL_PATH := build/s3/$(FLAVOR)
LICENSE_FILES := LICENSE THIRDPARTY
GOOS ?= linux
GOARCH ?= amd64
# the default is used for pushing to the AWS Marketplace ECR. Set this as an
# environment variable to push to your own ECR repository instead.
AWS_REGION ?= us-east-1
DOCKER_IMAGE ?= 709825985650.dkr.ecr.us-east-1.amazonaws.com/cloudutil/ebs-optimizer
DOCKER_IMAGE_VERSION ?= 1.0
SHA := $(shell git rev-parse HEAD | cut -c 1-7)
BUILD := $(DOCKER_IMAGE_VERSION)-$(FLAVOR)-$(SHA)
EXPIRATION := $(shell go run ./scripts/expiration_date.go)
ifneq ($(FLAVOR), custom)
LICENSE_FILES += BINARY_LICENSE
endif
LDFLAGS="-X main.Version=-$(BUILD) -X main.ExpirationDate=$(EXPIRATION) -s -w"
all: fmt-check vet-check build test ## Build the code
.PHONY: all
clean: ## Remove installed packages/temporary files
go clean ./...
rm -rf $(BINDATA_DIR) $(LOCAL_PATH)
.PHONY: clean
check_deps: ## Verify the system has all dependencies installed
@for DEP in "$(DEPS)"; do \
if ! command -v "$$DEP" >/dev/null ; then echo "Error: dependency '$$DEP' is absent" ; exit 1; fi; \
done
@echo "all dependencies satisifed: $(DEPS)"
.PHONY: check_deps
build_deps: ## Install all dependencies specified in tools.go
@grep _ tools.go | cut -d '"' -f 2 | xargs go install
.PHONY: build_deps
update_deps: ## Update all dependencies
@go get -u
@go mod tidy
.PHONY: update_deps
build: ## Build the ebs-optimizer binary
GOOS=$(GOOS) GOARCH=$(GOARCH) go build -ldflags=$(LDFLAGS) -o $(BINARY)
.PHONY: build
artifacts: ## Create archive to be uploaded
@rm -rf $(LOCAL_PATH)
@mkdir -p $(LOCAL_PATH)
@cp -f cloudformation/stacks/ebs-optimizer/template.yaml $(LOCAL_PATH)/template_build_$(BUILD).yaml
@cp -f cloudformation/stacks/ebs-optimizer/regional_template.yaml $(LOCAL_PATH)/
@sed -e "s#1.0.1#$(DOCKER_IMAGE_VERSION)#" $(LOCAL_PATH)/template_build_$(BUILD).yaml > $(LOCAL_PATH)/template_build_$(BUILD).yaml.new
@mv -- $(LOCAL_PATH)/template_build_$(BUILD).yaml.new $(LOCAL_PATH)/template_build_$(BUILD).yaml
@cp -f $(LOCAL_PATH)/template_build_$(BUILD).yaml $(LOCAL_PATH)/template.yaml
.PHONY: artifacts
docker: ## Build a Docker image, currently only supports x86 hosts
docker build -t $(DOCKER_IMAGE):$(DOCKER_IMAGE_VERSION) .
.PHONY: docker
docker-login:
aws ecr get-login-password --region $(AWS_REGION) | docker login --username AWS --password-stdin $(DOCKER_IMAGE)
docker-push: docker
docker push $(DOCKER_IMAGE):$(DOCKER_IMAGE_VERSION)
.PHONY: docker-push
docker-push-artifacts: docker-push artifacts
.PHONY: docker-push-artifacts
docker-marketplace:
docker build -f Dockerfile.marketplace -t $(DOCKER_IMAGE):$(DOCKER_IMAGE_VERSION) .
.PHONY: docker-marketplace
docker-marketplace-push: docker-marketplace
docker push $(DOCKER_IMAGE):$(DOCKER_IMAGE_VERSION)
.PHONY: docker-marketplace-push
docker-marketplace-push-artifacts: docker-marketplace-push artifacts
.PHONY: docker-marketplace-push-artifacts
upload: artifacts ## Upload binary
aws s3 sync build/s3/ s3://$(BUCKET_NAME)/
.PHONY: upload
vet-check: ## Verify vet compliance
@go vet -all ./...
.PHONY: vet-check
fmt-check: ## Verify fmt compliance
@sh -c 'test -z "$$(gofmt -l -s -d . | tee /dev/stderr)"'
.PHONY: fmt-check
module-check: build_deps ## Verify that all changes to go.mod and go.sum are checked in, and fail otherwise
@go mod tidy -v
git diff --exit-code HEAD -- go.mod go.sum
.PHONY: module-check
test: ## Test go code and coverage
@go test -covermode=count -coverprofile=$(COVER_PROFILE) ./...
.PHONY: test
lint: build_deps
@golint -set_exit_status ./...
.PHONY: lint
full-test: fmt-check vet-check test lint ## Pass test / fmt / vet / lint
.PHONY: full-test
html-cover: test ## Display coverage in HTML
@go tool cover -html=$(COVER_PROFILE)
.PHONY: html-cover
ci-cover: html-cover ## Test & generate coverage in the TravisCI format, fails unless executed from TravisCI
ifdef COVERALLS_TOKEN
@goveralls -coverprofile=$(COVER_PROFILE) -service=travis-ci -repotoken=$(COVERALLS_TOKEN)
endif
.PHONY: ci-cover
ci-checks: fmt-check vet-check module-check lint ## Pass fmt / vet & lint format
.PHONY: ci-checks
ci: build artifacts ci-checks ci-cover ## Executes inside the CI Docker builder
.PHONY: ci
ci-docker: ## Executed by CI
@docker-compose up --build --abort-on-container-exit --exit-code-from ebs-optimizer
.PHONY: ci-docker
help: ## Show this help
@printf "Rules:\n"
@fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//'
.PHONY: help