veylant/Makefile
2026-02-23 13:35:04 +01:00

162 lines
6.2 KiB
Makefile

.PHONY: dev dev-down build test test-cover lint fmt proto migrate-up migrate-down health check docs load-test deploy-blue deploy-green deploy-rollback
# ─────────────────────────────────────────────
# Local development
# ─────────────────────────────────────────────
## dev: Start the full local stack (proxy + PostgreSQL + ClickHouse + Redis + Keycloak + PII)
dev:
docker compose up --build
## dev-down: Stop and remove all containers and volumes
dev-down:
docker compose down -v
## dev-logs: Tail logs from all services
dev-logs:
docker compose logs -f
# ─────────────────────────────────────────────
# Go
# ─────────────────────────────────────────────
## build: Compile the Go proxy binary to bin/proxy
build:
@mkdir -p bin
go build -o bin/proxy ./cmd/proxy/
## test: Run all Go tests with race detector
test:
go test -race ./...
## test-cover: Run tests with HTML coverage report
test-cover:
go test -race -coverprofile=coverage.out ./...
go tool cover -html=coverage.out -o coverage.html
@echo "Coverage report: coverage.html"
## lint: Run golangci-lint (Go) and black --check (Python)
lint:
golangci-lint run
black --check services/pii/
ruff check services/pii/
## fmt: Auto-format Go and Python code
fmt:
gofmt -w .
black services/pii/
# ─────────────────────────────────────────────
# Proto (requires: brew install buf)
# ─────────────────────────────────────────────
## proto: Generate gRPC stubs for Go (gen/) and Python (services/pii/gen/)
proto:
buf generate
## proto-lint: Lint the proto definitions
proto-lint:
buf lint
# ─────────────────────────────────────────────
# Database migrations (requires: brew install golang-migrate)
# ─────────────────────────────────────────────
DB_URL ?= postgres://veylant:veylant_dev@localhost:5432/veylant?sslmode=disable
## migrate-up: Apply all pending migrations
migrate-up:
migrate -path migrations -database "$(DB_URL)" up
## migrate-down: Roll back the last migration
migrate-down:
migrate -path migrations -database "$(DB_URL)" down 1
## migrate-status: Show migration status
migrate-status:
migrate -path migrations -database "$(DB_URL)" version
# ─────────────────────────────────────────────
# Checks & utilities
# ─────────────────────────────────────────────
## docs: Open the API documentation in the browser (proxy must be running)
docs:
@echo "API docs available at http://localhost:8090/docs"
@echo "OpenAPI spec: http://localhost:8090/docs/openapi.yaml"
@open http://localhost:8090/docs 2>/dev/null || xdg-open http://localhost:8090/docs 2>/dev/null || true
## health: Check the proxy health endpoint
health:
@curl -sf http://localhost:8090/healthz | python3 -m json.tool
## check: Run build + vet + lint + test (full pre-commit check)
check: build
go vet ./...
golangci-lint run
go test -race ./...
## test-integration: Run integration tests (requires Docker)
test-integration:
go test -tags integration -v -timeout 10m ./test/integration/...
# ─────────────────────────────────────────────
# Helm (requires: helm)
# ─────────────────────────────────────────────
## helm-dry-run: Render Helm templates without deploying
helm-dry-run:
helm template veylant-proxy deploy/helm/veylant-proxy
## helm-deploy: Deploy to staging (requires KUBECONFIG and IMAGE_TAG env vars)
helm-deploy:
helm upgrade --install veylant-proxy deploy/helm/veylant-proxy \
--namespace veylant \
--create-namespace \
--set image.tag=$(IMAGE_TAG) \
--wait --timeout 5m
# ─────────────────────────────────────────────
# Load tests (requires: brew install k6)
# ─────────────────────────────────────────────
SCENARIO ?= smoke
VEYLANT_URL ?= http://localhost:8090
VEYLANT_TOKEN ?= dev-token
## load-test: Run k6 load tests (SCENARIO=smoke|load|stress|soak, default: smoke)
load-test:
k6 run \
--env VEYLANT_URL=$(VEYLANT_URL) \
--env VEYLANT_TOKEN=$(VEYLANT_TOKEN) \
--env SCENARIO=$(SCENARIO) \
test/k6/k6-load-test.js
# ─────────────────────────────────────────────
# Blue/Green deployment (requires: kubectl + helm + Istio)
# ─────────────────────────────────────────────
NAMESPACE ?= veylant
ACTIVE_SLOT ?= blue
## deploy-blue: Deploy IMAGE_TAG to the blue slot
deploy-blue:
IMAGE_TAG=$(IMAGE_TAG) NAMESPACE=$(NAMESPACE) ACTIVE_SLOT=green \
./deploy/scripts/blue-green.sh
## deploy-green: Deploy IMAGE_TAG to the green slot
deploy-green:
IMAGE_TAG=$(IMAGE_TAG) NAMESPACE=$(NAMESPACE) ACTIVE_SLOT=blue \
./deploy/scripts/blue-green.sh
## deploy-rollback: Roll back to the previous active slot
deploy-rollback:
@echo "Rolling back: switching traffic back to $(ACTIVE_SLOT)..."
kubectl patch virtualservice veylant-proxy -n $(NAMESPACE) --type merge \
-p '{"spec":{"http":[{"route":[{"destination":{"host":"veylant-proxy","subset":"$(ACTIVE_SLOT)"},"weight":100}]}]}}'
@echo "Rollback complete. Active slot: $(ACTIVE_SLOT)"
## help: Show this help message
help:
@grep -E '^## ' Makefile | sed 's/## / /'