local_docker_repo := cb/secretshop
# Git-related information, for injecting into the build.
author_email = $(shell git --no-pager log -1 --pretty=format:'%ae')
author_name = $(shell git --no-pager log -1 --pretty=format:'%an')
git_sha = $(shell git rev-parse --short HEAD)
dev_docker_repo := 454314487337.dkr.ecr.us-west-2.amazonaws.com/secretshop
prod_docker_repo := 774733389815.dkr.ecr.us-west-2.amazonaws.com/secretshop
app_port := 8080
debug_port := 6000

# Running install assumes you have the following dependencies on your machine:
# 1. homebrew
# 2. node >= 10.3.0
# 3. npm
install:
	brew install protobuf
	brew tap alecthomas/homebrew-tap
	brew install golangci/tap/golangci-lint
	brew install clang-format
	npm i -g aws-cdk
.PHONY: install

# This will clone and setup any required go dependencies. Requires go version >= 1.11.0.
setup:
	go get -u github.com/golang/protobuf/protoc-gen-go/...
	go install github.com/golang/protobuf/protoc-gen-go
	go get -u github.com/twitchtv/twirp/protoc-gen-twirp/...
	go get -u github.com/gogo/protobuf/protoc-gen-gogofaster
	go get -u github.com/gogo/protobuf/gogoproto
	GO111MODULE=on go get github.com/golang/mock/mockgen@latest
.PHONY: setup

build:
	@ CGO_ENABLED=0 go build -o build/secretshop cmd/secretshop/*.go
.PHONY: build

test:
	go test -cover -race -v ./...
.PHONY: test

mocks:
	mockgen -destination ./internal/mocks/dynamodb/dynamodb.go code.justin.tv/cb/secretshop/internal/clients/dynamodb Datastore
	mockgen -destination ./internal/mocks/ripley/ripley.go code.justin.tv/cb/secretshop/internal/clients/ripley Payouts
.PHONY: mocks

lint:
	golangci-lint run
.PHONY: lint

proto-lint:
	clang-format -style="{BasedOnStyle: Google, IndentWidth: 4}" -verbose -i rpc/secretshop/*.proto
.PHONY: proto-lint

proto:
	protoc -I=. -I=$(shell go env GOPATH)/src -I=$(shell go env GOPATH)/src/github.com/gogo/protobuf --gogofaster_out=. --twirp_out=. ./rpc/secretshop/service.proto
.PHONY: proto

jenkins-build:
	@ docker build \
	--build-arg go_version=1.13.6 \
	--target build \
	-t $(local_docker_repo):build-$(git_sha) \
	.
.PHONY: jenkins-build

jenkins-setup:
	@wget -O - -q https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.23.1
.PHONY: jenkins-setup

jenkins: jenkins-build
	@ docker run $(local_docker_repo):build-$(git_sha) make jenkins-check
.PHONY: jenkins

jenkins-check: jenkins-setup lint test
.PHONY: jenkins-check

# Create a distribution container.
dist:
	@ docker build \
	--build-arg go_version=1.13.6 \
	--build-arg app_port=$(app_port) \
	--build-arg debug_port=$(debug_port) \
	--label tv.twitch.author-email="$(author_email)" \
	--label tv.twitch.author-name="$(author_name)" \
	--label tv.twitch.build-date="$(now)" \
	--label tv.twitch.go-version=1.13.6 \
	--label tv.twitch.vcs-ref="$(git_sha)" \
	--label tv.twitch.vcs-url="https://git-aws.internal.justin.tv/cb/secretshop/commit/$(git_sha)" \
	--tag $(local_docker_repo):$(git_sha) \
	--tag $(local_docker_repo):latest \
	.
.PHONY: dist

# Login to ECR
# REQUIRES AN AWS SESSION
ecr-login:
	@$(shell aws ecr get-login --region us-west-2 --no-include-email)
.PHONY: ecr-login

# Dockerize, tag, and publish to the dev docker repo (ECR)
# REQUIRES AN AWS SESSION.
publish-docker-dev: dist ecr-login
	docker tag $(local_docker_repo):$(git_sha) $(dev_docker_repo):$(git_sha)
	docker push $(dev_docker_repo):$(git_sha)
.PHONY: publish-docker-dev

# Dockerize, tag, and publish to the prod docker repo (ECR)
# REQUIRES AN AWS SESSION.
publish-docker-prod: dist ecr-login
	docker tag $(local_docker_repo):$(git_sha) $(prod_docker_repo):$(git_sha)
	docker push $(prod_docker_repo)
.PHONY: publish-docker-prod

# Deploy a specific tagged & pushed docker image to the development environment
# REQUIRES AN AWS SESSION
deploy-docker-dev:
	./deploy/ecs-deploy.sh \
		--verbose \
		--timeout 8m \
		--cluster SecretShop \
		--service-name SecretShop \
		--image $(dev_docker_repo):$(DOCKER_TAG)
.PHONY: deploy-docker-dev

# Deploy a specific tagged & pushed docker image to the production environment
# REQUIRES AN AWS SESSION
deploy-docker-prod:
	./deploy/ecs-deploy.sh \
		--verbose \
		--timeout 8m \
		--cluster SecretShop \
		--service-name SecretShop \
		--image $(prod_docker_repo):$(DOCKER_TAG)
.PHONY: deploy-docker-prod

# Deploy the current built docker image to the production canary environment
# REQUIRES AN AWS SESSION
deploy-current-docker-canary:
	./deploy/ecs-deploy.sh \
		--verbose \
		--timeout 8m \
		--cluster SecretShop-canary \
		--service-name SecretShop-canary \
		--image $(prod_docker_repo):$(git_sha)
.PHONY: deploy-current-docker-canary

# Deploy a specific tagged & pushed docker image to the production canary environment
# REQUIRES AN AWS SESSION
deploy-docker-canary:
	./deploy/ecs-deploy.sh \
		--verbose \
		--timeout 8m \
		--cluster SecretShop-canary \
		--service-name SecretShop-canary \
		--image $(prod_docker_repo):$(DOCKER_TAG)
.PHONY: deploy-docker-canary

run:
	ENVIRONMENT="development" \
	go run cmd/secretshop/main.go
.PHONY: run
