You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
5.4 KiB
Makefile
167 lines
5.4 KiB
Makefile
.PHONY: clean deploy deps gcloud-auth image imagepush lint run stagedeploy test testci testcover
|
|
|
|
# The version that will be used in docker tags (e.g. to push a
|
|
# go-httpbin:latest image use `make imagepush VERSION=latest)`
|
|
VERSION ?= $(shell git rev-parse --short HEAD)
|
|
|
|
# Override these values to deploy to a different Cloud Run project
|
|
GCLOUD_PROJECT ?= httpbingo
|
|
GCLOUD_ACCOUNT ?= mccutchen@gmail.com
|
|
GCLOUD_REGION ?= us-central1
|
|
|
|
# The version tag for the Cloud Run deployment (override this to adjust
|
|
# pre-production URLs)
|
|
GCLOUD_TAG ?= "v-$(VERSION)"
|
|
|
|
# Run gcloud in a container to avoid needing to install the SDK locally
|
|
GCLOUD_COMMAND ?= ./bin/gcloud
|
|
|
|
# We push docker images to both docker hub and gcr.io
|
|
DOCKER_TAG_DOCKERHUB ?= mccutchen/go-httpbin:$(VERSION)
|
|
DOCKER_TAG_GCLOUD ?= gcr.io/$(GCLOUD_PROJECT)/go-httpbin:$(VERSION)
|
|
|
|
# Built binaries will be placed here
|
|
DIST_PATH ?= dist
|
|
|
|
# Default flags used by the test, testci, testcover targets
|
|
COVERAGE_PATH ?= coverage.txt
|
|
COVERAGE_ARGS ?= -covermode=atomic -coverprofile=$(COVERAGE_PATH)
|
|
TEST_ARGS ?= -race
|
|
|
|
# Tool dependencies
|
|
TOOL_BIN_DIR ?= $(shell go env GOPATH)/bin
|
|
TOOL_GOBINDATA := $(TOOL_BIN_DIR)/go-bindata
|
|
TOOL_GOLINT := $(TOOL_BIN_DIR)/golint
|
|
TOOL_STATICCHECK := $(TOOL_BIN_DIR)/staticcheck
|
|
|
|
GO_SOURCES = $(wildcard **/*.go)
|
|
|
|
GENERATED_ASSETS_PATH := httpbin/assets/assets.go
|
|
|
|
# =============================================================================
|
|
# build
|
|
# =============================================================================
|
|
build: $(DIST_PATH)/go-httpbin
|
|
|
|
$(DIST_PATH)/go-httpbin: assets $(GO_SOURCES)
|
|
mkdir -p $(DIST_PATH)
|
|
CGO_ENABLED=0 go build -ldflags="-s -w" -o $(DIST_PATH)/go-httpbin ./cmd/go-httpbin
|
|
|
|
assets: $(GENERATED_ASSETS_PATH)
|
|
|
|
buildtests:
|
|
CGO_ENABLED=0 go test -ldflags="-s -w" -v -c -o $(DIST_PATH)/go-httpbin.test ./httpbin
|
|
|
|
clean:
|
|
rm -rf $(DIST_PATH) $(COVERAGE_PATH)
|
|
|
|
$(GENERATED_ASSETS_PATH): $(TOOL_GOBINDATA) static/*
|
|
$(TOOL_GOBINDATA) -o $(GENERATED_ASSETS_PATH) -pkg=assets -prefix=static -modtime=1601471052 static
|
|
# reformat generated code
|
|
gofmt -s -w $(GENERATED_ASSETS_PATH)
|
|
# dumb hack to make generate code lint correctly
|
|
sed -i.bak 's/Html/HTML/g' $(GENERATED_ASSETS_PATH)
|
|
sed -i.bak 's/Xml/XML/g' $(GENERATED_ASSETS_PATH)
|
|
rm $(GENERATED_ASSETS_PATH).bak
|
|
|
|
|
|
# =============================================================================
|
|
# test & lint
|
|
# =============================================================================
|
|
test:
|
|
go test $(TEST_ARGS) ./...
|
|
|
|
|
|
# Test command to run for continuous integration, which includes code coverage
|
|
# based on codecov.io's documentation:
|
|
# https://github.com/codecov/example-go/blob/b85638743b972bd0bd2af63421fe513c6f968930/README.md
|
|
testci: build
|
|
go test $(TEST_ARGS) $(COVERAGE_ARGS) ./...
|
|
git diff --exit-code
|
|
|
|
testcover: testci
|
|
go tool cover -html=$(COVERAGE_PATH)
|
|
|
|
lint: $(TOOL_GOLINT) $(TOOL_STATICCHECK)
|
|
test -z "$$(gofmt -d -s -e .)" || (echo "Error: gofmt failed"; gofmt -d -s -e . ; exit 1)
|
|
go vet ./...
|
|
$(TOOL_GOLINT) -set_exit_status ./...
|
|
$(TOOL_STATICCHECK) ./...
|
|
|
|
|
|
# =============================================================================
|
|
# run locally
|
|
# =============================================================================
|
|
run: build
|
|
$(DIST_PATH)/go-httpbin
|
|
|
|
watch: $(TOOL_REFLEX)
|
|
reflex -s -r '\.(go|html)$$' make run
|
|
|
|
|
|
# =============================================================================
|
|
# deploy to fly.io
|
|
# =============================================================================
|
|
deploy:
|
|
flyctl deploy --strategy=rolling
|
|
|
|
|
|
# =============================================================================
|
|
# deploy to google cloud run
|
|
# =============================================================================
|
|
deploy-cloud-run: gcloud-auth imagepush
|
|
$(GCLOUD_COMMAND) beta run deploy \
|
|
$(GCLOUD_PROJECT) \
|
|
--image=$(DOCKER_TAG_GCLOUD) \
|
|
--revision-suffix=$(VERSION) \
|
|
--tag=$(GCLOUD_TAG) \
|
|
--project=$(GCLOUD_PROJECT) \
|
|
--region=$(GCLOUD_REGION) \
|
|
--allow-unauthenticated \
|
|
--platform=managed
|
|
$(GCLOUD_COMMAND) run services update-traffic --to-latest
|
|
|
|
stagedeploy-cloud-run: gcloud-auth imagepush
|
|
$(GCLOUD_COMMAND) beta run deploy \
|
|
$(GCLOUD_PROJECT) \
|
|
--image=$(DOCKER_TAG_GCLOUD) \
|
|
--revision-suffix=$(VERSION) \
|
|
--tag=$(GCLOUD_TAG) \
|
|
--project=$(GCLOUD_PROJECT) \
|
|
--region=$(GCLOUD_REGION) \
|
|
--allow-unauthenticated \
|
|
--platform=managed \
|
|
--no-traffic
|
|
|
|
gcloud-auth:
|
|
@$(GCLOUD_COMMAND) auth list | grep '^\*' | grep -q $(GCLOUD_ACCOUNT) || $(GCLOUD_COMMAND) auth login $(GCLOUD_ACCOUNT)
|
|
@$(GCLOUD_COMMAND) auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://gcr.io
|
|
|
|
|
|
# =============================================================================
|
|
# docker images
|
|
# =============================================================================
|
|
image:
|
|
docker build -t $(DOCKER_TAG_DOCKERHUB) .
|
|
|
|
imagepush: image
|
|
docker push $(DOCKER_TAG_DOCKERHUB)
|
|
|
|
|
|
# =============================================================================
|
|
# dependencies
|
|
#
|
|
# Deps are installed outside of working dir to avoid polluting go modules
|
|
# =============================================================================
|
|
$(TOOL_GOBINDATA):
|
|
cd /tmp && go get -u github.com/kevinburke/go-bindata/...
|
|
|
|
$(TOOL_GOLINT):
|
|
cd /tmp && go get -u golang.org/x/lint/golint
|
|
|
|
$(TOOL_REFLEX):
|
|
cd /tmp && go get -u github.com/cespare/reflex
|
|
|
|
$(TOOL_STATICCHECK):
|
|
cd /tmp && go get -u honnef.co/go/tools/cmd/staticcheck
|