fetch_ml/Makefile
Jeremie Fraeys 03cead6319 Organize docker-compose files and fix test output paths
- Move docker-compose.prod.yml and docker-compose.homelab-secure.yml to deployments/
- Create deployments/README.md with usage instructions
- Update test scripts to use new deployment paths
- Fix performance regression detection to output to tests/bin/
- All test outputs now properly organized in tests/bin/
2025-12-06 13:45:05 -05:00

359 lines
13 KiB
Makefile

.PHONY: all build prod dev clean clean-docs test test-unit test-integration test-e2e test-coverage lint install setup validate configlint ci-local docs benchmark benchmark-local artifacts clean-benchmarks clean-all clean-aggressive status load-test chaos-test profile-tools detect-regressions tech-excellence docker-build docker-run docker-stop docker-logs monitoring-performance monitoring-performance-stop dashboard-performance self-cleanup auto-cleanup test-full test-auth test-status
# Default target
all: build
# Build all components
build:
go build -o bin/api-server cmd/api-server/main.go
go build -o bin/worker cmd/worker/worker_server.go cmd/worker/worker_config.go
go build -o bin/tui ./cmd/tui
cd cli && zig build prod
@echo "✓ All components built"
# Build production-optimized binaries
prod:
go build -ldflags="-s -w" -o bin/api-server cmd/api-server/main.go
go build -ldflags="-s -w" -o bin/worker cmd/worker/worker_server.go cmd/worker/worker_config.go
go build -ldflags="-s -w" -o bin/tui ./cmd/tui
cd cli && zig build prod && strip zig-out/prod/ml
@echo "✓ Production binaries built"
# Development build (faster compilation)
dev:
go build -o bin/api-server cmd/api-server/main.go
go build -o bin/worker cmd/worker/worker_server.go cmd/worker/worker_config.go
go build -o bin/tui ./cmd/tui
cd cli && zig build dev
@echo "✓ Development binaries built"
# Clean build artifacts
clean:
rm -rf bin/ coverage/
rm -rf cli/zig-out/
rm -rf cli/.zig-cache/
go clean
@echo "✓ Cleaned"
clean-docs:
rm -rf docs/_site/
@echo "✓ Cleaned docs"
# Run tests
test:
go test ./tests/...
cd cli && zig build test
@echo "✓ All tests passed"
# Lint Go and Zig code
lint:
gofmt -w ./cmd ./internal ./tests || true
go vet ./...
cd cli && zig fmt .
@echo "✓ Lint completed"
# Install to system (requires sudo)
install: prod
sudo cp bin/api-server /usr/local/bin/fetchml-api
sudo cp bin/worker /usr/local/bin/fetchml-worker
sudo cp bin/tui /usr/local/bin/fetchml-tui
sudo cp cli/zig-out/prod/ml /usr/local/bin/ml
@echo "✓ Installed"
# Setup production environment
setup:
@if [ "$(shell uname)" = "Linux" ]; then \
sudo ./scripts/setup-prod.sh; \
else \
echo "Production setup is for Linux only. You're on $(shell uname)."; \
echo "Use docker-compose for local development."; \
fi
# Validate production configuration
validate:
./scripts/validate-prod-config.sh configs/config-prod.yaml configs/worker-prod.toml
# Validate YAML configs against JSON schema
configlint:
go run ./cmd/configlint --schema configs/schema/config_schema.yaml \
configs/config-prod.yaml \
configs/config-no-tls.yaml \
configs/config-dev.yaml
worker-configlint:
go run ./cmd/configlint --schema configs/schema/worker_config_schema.yaml \
configs/worker-prod.toml
# Run a local approximation of the CI pipeline
ci-local:
make test
make lint
make configlint
make worker-configlint
@echo "Running queue package tests with race detector..."
go test -v -race -coverprofile=coverage/queue-coverage.out ./internal/queue/...
@echo "Running coverage..."
make test-coverage
# Docker targets
docker-build:
docker build -f build/docker/simple.Dockerfile -t fetchml:latest .
@echo "✓ Docker image built"
docker-run:
docker-compose up -d
@echo "✓ Services started"
docker-stop:
docker-compose down
@echo "✓ Services stopped"
docker-logs:
docker-compose logs -f
# Monitoring setup (Linux only)
setup-monitoring:
@if [ "$(shell uname)" = "Linux" ]; then \
sudo ./scripts/setup-monitoring-prod.sh; \
else \
echo "Monitoring setup is for Linux production. Use docker-compose for local development."; \
fi
# Enhanced test targets
test-unit:
go test -v -short ./...
test-integration:
go test -v ./...
test-e2e:
go test -v ./tests/e2e/...
test-coverage:
go test -coverprofile=coverage/coverage.out ./...
go tool cover -html=coverage/coverage.out -o coverage/coverage.html
@echo "✓ Coverage report: coverage/coverage.html"
# Documentation setup
docs-setup:
@echo "Setting up MkDocs documentation..."
@if ! command -v mkdocs >/dev/null 2>&1; then \
echo "MkDocs not found. Please install it manually:"; \
echo " macOS: brew install mkdocs mkdocs-material"; \
echo " Linux: pip install mkdocs mkdocs-material"; \
echo "Or visit: https://www.mkdocs.org/user-guide/installation/"; \
exit 1; \
fi
@if ! python3 -c "import pymdownx.superfences" >/dev/null 2>&1; then \
echo "pymdown-extensions not found. Please install it manually:"; \
echo " pip3 install --user pymdown-extensions"; \
echo " Or use a virtual environment: python3 -m venv docs-env && source docs-env/bin/activate && pip install pymdown-extensions"; \
exit 1; \
fi
@echo "Documentation setup complete!"
# Documentation
docs: docs-setup docs-build
@echo "Starting MkDocs development server..."
cd docs && mkdocs serve
# Build documentation
docs-build:
@echo "Building static documentation..."
cd docs && mkdocs build
# Performance benchmarking tools
benchmark:
@echo "Running performance benchmarks..."
go test -bench=. -benchmem ./tests/benchmarks/...
# Run benchmarks locally with artifact management
benchmark-local:
@echo "Running benchmarks locally with full workflow..."
./scripts/run-benchmarks-local.sh
# Manage benchmark artifacts
artifacts:
@echo "Managing benchmark artifacts..."
./scripts/manage-artifacts.sh help
# Clean benchmark artifacts (keep last 10)
clean-benchmarks:
@echo "Cleaning benchmark artifacts..."
./scripts/cleanup-benchmarks.sh benchmarks
# Comprehensive cleanup (keep last 5 runs)
clean-all:
@echo "Running comprehensive cleanup..."
./scripts/cleanup-benchmarks.sh all
# Aggressive cleanup (removes more data)
clean-aggressive:
@echo "Running aggressive cleanup..."
./scripts/cleanup-benchmarks.sh aggressive
# Show disk usage status
status:
@echo "Checking disk usage..."
./scripts/cleanup-benchmarks.sh status
# Start performance monitoring stack
monitoring-performance:
@echo "Starting performance monitoring stack..."
cd monitoring && docker-compose -f docker-compose.performance.yml up -d
@echo "Grafana available at: http://localhost:3001 (admin/admin)"
@echo "Loki available at: http://localhost:3100"
@echo "Pushgateway available at: http://localhost:9091"
@echo "Quick start guide: docs/src/performance-quick-start.md"
# Stop performance monitoring stack
monitoring-performance-stop:
@echo "Stopping performance monitoring stack..."
cd monitoring && docker-compose -f docker-compose.performance.yml down
# View performance dashboard
dashboard-performance:
@echo "Opening performance dashboard..."
@echo "URL: http://localhost:3001/d/fetchml-performance/fetch-ml-performance-dashboard"
# Load testing
load-test:
@echo "Running load tests..."
go test -v ./tests/load/...
# CPU profiling for HTTP LoadTestSuite (MediumLoad only for speed)
profile-load:
@echo "CPU profiling MediumLoad HTTP load test..."
go test ./tests/load -run TestLoadProfile_Medium -count=1 -cpuprofile tests/bin/cpu_load.out
@echo "✓ CPU profile written to cpu_load.out (inspect with: go tool pprof tests/bin/cpu_load.out)"
profile-load-norate:
@echo "CPU profiling MediumLoad HTTP load test (no rate limiting)..."
go test ./tests/load -run TestLoadProfile_Medium -count=1 -cpuprofile tests/bin/cpu_load.out -v -args -profile-norate
@echo "✓ CPU profile written to cpu_load.out (inspect with: go tool pprof tests/bin/cpu_load.out)"
# CPU profiling for WebSocket → Redis queue → worker path
profile-ws-queue:
@echo "CPU profiling WebSocket queue integration test..."
go test ./tests/integration -run WebSocketQueue -count=5 -cpuprofile tests/bin/cpu_ws.out
@echo "✓ CPU profile written to cpu_ws.out (inspect with: go tool pprof tests/bin/cpu_ws.out)"
# Chaos engineering tests
chaos-test:
@echo "Running chaos engineering tests..."
go test -v ./tests/chaos/...
# Performance profiling tools
profile-tools:
@echo "Building profiling tools..."
go build -o bin/performance-regression-detector ./tools/performance_regression_detector.go
go build -o bin/profiler ./tools/profiler.go
# Performance regression detection
detect-regressions:
@echo "Detecting performance regressions..."
@if [ ! -f "tests/bin/baseline.json" ]; then \
echo "Creating baseline performance metrics..."; \
go test -bench=. -benchmem ./tests/benchmarks/... | tee tests/bin/baseline.json; \
fi
@echo "Analyzing current performance against baseline..."
go test -bench=. -benchmem ./tests/benchmarks/... | tee tests/bin/current.json; \
echo "Use tools/performance_regression_detector to analyze results"; \
# Technical excellence suite (runs all performance tests)
tech-excellence: benchmark load-test chaos-test profile-tools
@echo "Technical excellence test suite completed"
@echo "Results summary:"
@echo " - Benchmarks: See test output above"
@echo " - Load tests: See test output above"
@echo " - Chaos tests: See test output above"
@echo " - Profiling tools: Built in bin/"
@echo " - Regression detection: Run 'make detect-regressions'"
# Help
help:
@echo "FetchML Build System"
@echo ""
@echo "Build Targets:"
@echo " make build - Build all components (default)"
@echo " make prod - Build production-optimized binaries"
@echo " make dev - Build development binaries (faster)"
@echo " make clean - Remove build artifacts"
@echo ""
@echo "Docker Targets:"
@echo " make docker-build - Build Docker image"
@echo " make docker-run - Start services with docker-compose"
@echo " make docker-stop - Stop docker-compose services"
@echo " make docker-logs - View docker-compose logs"
@echo ""
@echo "Test Targets:"
@echo " make test - Run all tests"
@echo " make test-unit - Run unit tests only"
@echo " make test-integration - Run integration tests"
@echo " make test-coverage - Generate coverage report"
@echo " make lint - Run formatters and linters"
@echo " make ci-local - Run local CI dry-run (tests, lint, config validation, coverage)"
@echo " make configlint - Validate YAML configs against schema"
@echo ""
@echo "Setup Targets:"
@echo " make install - Install binaries to /usr/local/bin (requires sudo)"
@echo " make setup - Run production setup (Linux only)"
@echo " make setup-monitoring - Setup monitoring stack (Linux only)"
@echo " make validate - Validate production configuration"
@echo ""
@echo "Performance Testing:"
@echo " make benchmark - Run performance benchmarks"
@echo " make benchmark-local - Run benchmarks locally with artifact management"
@echo " make artifacts - Manage benchmark artifacts (list, clean, compare, export)"
@echo " make clean-benchmarks - Clean benchmark artifacts (keep last 10)"
@echo " make clean-all - Comprehensive cleanup (keep last 5 runs)"
@echo " make clean-aggressive - Aggressive cleanup (removes more data)"
@echo " make status - Show disk usage status"
@echo " make load-test - Run load testing suite"
@echo " make profile-load - CPU profile MediumLoad HTTP test suite"
@echo " make profile-ws-queue - CPU profile WebSocket→queue→worker path"
@echo " make chaos-test - Run chaos engineering tests"
@echo " make profile-tools - Build performance profiling tools"
@echo " make detect-regressions - Detect performance regressions"
@echo " make tech-excellence - Run complete technical excellence suite"
@echo ""
@echo "Documentation:"
@echo " make docs-setup - Install MkDocs and dependencies"
@echo " make docs - Start MkDocs development server with live reload"
@echo " make docs-build - Build static documentation for deployment"
@echo ""
@echo "Utility:"
@echo " make size - Show binary sizes"
@echo " make self-cleanup - Clean up Docker resources"
@echo " make auto-cleanup - Setup daily auto-cleanup service"
@echo " make test-full - Run complete test suite"
@echo " make test-auth - Test multi-user authentication"
@echo " make test-status - Check cleanup status"
@echo " make help - Show this help"
# Self-cleaning for Docker resources
self-cleanup:
@echo "Running self-cleanup..."
@./scripts/maintenance/cleanup.sh
# Setup auto-cleanup service
auto-cleanup:
@echo "Setting up auto-cleanup service..."
@./scripts/deployment/setup-auto-cleanup.sh
# Run full test suite
test-full:
@echo "Running full test suite..."
@./scripts/testing/run-full-test-suite.sh
# Quick authentication test
test-auth:
@echo "Testing multi-user authentication..."
@echo "Testing admin user..." && cp ~/.ml/config-admin.toml ~/.ml/config.toml && ./cli/zig-out/bin/ml status
@echo "Testing researcher user..." && cp ~/.ml/config-researcher.toml ~/.ml/config.toml && ./cli/zig-out/bin/ml status
@echo "Testing analyst user..." && cp ~/.ml/config-analyst.toml ~/.ml/config.toml && ./cli/zig-out/bin/ml status
# Test cleanup status
test-status:
@echo "Checking cleanup status..."
@./scripts/maintenance/cleanup-status.sh