252 lines
7.6 KiB
Makefile
252 lines
7.6 KiB
Makefile
|
|
# go-first Makefile
|
||
|
|
# Web application for URPI - https://www.urpi.be
|
||
|
|
|
||
|
|
.PHONY: help build run dev test lint fmt vet tidy docker-build docker-run docker-push deploy clean
|
||
|
|
|
||
|
|
# Variables
|
||
|
|
APP_NAME := go-first
|
||
|
|
VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
||
|
|
BUILD_TIME := $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
|
||
|
|
GIT_COMMIT := $(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown")
|
||
|
|
GO_VERSION := 1.23
|
||
|
|
NODE_VERSION := 20
|
||
|
|
|
||
|
|
# Go variables
|
||
|
|
GO := go
|
||
|
|
GOFLAGS := -ldflags="-s -w -X main.version=$(VERSION) -X main.buildTime=$(BUILD_TIME) -X main.gitCommit=$(GIT_COMMIT)"
|
||
|
|
CGO_ENABLED := 0
|
||
|
|
|
||
|
|
# Docker variables
|
||
|
|
DOCKER_REGISTRY := ghcr.io
|
||
|
|
DOCKER_IMAGE := $(DOCKER_REGISTRY)/dnoulet/$(APP_NAME)
|
||
|
|
DOCKER_TAG := $(VERSION)
|
||
|
|
|
||
|
|
# Directories
|
||
|
|
BUILD_DIR := ./build
|
||
|
|
WEB_DIR := ./web
|
||
|
|
DIST_DIR := $(WEB_DIR)/dist
|
||
|
|
SERVER_DIR := ./cmd/server
|
||
|
|
|
||
|
|
# Default target
|
||
|
|
help: ## Show this help message
|
||
|
|
@echo "$(APP_NAME) - URPI Web Application"
|
||
|
|
@echo ""
|
||
|
|
@echo "Usage: make [target]"
|
||
|
|
@echo ""
|
||
|
|
@echo "Development:"
|
||
|
|
@echo " dev Run development servers (Go + Vite)"
|
||
|
|
@echo " dev-backend Run Go backend only"
|
||
|
|
@echo " dev-frontend Run Vite frontend only"
|
||
|
|
@echo " install Install all dependencies"
|
||
|
|
@echo ""
|
||
|
|
@echo "Building:"
|
||
|
|
@echo " build Build production binaries"
|
||
|
|
@echo " build-backend Build Go backend only"
|
||
|
|
@echo " build-frontend Build React frontend only"
|
||
|
|
@echo ""
|
||
|
|
@echo "Testing & Quality:"
|
||
|
|
@echo " test Run all tests"
|
||
|
|
@echo " test-backend Run Go tests"
|
||
|
|
@echo " test-frontend Run frontend tests"
|
||
|
|
@echo " lint Run all linters"
|
||
|
|
@echo " lint-backend Run Go linters"
|
||
|
|
@echo " lint-frontend Run frontend linters"
|
||
|
|
@echo " fmt Format all code"
|
||
|
|
@echo " vet Run go vet"
|
||
|
|
@echo " tidy Run go mod tidy"
|
||
|
|
@echo ""
|
||
|
|
@echo "Docker:"
|
||
|
|
@echo " docker-build Build Docker image"
|
||
|
|
@echo " docker-run Run Docker container locally"
|
||
|
|
@echo " docker-push Push Docker image to registry"
|
||
|
|
@echo ""
|
||
|
|
@echo "Deployment:"
|
||
|
|
@echo " deploy Deploy to production (requires config)"
|
||
|
|
@echo " deploy-staging Deploy to staging"
|
||
|
|
@echo ""
|
||
|
|
@echo "Maintenance:"
|
||
|
|
@echo " clean Clean build artifacts"
|
||
|
|
@echo " clean-all Clean everything including node_modules"
|
||
|
|
@echo " generate Generate code (mocks, etc.)"
|
||
|
|
|
||
|
|
# Development
|
||
|
|
dev: ## Run both backend and frontend in development mode
|
||
|
|
@echo "Starting development servers..."
|
||
|
|
@trap 'kill %1; kill %2' INT; \
|
||
|
|
$(MAKE) dev-backend & \
|
||
|
|
$(MAKE) dev-frontend & \
|
||
|
|
wait
|
||
|
|
|
||
|
|
dev-backend: ## Run Go backend
|
||
|
|
@$(GO) run ./cmd/server
|
||
|
|
|
||
|
|
dev-frontend: ## Run Vite frontend dev server
|
||
|
|
@cd $(WEB_DIR) && npm run dev
|
||
|
|
|
||
|
|
install: ## Install all dependencies
|
||
|
|
@echo "Installing Go dependencies..."
|
||
|
|
@$(GO) mod download
|
||
|
|
@echo "Installing frontend dependencies..."
|
||
|
|
@cd $(WEB_DIR) && npm ci
|
||
|
|
|
||
|
|
# Building
|
||
|
|
build: build-backend build-frontend ## Build everything for production
|
||
|
|
|
||
|
|
build-backend: ## Build Go backend binary
|
||
|
|
@echo "Building backend $(VERSION)..."
|
||
|
|
@mkdir -p $(BUILD_DIR)
|
||
|
|
@CGO_ENABLED=$(CGO_ENABLED) $(GO) build $(GOFLAGS) -o $(BUILD_DIR)/$(APP_NAME) $(SERVER_DIR)
|
||
|
|
@echo "Backend built: $(BUILD_DIR)/$(APP_NAME)"
|
||
|
|
|
||
|
|
build-frontend: ## Build React frontend
|
||
|
|
@echo "Building frontend..."
|
||
|
|
@cd $(WEB_DIR) && npm run build
|
||
|
|
@echo "Frontend built: $(DIST_DIR)"
|
||
|
|
|
||
|
|
# Testing
|
||
|
|
test: test-backend test-frontend ## Run all tests
|
||
|
|
|
||
|
|
test-backend: ## Run Go tests
|
||
|
|
@echo "Running Go tests..."
|
||
|
|
@$(GO) test -v -race -coverprofile=coverage.out ./...
|
||
|
|
@$(GO) tool cover -func=coverage.out | tail -1
|
||
|
|
|
||
|
|
test-frontend: ## Run frontend tests
|
||
|
|
@echo "Running frontend tests..."
|
||
|
|
@cd $(WEB_DIR) && npm test -- --run
|
||
|
|
|
||
|
|
# Linting
|
||
|
|
lint: lint-backend lint-frontend ## Run all linters
|
||
|
|
|
||
|
|
lint-backend: ## Run Go linters
|
||
|
|
@which golangci-lint > /dev/null || $(GO) install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
|
||
|
|
@golangci-lint run ./...
|
||
|
|
|
||
|
|
lint-frontend: ## Run frontend linters
|
||
|
|
@echo "Running frontend linters..."
|
||
|
|
@cd $(WEB_DIR) && npm run lint
|
||
|
|
|
||
|
|
fmt: ## Format all code
|
||
|
|
@echo "Formatting Go code..."
|
||
|
|
@$(GO) fmt ./...
|
||
|
|
@echo "Formatting frontend code..."
|
||
|
|
@cd $(WEB_DIR) && npm run format
|
||
|
|
|
||
|
|
vet: ## Run go vet
|
||
|
|
@$(GO) vet ./...
|
||
|
|
|
||
|
|
tidy: ## Run go mod tidy
|
||
|
|
@$(GO) mod tidy
|
||
|
|
|
||
|
|
# Docker
|
||
|
|
docker-build: ## Build Docker image
|
||
|
|
@echo "Building Docker image $(DOCKER_IMAGE):$(DOCKER_TAG)..."
|
||
|
|
@docker build -t $(DOCKER_IMAGE):$(DOCKER_TAG) -t $(DOCKER_IMAGE):latest .
|
||
|
|
@echo "Built: $(DOCKER_IMAGE):$(DOCKER_TAG)"
|
||
|
|
|
||
|
|
docker-run: ## Run Docker container locally
|
||
|
|
@echo "Running Docker container..."
|
||
|
|
@docker run --rm -p 8080:8080 \
|
||
|
|
-e SERVER_MODE=release \
|
||
|
|
--env-file .env.local \
|
||
|
|
$(DOCKER_IMAGE):$(DOCKER_TAG)
|
||
|
|
|
||
|
|
docker-push: ## Push Docker image to registry
|
||
|
|
@echo "Pushing Docker image..."
|
||
|
|
@docker push $(DOCKER_IMAGE):$(DOCKER_TAG)
|
||
|
|
@docker push $(DOCKER_IMAGE):latest
|
||
|
|
|
||
|
|
# Deployment
|
||
|
|
deploy: ## Deploy to production (requires kubectl/helm configured)
|
||
|
|
@echo "Deploying to production..."
|
||
|
|
@./deploy/deploy.sh production
|
||
|
|
|
||
|
|
deploy-staging: ## Deploy to staging
|
||
|
|
@echo "Deploying to staging..."
|
||
|
|
@./deploy/deploy.sh staging
|
||
|
|
|
||
|
|
# Maintenance
|
||
|
|
clean: ## Clean build artifacts
|
||
|
|
@echo "Cleaning build artifacts..."
|
||
|
|
@rm -rf $(BUILD_DIR)
|
||
|
|
@rm -rf $(DIST_DIR)
|
||
|
|
@$(GO) clean -cache
|
||
|
|
|
||
|
|
clean-all: clean ## Clean everything including dependencies
|
||
|
|
@echo "Cleaning all..."
|
||
|
|
@rm -rf $(WEB_DIR)/node_modules
|
||
|
|
@$(GO) clean -modcache
|
||
|
|
|
||
|
|
generate: ## Generate code (mocks, etc.)
|
||
|
|
@which mockgen > /dev/null || $(GO) install github.com/golang/mock/mockgen@latest
|
||
|
|
@echo "Generating mocks..."
|
||
|
|
@$(GO) generate ./...
|
||
|
|
|
||
|
|
# CI/CD helpers
|
||
|
|
ci-install: ## Install CI dependencies
|
||
|
|
@$(GO) install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
|
||
|
|
@$(GO) install github.com/air-verse/air@latest
|
||
|
|
@$(GO) install github.com/golang/mock/mockgen@latest
|
||
|
|
|
||
|
|
ci-test: ## Run CI tests
|
||
|
|
@$(MAKE) lint
|
||
|
|
@$(MAKE) test
|
||
|
|
|
||
|
|
ci-build: ## Build for CI
|
||
|
|
@$(MAKE) build
|
||
|
|
|
||
|
|
# Release
|
||
|
|
release-patch: ## Bump patch version
|
||
|
|
@git tag -a v$(shell semver bump patch) -m "Release patch version"
|
||
|
|
@git push origin --tags
|
||
|
|
|
||
|
|
release-minor: ## Bump minor version
|
||
|
|
@git tag -a v$(shell semver bump minor) -m "Release minor version"
|
||
|
|
@git push origin --tags
|
||
|
|
|
||
|
|
release-major: ## Bump major version
|
||
|
|
@git tag -a v$(shell semver bump major) -m "Release major version"
|
||
|
|
@git push origin --tags
|
||
|
|
|
||
|
|
# Database (if using migrations)
|
||
|
|
db-migrate-up: ## Run database migrations up
|
||
|
|
@which migrate > /dev/null || $(GO) install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
|
||
|
|
@migrate -path ./migrations -database "$(shell grep -A5 'database:' config.yaml | grep 'dsn' | cut -d: -f2- | xargs)" up
|
||
|
|
|
||
|
|
db-migrate-down: ## Run database migrations down
|
||
|
|
@migrate -path ./migrations -database "$(shell grep -A5 'database:' config.yaml | grep 'dsn' | cut -d: -f2- | xargs)" down
|
||
|
|
|
||
|
|
db-migrate-create: ## Create new migration (usage: make db-migrate-create name=add_users_table)
|
||
|
|
@migrate create -ext sql -dir ./migrations -seq $(name)
|
||
|
|
|
||
|
|
# Utilities
|
||
|
|
version: ## Show version info
|
||
|
|
@echo "Version: $(VERSION)"
|
||
|
|
@echo "Build Time: $(BUILD_TIME)"
|
||
|
|
@echo "Git Commit: $(GIT_COMMIT)"
|
||
|
|
|
||
|
|
check-deps: ## Check for outdated dependencies
|
||
|
|
@$(GO) list -u -m all
|
||
|
|
@cd $(WEB_DIR) && npm outdated
|
||
|
|
|
||
|
|
# Server management
|
||
|
|
start: build ## Build and start production server
|
||
|
|
@./$(BUILD_DIR)/$(APP_NAME)
|
||
|
|
|
||
|
|
stop: ## Stop running server (if using PID file)
|
||
|
|
@pkill -f $(APP_NAME) || true
|
||
|
|
|
||
|
|
restart: stop start ## Restart server
|
||
|
|
|
||
|
|
logs: ## View server logs (if using systemd)
|
||
|
|
@journalctl -u $(APP_NAME) -f
|
||
|
|
|
||
|
|
status: ## Check server status
|
||
|
|
@systemctl status $(APP_NAME) || docker ps | grep $(APP_NAME)
|
||
|
|
|
||
|
|
# SSL/Certificates (using Let's Encrypt)
|
||
|
|
cert-renew: ## Renew SSL certificates
|
||
|
|
@certbot renew --nginx
|
||
|
|
|
||
|
|
cert-status: ## Check certificate status
|
||
|
|
@certbot certificates
|