Files
EventHubBack/Makefile

347 lines
14 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
.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
#3. Мониторинг во время нагрузочного теста
#Во время теста полезно следить за состоянием ноды:
#
#Через Docker (если приложение в контейнере):
#bash
#docker stats eventhub
#docker exec eventhub /app/bin/eventhub remote_console
#Внутри консоли Erlang можно выполнить:
#
#erlang
#observer:start(). % графический мониторинг
#recon:proc_count(5). % топ-5 процессов по памяти (если установлен recon)
# ============================================================================
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:8080/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 -R200 \
-H "Authorization: Bearer $$TOKEN" \
http://localhost:8080/v1/search?type=event\&q=test
# ============================================================================
# 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 up -d
@echo "✅ Кластер запущен"
@echo "Node 1: http://localhost:8080"
@echo "Node 2: http://localhost:8082"
@echo "Node 3: http://localhost:8084"
docker-compose-down: ## Остановить кластер
@echo "Остановка кластера..."
@docker-compose -f docker/docker-compose.yml down
@echo "✅ Кластер остановлен"
docker-compose-logs: ## Показать логи кластера
@docker-compose -f docker/docker-compose.yml 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