240 lines
6.7 KiB
Makefile
240 lines
6.7 KiB
Makefile
# Database Render Application Makefile
|
|
|
|
# Variables
|
|
BINARY_NAME=database-render
|
|
APP_NAME=database-render
|
|
VERSION?=latest
|
|
BUILD_TIME=$(shell date -u '+%Y-%m-%d_%H:%M:%S')
|
|
GIT_COMMIT=$(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown")
|
|
LDFLAGS=-ldflags "-X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME) -X main.GitCommit=$(GIT_COMMIT)"
|
|
|
|
# Go parameters
|
|
GOCMD=go
|
|
GOBUILD=$(GOCMD) build
|
|
GOCLEAN=$(GOCMD) clean
|
|
GOTEST=$(GOCMD) test
|
|
GOGET=$(GOCMD) get
|
|
GOMOD=$(GOCMD) mod
|
|
GOFMT=gofmt
|
|
GOFMT_CHECK=$(GOFMT) -l
|
|
GOFMT_FMT=$(GOFMT) -w
|
|
|
|
# Directories
|
|
BIN_DIR=bin
|
|
DIST_DIR=dist
|
|
CONFIG_DIR=config
|
|
WEB_DIR=web
|
|
TEMPLATES_DIR=web/templates
|
|
STATIC_DIR=web/static
|
|
|
|
# Default target
|
|
.PHONY: all
|
|
all: clean build
|
|
|
|
# Build the application
|
|
.PHONY: build
|
|
build: deps
|
|
@echo "Building $(BINARY_NAME)..."
|
|
@mkdir -p $(BIN_DIR)
|
|
CGO_ENABLED=1 $(GOBUILD) $(LDFLAGS) -o $(BIN_DIR)/$(BINARY_NAME) ./cmd/server
|
|
@echo "Build completed: $(BIN_DIR)/$(BINARY_NAME)"
|
|
|
|
# Build for multiple platforms
|
|
.PHONY: build-all
|
|
build-all: clean deps
|
|
@echo "Building for multiple platforms..."
|
|
@mkdir -p $(DIST_DIR)
|
|
# Linux AMD64 with CGO
|
|
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -o $(DIST_DIR)/$(BINARY_NAME)-linux-amd64 ./cmd/server
|
|
# Linux ARM64 with CGO
|
|
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 $(GOBUILD) $(LDFLAGS) -o $(DIST_DIR)/$(BINARY_NAME)-linux-arm64 ./cmd/server
|
|
# macOS AMD64 with CGO
|
|
CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -o $(DIST_DIR)/$(BINARY_NAME)-darwin-amd64 ./cmd/server
|
|
# macOS ARM64 with CGO
|
|
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 $(GOBUILD) $(LDFLAGS) -o $(DIST_DIR)/$(BINARY_NAME)-darwin-arm64 ./cmd/server
|
|
# Windows AMD64 with CGO (requires mingw-w64)
|
|
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc $(GOBUILD) $(LDFLAGS) -o $(DIST_DIR)/$(BINARY_NAME)-windows-amd64.exe ./cmd/server
|
|
@echo "Multi-platform build completed in $(DIST_DIR)/"
|
|
|
|
# Install dependencies
|
|
.PHONY: deps
|
|
deps:
|
|
@echo "Installing dependencies..."
|
|
$(GOMOD) tidy
|
|
$(GOMOD) download
|
|
|
|
# Clean build artifacts
|
|
.PHONY: clean
|
|
clean:
|
|
@echo "Cleaning..."
|
|
$(GOCLEAN)
|
|
rm -rf $(BIN_DIR)
|
|
rm -rf $(DIST_DIR)
|
|
@echo "Clean completed"
|
|
|
|
# Run tests
|
|
.PHONY: test
|
|
test:
|
|
@echo "Running tests..."
|
|
$(GOTEST) -v ./...
|
|
|
|
# Run tests with coverage
|
|
.PHONY: test-coverage
|
|
test-coverage:
|
|
@echo "Running tests with coverage..."
|
|
$(GOTEST) -v -coverprofile=coverage.out ./...
|
|
$(GOCMD) tool cover -html=coverage.out -o coverage.html
|
|
@echo "Coverage report generated: coverage.html"
|
|
|
|
# Format code
|
|
.PHONY: fmt
|
|
fmt:
|
|
@echo "Formatting code..."
|
|
$(GOFMT_FMT) .
|
|
|
|
# Check code formatting
|
|
.PHONY: fmt-check
|
|
fmt-check:
|
|
@echo "Checking code formatting..."
|
|
@if [ -n "$$($(GOFMT_CHECK) .)" ]; then \
|
|
echo "Code is not formatted. Please run 'make fmt' to format the code."; \
|
|
exit 1; \
|
|
fi
|
|
@echo "Code formatting is correct"
|
|
|
|
# Lint code
|
|
.PHONY: lint
|
|
lint:
|
|
@echo "Running linter..."
|
|
@if command -v golangci-lint >/dev/null 2>&1; then \
|
|
golangci-lint run; \
|
|
else \
|
|
echo "golangci-lint not found. Please install it: https://golangci-lint.run/"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# Security scan
|
|
.PHONY: security
|
|
security:
|
|
@echo "Running security scan..."
|
|
@if command -v gosec >/dev/null 2>&1; then \
|
|
gosec ./...; \
|
|
else \
|
|
echo "gosec not found. Please install it: go install github.com/securecodewarrior/gosec/v2/cmd/gosec@latest"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# Run the application
|
|
.PHONY: run
|
|
run: build
|
|
@echo "Starting $(BINARY_NAME)..."
|
|
./$(BIN_DIR)/$(BINARY_NAME)
|
|
|
|
# Run with development configuration
|
|
.PHONY: dev
|
|
dev: build
|
|
@echo "Starting $(BINARY_NAME) in development mode..."
|
|
CONFIG_FILE=config/config.yaml ./$(BIN_DIR)/$(BINARY_NAME)
|
|
|
|
# Create sample configuration
|
|
.PHONY: init-config
|
|
init-config:
|
|
@echo "Creating sample configuration..."
|
|
@mkdir -p $(CONFIG_DIR)
|
|
@if [ ! -f $(CONFIG_DIR)/config.yaml ]; then \
|
|
cp config/config.example.yaml $(CONFIG_DIR)/config.yaml; \
|
|
echo "Sample configuration created at $(CONFIG_DIR)/config.yaml"; \
|
|
else \
|
|
echo "Configuration file already exists at $(CONFIG_DIR)/config.yaml"; \
|
|
fi
|
|
|
|
# Generate database schema example
|
|
.PHONY: init-db
|
|
init-db:
|
|
@echo "Creating sample database schema..."
|
|
@mkdir -p $(CONFIG_DIR)
|
|
@if [ ! -f $(CONFIG_DIR)/schema.sql ]; then \
|
|
cp config/schema.example.sql $(CONFIG_DIR)/schema.sql; \
|
|
echo "Sample database schema created at $(CONFIG_DIR)/schema.sql"; \
|
|
else \
|
|
echo "Database schema file already exists at $(CONFIG_DIR)/schema.sql"; \
|
|
fi
|
|
|
|
# Initialize project
|
|
.PHONY: init
|
|
init: init-config init-db deps
|
|
@echo "Project initialized successfully!"
|
|
@echo "Please edit $(CONFIG_DIR)/config.yaml to configure your database connection"
|
|
@echo "Then run: make run"
|
|
|
|
# Docker commands
|
|
.PHONY: docker-build
|
|
docker-build:
|
|
@echo "Building Docker image..."
|
|
docker build -t $(APP_NAME):$(VERSION) .
|
|
|
|
.PHONY: docker-run
|
|
docker-run:
|
|
@echo "Running Docker container..."
|
|
docker run -p 8080:8080 -v $(PWD)/config:/app/config $(APP_NAME):$(VERSION)
|
|
|
|
.PHONY: docker-compose-up
|
|
docker-compose-up:
|
|
@echo "Starting with Docker Compose..."
|
|
docker-compose up --build
|
|
|
|
.PHONY: docker-compose-down
|
|
docker-compose-down:
|
|
@echo "Stopping Docker Compose..."
|
|
docker-compose down
|
|
|
|
# Development helpers
|
|
.PHONY: watch
|
|
watch:
|
|
@echo "Watching for changes..."
|
|
@if command -v air >/dev/null 2>&1; then \
|
|
air; \
|
|
else \
|
|
echo "air not found. Please install it: go install github.com/cosmtrek/air@latest"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# Check system health
|
|
.PHONY: health
|
|
health:
|
|
@echo "Checking system health..."
|
|
@curl -f http://localhost:8080/health || echo "Server not running"
|
|
|
|
# Show help
|
|
.PHONY: help
|
|
help:
|
|
@echo "Database Render Application - Available Commands:"
|
|
@echo ""
|
|
@echo "Development:"
|
|
@echo " make init - Initialize project with sample config and database"
|
|
@echo " make run - Build and run the application"
|
|
@echo " make dev - Run in development mode"
|
|
@echo " make watch - Run with hot reload (requires air)"
|
|
@echo ""
|
|
@echo "Building:"
|
|
@echo " make build - Build the application"
|
|
@echo " make build-all - Build for multiple platforms"
|
|
@echo " make clean - Clean build artifacts"
|
|
@echo ""
|
|
@echo "Quality:"
|
|
@echo " make test - Run tests"
|
|
@echo " make test-coverage - Run tests with coverage"
|
|
@echo " make fmt - Format code"
|
|
@echo " make fmt-check - Check code formatting"
|
|
@echo " make lint - Run linter"
|
|
@echo " make security - Run security scan"
|
|
@echo ""
|
|
@echo "Docker:"
|
|
@echo " make docker-build - Build Docker image"
|
|
@echo " make docker-run - Run Docker container"
|
|
@echo " make docker-compose-up - Start with Docker Compose"
|
|
@echo " make docker-compose-down - Stop Docker Compose"
|
|
@echo ""
|
|
@echo "Utilities:"
|
|
@echo " make health - Check application health"
|
|
@echo " make help - Show this help message"
|