Files
EventHubBack/Makefile
T

344 lines
14 KiB
Makefile

.PHONY: help clean compile shell test eunit test-api test-all \
dialyzer xref cover docs release run stop logs
# Цвета для вывода (только для команд, где нужны)
GREEN := \033[0;32m
YELLOW := \033[1;33m
RED := \033[0;31m
BLUE := \033[0;34m
NC := \033[0m
# Переменные
REBAR3 := rebar3
SNAME := eventhub
SHELL := /bin/bash
# ============================================================================
# HELP
# ============================================================================
help: ## Показать это сообщение
@echo "EventHub - Makefile команды:"
@echo ""
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*?## "}; {printf " %-20s %s\n", $$1, $$2}'
# ============================================================================
# BUILD
# ============================================================================
compile: ## Скомпилировать проект
@echo "Компиляция проекта..."
@$(REBAR3) compile
@echo "✓ Компиляция завершена"
clean: ## Очистить проект
@echo "Очистка проекта..."
@$(REBAR3) clean
@rm -rf _build build deps logs *.log
@echo "✓ Очистка завершена"
deps: ## Установить зависимости
@echo "Установка зависимостей..."
@$(REBAR3) get-deps
@echo "✓ Зависимости установлены"
update-deps: ## Обновить зависимости
@echo "Обновление зависимостей..."
@$(REBAR3) update-deps
@echo "✓ Зависимости обновлены"
# ============================================================================
# DEVELOPMENT
# ============================================================================
shell: ## Запустить интерактивную оболочку
@echo "Запуск Erlang shell..."
@$(REBAR3) shell --sname $(SNAME)
run: ## Запустить приложение (foreground)
@echo "Запуск приложения..."
@$(REBAR3) shell --sname $(SNAME)
test-server: ## Запустить тестовый сервер в фоне
@echo "Cleaning old data..."
@rm -rf Mnesia.*
@echo "Starting server..."
@rebar3 shell --sname eventhub_test </dev/null > /tmp/eventhub_test.log 2>&1 &
@echo "PID: $$!"
@for i in 1 2 3 4 5 6 7 8 9 10; do \
if curl -s http://localhost:8080/health | grep -q "ok"; then \
echo "✓ Server ready at http://localhost:8080"; \
break; \
fi; \
sleep 1; \
done
stop: ## Остановить приложение
@echo "Остановка приложения..."
@pkill -f "rebar3 shell --sname $(SNAME)" || true
@pkill -f "beam.*$(SNAME)" || true
@echo "✓ Приложение остановлено"
restart: stop run ## Перезапустить приложение
# ============================================================================
# TESTING
# ============================================================================
test: eunit ## Запустить все тесты (алиас для eunit)
eunit: ## Запустить EUnit тесты
@echo "Запуск EUnit тестов..."
@$(REBAR3) eunit --sname $(SNAME)_test
eunit-module: ## Запустить тесты для модуля (make eunit-module MODULE=core_calendar_tests)
@echo "Запуск тестов для модуля $(MODULE)..."
@$(REBAR3) eunit --sname $(SNAME)_test --module=$(MODULE)
eunit-verbose: ## Запустить EUnit тесты с подробным выводом
@echo "Запуск EUnit тестов (verbose)..."
@$(REBAR3) eunit --sname $(SNAME)_test --verbose
test-search-unit: ## Запустить unit-тесты поиска
@echo "Запуск unit-тестов поиска (logic)..."
@$(REBAR3) eunit --sname test_search1 --module=logic_search_tests
test-search-handler: ## Запустить handler тесты поиска
@echo "Запуск handler тестов поиска..."
@$(REBAR3) eunit --sname test_search2 --module=handler_search_tests
test-api: test-ct
test-ct: ## Запустить Common Test для API
@rebar3 ct --sname $(SNAME)_api_test
test-ct-verbose: ## Запустить Common Test с подробным выводом
@ct_run -suite test/ct/api_SUITE \
-pa _build/default/lib/*/ebin \
-pa test/ct/api \
-logdir logs/ct \
-verbosity 50
test-api-auth: ## Тесты аутентификации
@rebar3 shell --eval "api_auth_tests:test()." --name test_api@127.0.0.1
test-api-calendar: ## Тесты календарей
@rebar3 shell --eval "api_calendar_tests:test()." --name test_api@127.0.0.1
test-api-event: ## Тесты событий
@rebar3 shell --eval "api_event_tests:test()." --name test_api@127.0.0.1
test-api-booking: ## Тесты бронирований
@rebar3 shell --eval "api_booking_tests:test()." --name test_api@127.0.0.1
test-api-search: ## Тесты поиска
@rebar3 shell --eval "api_search_tests:test()." --name test_api@127.0.0.1
test-api-reviews: ## Тесты отзывов
@rebar3 shell --eval "api_reviews_tests:test()." --name test_api@127.0.0.1
test-api-moderation: ## Тесты модерации
@rebar3 shell --eval "api_moderation_tests:test()." --name test_api@127.0.0.1
test-api-tickets: ## Тесты тикетов
@rebar3 shell --eval "api_tickets_tests:test()." --name test_api@127.0.0.1
test-api-subscription: ## Тесты подписки
@rebar3 shell --eval "api_subscription_tests:test()." --name test_api@127.0.0.1
test-api-admin: ## Тесты админки
@rebar3 shell --eval "api_admin_tests:test()." --name test_api@127.0.0.1
test-api-ws: ## Тесты админки
@rebar3 shell --eval "api_websocket_tests:test()." --name test_api@127.0.0.1
test-scripts: ## Запустить тесты с фильтром (make test-runner PATTERN=booking)
@chmod +x test/scripts/*.sh
@cd test/scripts && ./run_tests.sh $(PATTERN)
test-all: eunit ## Запустить ВСЕ тесты (EUnit + API)
@sleep 1
make test-api
@echo "========================================"
@echo " ВСЕ ТЕСТЫ ПРОЙДЕНЫ!"
@echo "========================================"
# ============================================================================
# LOAD TESTING
# ============================================================================
tsung-test: ## Запустить нагрузочный тест Tsung
@echo "Запуск нагрузочного теста Tsung..."
@mkdir -p logs/tsung
@tsung -f test/tsung/eventhub_http.xml -l logs/tsung start
@echo "Отчёт: logs/tsung/*/report.html"
wrk-register: ## Нагрузочный тест регистрации (wrk2)
@wrk -t4 -c100 -d30s -t100 -s test/wrk/scripts/wrk_register.lua http://localhost/v1/register
wrk-search: ## Нагрузочный тест поиска (wrk2)
@TOKEN=$$(curl -s -X POST http://localhost:8080/v1/register \
-H "Content-Type: application/json" \
-d '{"email":"wrktest@test.com","password":"pass"}' | \
grep -o '"token":"[^"]*"' | cut -d'"' -f4); \
wrk -t4 -c100 -d30s -t200 \
-H "Authorization: Bearer $$TOKEN" \
http://localhost:8080/v1/search?type=event\&q=test
wrk-health: ## Нагрузочный тест health (wrk2)
wrk -t4 -c10000 -d30s -t200 \
-H "Host: api.eventhub.local" \
http://localhost/health
# ============================================================================
# CODE QUALITY
# ============================================================================
dialyzer: ## Запустить Dialyzer (статический анализ)
@echo "Запуск Dialyzer..."
@$(REBAR3) dialyzer
@echo "✓ Dialyzer завершён"
xref: ## Запустить Xref (кросс-ссылки)
@echo "Запуск Xref..."
@$(REBAR3) xref
@echo "✓ Xref завершён"
cover: ## Запустить тесты с покрытием кода
@echo "Запуск тестов с покрытием..."
@$(REBAR3) eunit --sname $(SNAME)_test --cover
@$(REBAR3) cover --verbose
@echo "✓ Отчёт о покрытии в _build/test/cover/"
docs: ## Сгенерировать документацию (EDoc)
@echo "Генерация документации..."
@$(REBAR3) edoc
@echo "✓ Документация в doc/"
# ============================================================================
# RELEASE & DOCKER
# ============================================================================
release: ## Собрать релиз
@echo "Сборка релиза..."
@$(REBAR3) as prod release
@echo "✓ Релиз собран в _build/prod/rel/eventhub/"
# ============================================================================
# DOCKER
# ============================================================================
docker-build: ## Собрать Docker образ
@echo "Сборка Docker образа..."
@docker build -f docker/Dockerfile -t eventhub:latest .
@echo "✅ Docker образ собран"
docker-build-debug: ## Собрать Docker образ
@echo "Сборка Docker образа..."
@docker build -f docker/Debug.Dockerfile -t eventhub-debug:latest .
@echo "✅ Docker образ собран"
docker-run: ## Запустить Docker контейнер (одиночный)
@echo "Запуск Docker контейнера..."
@docker run -d \
--name eventhub \
-p 8080:8080 \
-p 8081:8081 \
-p 8445:8445 \
-p 8446:8446 \
-v eventhub-data:/app/data \
eventhub:latest
@echo "✅ Контейнер запущен на http://localhost:8080"
docker-stop: ## Остановить Docker контейнер
@echo "Остановка Docker контейнера..."
@docker stop eventhub 2>/dev/null || true
@docker rm eventhub 2>/dev/null || true
@echo "✅ Контейнер остановлен"
docker-logs: ## Показать логи Docker контейнера
@docker logs -f eventhub
docker-shell: ## Зайти в Docker контейнер
@docker exec -it eventhub sh
docker-compose-up: ## Запустить кластер (3 ноды)
@echo "Запуск кластера EventHub (3 ноды)..."
@docker-compose -f docker/docker-compose.yml --env-file docker/.env up -d
@echo "✅ Кластер запущен"
@echo "Node 1: http://localhost:8080"
@echo "Node 2: http://localhost:8082"
@echo "Node 3: http://localhost:8084"
@echo "Prometheus: http://localhost:9090"
@echo "Grafana: http://localhost:3000"
@echo "ObserverWeb: http://localhost:4000/observer/"
@echo "Traefik: http://localhost:8080"
docker-compose-down: ## Остановить кластер
@echo "Остановка кластера..."
@docker-compose -f docker/docker-compose.yml --env-file docker/.env down
@echo "✅ Кластер остановлен"
docker-compose-logs: ## Показать логи кластера
@docker-compose -f docker/docker-compose.yml --env-file docker/.env logs -f
docker-clean: docker-stop ## Очистить Docker образы и volumes
@docker rmi eventhub:latest 2>/dev/null || true
@docker volume rm eventhub-data 2>/dev/null || true
@echo "✅ Docker очищен"
# ============================================================================
# UTILITIES
# ============================================================================
status: ## Проверить статус сервера
@echo "Проверка статуса сервера..."
@if curl -s http://localhost:8080/health > /dev/null 2>&1; then \
echo "✓ Сервер запущен на http://localhost:8080"; \
curl -s http://localhost:8080/health; \
else \
echo "✗ Сервер не запущен"; \
fi
tree: ## Показать структуру проекта
@tree -I '_build|deps|logs|.git' --dirsfirst 2>/dev/null || ls -la
info: ## Показать информацию о проекте
@echo "EventHub - информация о проекте:"
@echo ""
@echo "API эндпоинты:"
@echo " POST /v1/register - Регистрация"
@echo " POST /v1/login - Логин"
@echo " POST /v1/refresh - Обновление токена"
@echo " GET /v1/user/me - Профиль"
@echo " POST /v1/calendars - Создание календаря"
@echo " GET /v1/calendars - Список календарей"
@echo " POST /v1/calendars/:id/events - Создание события"
@echo " POST /v1/events/:id/bookings - Запись на событие"
@echo ""
@echo "Порты:"
@echo " HTTP API: 8080"
@echo " Admin HTTP: 8445"
# ============================================================================
# DEVELOPMENT WORKFLOW
# ============================================================================
dev-setup: deps compile ## Настроить окружение для разработки
@echo "✓ Окружение настроено"
dev-test: ## Быстрый цикл: compile + eunit
@make compile
@make eunit
# ============================================================================
# GIT HELPERS
# ============================================================================
git-status: ## Показать статус Git
@git status --short
git-log: ## Показать лог Git (последние 10)
@git log --oneline -10
git-save: ## Сохранить изменения (commit + push)
@read -p "Сообщение коммита: " msg; \
git add .; \
git commit -m "$$msg"; \
git push
# ============================================================================
# DEFAULT
# ============================================================================
.DEFAULT_GOAL := help