kube-router/Makefile
2017-07-11 17:18:44 -05:00

146 lines
5.4 KiB
Makefile

NAME?=kube-router
DEV_SUFFIX?=-git
LOCAL_PACKAGES?=app app/controllers app/options app/watchers
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: $(shell find . -name \*.go) ## Builds 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)
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)
$(DOCKER) rmi $(REGISTRY)
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:
$(DOCKER) run -v $(PWD):/pwd golang:alpine \
sh -c ' \
apk add -U git && \
CGO_ENABLED=0 go get github.com/osrg/gobgp/gobgp && \
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%-15s\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
.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
.DEFAULT: all