rwadurian/backend/mpc-system/Makefile

261 lines
8.5 KiB
Makefile

.PHONY: help proto build test docker-build docker-up docker-down deploy-k8s clean lint fmt
# Default target
.DEFAULT_GOAL := help
# Variables
GO := go
DOCKER := docker
DOCKER_COMPOSE := docker-compose
PROTOC := protoc
GOPATH := $(shell go env GOPATH)
PROJECT_NAME := mpc-system
VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
BUILD_TIME := $(shell date -u '+%Y-%m-%d_%H:%M:%S')
LDFLAGS := -ldflags "-X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)"
# Services
SERVICES := session-coordinator message-router server-party account
help: ## Show this help
@echo "MPC Distributed Signature System - Build Commands"
@echo ""
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
# ============================================
# Development Commands
# ============================================
init: ## Initialize the project (install tools)
@echo "Installing tools..."
$(GO) install google.golang.org/protobuf/cmd/protoc-gen-go@latest
$(GO) install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
$(GO) install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest
$(GO) install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
$(GO) mod download
@echo "Tools installed successfully!"
proto: ## Generate protobuf code
@echo "Generating protobuf..."
@mkdir -p api/grpc/coordinator/v1
@mkdir -p api/grpc/router/v1
$(PROTOC) --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
api/proto/*.proto
@echo "Protobuf generated successfully!"
fmt: ## Format Go code
@echo "Formatting code..."
$(GO) fmt ./...
@echo "Code formatted!"
lint: ## Run linter
@echo "Running linter..."
golangci-lint run ./...
@echo "Lint completed!"
# ============================================
# Build Commands
# ============================================
build: ## Build all services
@echo "Building all services..."
@for service in $(SERVICES); do \
echo "Building $$service..."; \
$(GO) build $(LDFLAGS) -o bin/$$service ./services/$$service/cmd/server; \
done
@echo "All services built successfully!"
build-session-coordinator: ## Build session-coordinator service
@echo "Building session-coordinator..."
$(GO) build $(LDFLAGS) -o bin/session-coordinator ./services/session-coordinator/cmd/server
build-message-router: ## Build message-router service
@echo "Building message-router..."
$(GO) build $(LDFLAGS) -o bin/message-router ./services/message-router/cmd/server
build-server-party: ## Build server-party service
@echo "Building server-party..."
$(GO) build $(LDFLAGS) -o bin/server-party ./services/server-party/cmd/server
build-account: ## Build account service
@echo "Building account service..."
$(GO) build $(LDFLAGS) -o bin/account ./services/account/cmd/server
clean: ## Clean build artifacts
@echo "Cleaning..."
rm -rf bin/
rm -rf vendor/
$(GO) clean -cache
@echo "Cleaned!"
# ============================================
# Test Commands
# ============================================
test: ## Run all tests
@echo "Running tests..."
$(GO) test -v -race -coverprofile=coverage.out ./...
@echo "Tests completed!"
test-unit: ## Run unit tests only
@echo "Running unit tests..."
$(GO) test -v -race -short ./...
@echo "Unit tests completed!"
test-integration: ## Run integration tests
@echo "Running integration tests..."
$(GO) test -v -race -tags=integration ./tests/integration/...
@echo "Integration tests completed!"
test-e2e: ## Run end-to-end tests
@echo "Running e2e tests..."
$(GO) test -v -race -tags=e2e ./tests/e2e/...
@echo "E2E tests completed!"
test-coverage: ## Run tests with coverage report
@echo "Running tests with coverage..."
$(GO) test -v -race -coverprofile=coverage.out -covermode=atomic ./...
$(GO) tool cover -html=coverage.out -o coverage.html
@echo "Coverage report generated: coverage.html"
test-docker-integration: ## Run integration tests in Docker
@echo "Starting test infrastructure..."
$(DOCKER_COMPOSE) -f tests/docker-compose.test.yml up -d postgres-test redis-test rabbitmq-test
@echo "Waiting for services..."
sleep 10
$(DOCKER_COMPOSE) -f tests/docker-compose.test.yml run --rm migrate
$(DOCKER_COMPOSE) -f tests/docker-compose.test.yml run --rm integration-tests
@echo "Integration tests completed!"
test-docker-e2e: ## Run E2E tests in Docker
@echo "Starting full test environment..."
$(DOCKER_COMPOSE) -f tests/docker-compose.test.yml up -d
@echo "Waiting for services to be healthy..."
sleep 30
$(DOCKER_COMPOSE) -f tests/docker-compose.test.yml run --rm e2e-tests
@echo "E2E tests completed!"
test-docker-all: ## Run all tests in Docker
@echo "Running all tests in Docker..."
$(MAKE) test-docker-integration
$(MAKE) test-docker-e2e
@echo "All Docker tests completed!"
test-clean: ## Clean up test resources
@echo "Cleaning up test resources..."
$(DOCKER_COMPOSE) -f tests/docker-compose.test.yml down -v --remove-orphans
rm -f coverage.out coverage.html
@echo "Test cleanup completed!"
# ============================================
# Docker Commands
# ============================================
docker-build: ## Build Docker images
@echo "Building Docker images..."
$(DOCKER_COMPOSE) build
@echo "Docker images built!"
docker-up: ## Start all services with Docker Compose
@echo "Starting services..."
$(DOCKER_COMPOSE) up -d
@echo "Services started!"
docker-down: ## Stop all services
@echo "Stopping services..."
$(DOCKER_COMPOSE) down
@echo "Services stopped!"
docker-logs: ## View logs
$(DOCKER_COMPOSE) logs -f
docker-ps: ## View running containers
$(DOCKER_COMPOSE) ps
docker-clean: ## Remove all containers and volumes
@echo "Cleaning Docker resources..."
$(DOCKER_COMPOSE) down -v --remove-orphans
@echo "Docker resources cleaned!"
# ============================================
# Database Commands
# ============================================
db-migrate: ## Run database migrations
@echo "Running database migrations..."
psql -h localhost -U mpc_user -d mpc_system -f migrations/001_init_schema.sql
@echo "Migrations completed!"
db-reset: ## Reset database (drop and recreate)
@echo "Resetting database..."
psql -h localhost -U mpc_user -d postgres -c "DROP DATABASE IF EXISTS mpc_system"
psql -h localhost -U mpc_user -d postgres -c "CREATE DATABASE mpc_system"
$(MAKE) db-migrate
@echo "Database reset completed!"
# ============================================
# Mobile SDK Commands
# ============================================
build-android-sdk: ## Build Android SDK
@echo "Building Android SDK..."
gomobile bind -target=android -o sdk/android/mpcsdk.aar ./sdk/go
@echo "Android SDK built!"
build-ios-sdk: ## Build iOS SDK
@echo "Building iOS SDK..."
gomobile bind -target=ios -o sdk/ios/Mpcsdk.xcframework ./sdk/go
@echo "iOS SDK built!"
build-mobile-sdk: build-android-sdk build-ios-sdk ## Build all mobile SDKs
# ============================================
# Kubernetes Commands
# ============================================
deploy-k8s: ## Deploy to Kubernetes
@echo "Deploying to Kubernetes..."
kubectl apply -f k8s/
@echo "Deployed!"
undeploy-k8s: ## Remove from Kubernetes
@echo "Removing from Kubernetes..."
kubectl delete -f k8s/
@echo "Removed!"
# ============================================
# Development Helpers
# ============================================
run-coordinator: ## Run session-coordinator locally
$(GO) run ./services/session-coordinator/cmd/server
run-router: ## Run message-router locally
$(GO) run ./services/message-router/cmd/server
run-party: ## Run server-party locally
$(GO) run ./services/server-party/cmd/server
run-account: ## Run account service locally
$(GO) run ./services/account/cmd/server
dev: docker-up ## Start development environment
@echo "Development environment is ready!"
@echo " PostgreSQL: localhost:5432"
@echo " Redis: localhost:6379"
@echo " RabbitMQ: localhost:5672 (management: localhost:15672)"
@echo " Consul: localhost:8500"
# ============================================
# Release Commands
# ============================================
release: lint test build ## Create a release
@echo "Creating release $(VERSION)..."
@echo "Release created!"
version: ## Show version
@echo "Version: $(VERSION)"
@echo "Build Time: $(BUILD_TIME)"