forked from cloudnativelabs/kube-router
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
179 lines (150 loc) · 6.79 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
172
173
174
175
176
177
178
179
NAME?=kube-router
DEV_SUFFIX?=-git
LOCAL_PACKAGES?=app app/controllers app/options app/watchers utils
IMG_NAMESPACE?=cloudnativelabs
GIT_COMMIT=$(shell git describe --tags --dirty)
GIT_BRANCH?=$(shell git rev-parse --abbrev-ref HEAD)
IMG_TAG?=$(if $(IMG_TAG_PREFIX),$(IMG_TAG_PREFIX)-)$(GIT_BRANCH)
RELEASE_TAG?=$(shell build/get-git-tag.sh)
REGISTRY?=$(if $(IMG_FQDN),$(IMG_FQDN)/$(IMG_NAMESPACE)/$(NAME),$(IMG_NAMESPACE)/$(NAME))
REGISTRY_DEV?=$(REGISTRY)$(DEV_SUFFIX)
IN_DOCKER_GROUP=$(filter docker,$(shell groups))
IS_ROOT=$(filter 0,$(shell id -u))
DOCKER=$(if $(or $(IN_DOCKER_GROUP),$(IS_ROOT)),docker,sudo docker)
MAKEFILE_DIR=$(dir $(realpath $(firstword $(MAKEFILE_LIST))))
UPSTREAM_IMPORT_PATH=$(GOPATH)/src/github.com/cloudnativelabs/kube-router/
all: test kube-router container ## Default target. Runs tests, builds binaries and images.
kube-router:
@echo Starting kube-router binary build.
CGO_ENABLED=0 go build -o kube-router kube-router.go
@echo Finished kube-router binary build.
test: gofmt ## Runs code quality pipelines (gofmt, tests, coverage, lint, etc)
vagrant-up: export docker=$(DOCKER)
vagrant-up: export DEV_IMG=$(REGISTRY_DEV):$(IMG_TAG)
vagrant-up: all vagrant-destroy
@hack/vagrant-up.sh
vagrant-up-single-node: vagrant-up ## Test the current codebase in a local VM single-node cluster
vagrant-up-multi-node: export HACK_MULTI_NODE=true
vagrant-up-multi-node: vagrant-up ## Test the current codebase in a local VM multi-node cluster
vagrant: ## Run vagrant against a previously up'd cluster. Example: make vagrant status
@hack/vagrant.sh $(VAGRANT_RUN_ARGS)
vagrant-destroy: ## Destroy a previously created local VM cluster
@hack/vagrant-destroy.sh
vagrant-clean: vagrant-destroy ## Destroy a previously created local VM cluster and remove all downloaded/generated assets
@rm -rf hack/_output
vagrant-image-update: export docker=$(DOCKER)
vagrant-image-update: export DEV_IMG=$(REGISTRY_DEV):$(IMG_TAG)
vagrant-image-update: all ## Rebuild kube-router, update image in local VMs, and restart kube-router pods.
@hack/vagrant-image-update.sh
run: kube-router ## Runs "kube-router --help".
./kube-router --help
container: kube-router gobgp ## Builds a Docker container image.
@echo Starting kube-router container image build.
$(DOCKER) build -t "$(REGISTRY_DEV):$(IMG_TAG)" .
@if [ "$(GIT_BRANCH)" = "master" ]; then \
$(DOCKER) tag "$(REGISTRY_DEV):$(IMG_TAG)" "$(REGISTRY_DEV)"; \
fi
@echo Finished kube-router container image build.
docker-login: ## Logs into a docker registry using {DOCKER,QUAY}_{USERNAME,PASSWORD} variables.
@echo Starting docker login target.
@if [ -n "$(DOCKER_USERNAME)" ] && [ -n "$(DOCKER_PASSWORD)" ]; then \
echo Starting DockerHub registry login.; \
$(DOCKER) login -u="$(value DOCKER_USERNAME)" -p="$(value DOCKER_PASSWORD)"; \
echo Finished DockerHub registry login.; \
fi
@if [ -n "$(QUAY_USERNAME)" ] && [ -n "$(QUAY_PASSWORD)" ]; then \
echo Starting quay.io registry login.; \
$(DOCKER) login -u="$(value QUAY_USERNAME)" -p="$(value QUAY_PASSWORD)" quay.io; \
echo Finished quay.io registry login.; \
fi
@echo Finished docker login target.
push: container docker-login ## Pushes a Docker container image to a registry.
@echo Starting kube-router container image push.
$(DOCKER) push "$(REGISTRY_DEV)"
@echo Finished kube-router container image push.
push-release: push
@echo Starting kube-router release container image push.
@test -n "$(RELEASE_TAG)"
$(DOCKER) tag "$(REGISTRY_DEV):$(IMG_TAG)" "$(REGISTRY):$(RELEASE_TAG)"
$(DOCKER) tag "$(REGISTRY):$(RELEASE_TAG)" "$(REGISTRY):latest"
$(DOCKER) push "$(REGISTRY)"
@echo Finished kube-router release container image push.
github-release: kube-router
@echo Starting kube-router GitHub release creation.
@[ -n "$(value GITHUB_TOKEN)" ] && \
GITHUB_TOKEN=$(value GITHUB_TOKEN); \
curl -sL https://git.io/goreleaser | bash
@echo Finished kube-router GitHub release creation.
release: push-release github-release ## Pushes a release to DockerHub and GitHub
@echo Finished kube-router release target.
clean: ## Removes the kube-router binary and Docker images
rm -f kube-router
$(DOCKER) rmi $(REGISTRY_DEV)
gofmt: ## Tells you what files need to be gofmt'd.
@build/verify-gofmt.sh
gofmt-fix: ## Fixes files that need to be gofmt'd.
gofmt -s -w $(LOCAL_PACKAGES)
gopath: ## Warns about issues building from a directory that does not match upstream.
@echo 'Checking project path for import issues...'
@echo '- Project dir: $(MAKEFILE_DIR)'
@echo '- Import dir: $(UPSTREAM_IMPORT_PATH)'
@echo
ifeq ($(MAKEFILE_DIR),$(UPSTREAM_IMPORT_PATH))
@echo 'Looks good!'
else
@echo 'The project directory does not match $(UPSTREAM_IMPORT_PATH)'
@echo
@echo 'This could cause build issues. Consider moving this project'
@echo 'directory to $(UPSTREAM_IMPORT_PATH) and work from there.'
@echo 'This could be done for you by running: "make gopath-fix".'
@echo
endif
# This fixes GOPATH issues for contributers using their own Travis-CI account
# with their forked kube-router repo. It's also useful for contributors testing
# code and CI changes with their own Travis account.
gopath-fix: ## Copies this project directory to the upstream import path.
ifneq ($(wildcard $(UPSTREAM_IMPORT_PATH)/.*),)
@echo
@echo '$(UPSTREAM_IMPORT_PATH) already exists.'
@echo 'Aborting gopath-fix.'
@echo
else
@echo
@echo 'Copying $(MAKEFILE_DIR) to $(UPSTREAM_IMPORT_PATH)'
@echo
mkdir -p "$(UPSTREAM_IMPORT_PATH)"
cp -ar $(MAKEFILE_DIR)/. "$(UPSTREAM_IMPORT_PATH)"
@echo
@echo 'Success! Please use $(UPSTREAM_IMPORT_PATH)'
@echo
endif
gobgp: vendor/github.com/osrg/gobgp/gobgp
$(DOCKER) run -v $(PWD):/pwd golang:alpine \
sh -c ' \
apk add -U git && \
ln -s /pwd/vendor /go/src && \
CGO_ENABLED=0 go get github.com/osrg/gobgp/gobgp && \
gobgp --version && \
cp /go/bin/gobgp /pwd'
# http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
help:
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-22s\033[0m %s\n", $$1, $$2}'
# TODO: Uncomment this target when all deps are version-pinned in glide.yaml
# update-glide:
# # go get -d -u github.com/Masterminds/glide
# glide update --strip-vendor
# # go get -d -u github.com/sgotti/glide-vc
# glide vc --only-code --no-tests
# If the first argument is "vagrant"...
ifeq (vagrant,$(firstword $(MAKECMDGOALS)))
# use the rest as arguments for "vagrant"
VAGRANT_RUN_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
# ...and turn them into do-nothing targets
$(eval $(VAGRANT_RUN_ARGS):;@:)
endif
.PHONY: build clean container run release goreleaser push gofmt gofmt-fix
.PHONY: update-glide test docker-login push-release github-release help
.PHONY: gopath gopath-fix vagrant-up-single-node
.PHONY: vagrant-up-multi-node vagrant-destroy vagrant-clean vagrant
.DEFAULT: all