Files
anti-plagiarism/Makefile
jze9 ecc10a4413 test: юнит-суит L1/L2/L3 + ГОСТ (41 тест) и гейт в CI перед деплоем
Первый настоящий автоматический тест-суит проекта — раньше регрессии ловились
руками. Покрыта чистая логика детекции и форматирования (без БД/Redis/GPU/Ollama):

- worker-indexer: L1 Winnowing (точные совпадения, идемпотентность отпечатка,
  диапазон signed int64) и L2 MinHash LSH (шинглы, Jaccard, near-duplicate +
  upsert через in-memory-фолбэк).
- worker-gpu: L3 FAISS — возврат doc_id из PostgreSQL (IndexIDMap2),
  идемпотентность add_vectors (remove-before-add, без дублей), self-match ≈ 1,
  ранжирование. Прямо стережёт баги, из-за которых индекс переписывался.
- worker-gost: ГОСТ 7.1-2003 и 7.0.5-2008 — авторы (≤3 / 4+ «и др.»/et al.),
  статья/книга/web, DOI, порядок сортировки кириллица→латиница, стр. в ссылке.

Обвязка: per-service pytest.ini/conftest/requirements-test. scripts/run_tests.sh
гоняет тесты в изолированных python:3.11-slim контейнерах (не засоряя хост),
через Tsinghua-зеркало. CI: job `test` теперь гейтит `deploy` (needs: test) —
падение тестов блокирует прод-деплой. make test / make test-one SVC=...

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-11 17:11:08 +05:00

157 lines
6.7 KiB
Makefile

.PHONY: dev build migrate logs shell-api shell-gpu lint test test-one down ps restart clean test-up test-down test-logs test-ps
# ─── Переменные ────────────────────────────────────────────────────────────────
# Прод: docker-compose.prod.yml — app-сервисы + локальный ES, остальная инфра
# (postgres/redis/rabbitmq/minio/ollama) уже существует и берётся из .env.
# Dev (полностью локальный sandbox, свои postgres/redis/rabbitmq/minio/ollama +
# hot reload) — поверх self-hosted примера, используется редко.
# Test (то, что реально гоняется на машине разработчика день в день) — hot
# reload против той же общей инфры, что и прод.
COMPOSE_PROD = docker compose -f docker-compose.prod.yml
COMPOSE_DEV = docker compose -f docker-compose.selfhosted.yml.example -f docker-compose.dev.yml
COMPOSE_TEST = docker compose -f docker-compose.test.yml
PROJECT = anti-plagiarism
# ─── Разработка (полностью локальный sandbox, редко используется) ─────────────
dev:
@cp -n .env.example .env 2>/dev/null || true
$(COMPOSE_DEV) up --build
dev-d:
@cp -n .env.example .env 2>/dev/null || true
$(COMPOSE_DEV) up --build -d
# ─── Test (hot reload против общей инфры — повседневная разработка) ──────────
test-up:
$(COMPOSE_TEST) up --build -d
test-down:
$(COMPOSE_TEST) down
test-logs:
$(COMPOSE_TEST) logs -f
test-ps:
$(COMPOSE_TEST) ps
# ─── Продакшн ─────────────────────────────────────────────────────────────────
build:
$(COMPOSE_PROD) build
up:
$(COMPOSE_PROD) up -d
down:
$(COMPOSE_PROD) down
restart:
$(COMPOSE_PROD) restart
ps:
$(COMPOSE_PROD) ps
# ─── Миграции ─────────────────────────────────────────────────────────────────
migrate:
$(COMPOSE_PROD) exec api alembic upgrade head
migrate-dev:
$(COMPOSE_DEV) exec api alembic upgrade head
makemigration:
@read -p "Migration name: " name; \
$(COMPOSE_PROD) exec api alembic revision --autogenerate -m "$$name"
downgrade:
$(COMPOSE_PROD) exec api alembic downgrade -1
# ─── Логи ─────────────────────────────────────────────────────────────────────
logs:
$(COMPOSE_PROD) logs -f
logs-api:
$(COMPOSE_PROD) logs -f api
logs-gpu:
$(COMPOSE_PROD) logs -f worker-gpu
logs-indexer:
$(COMPOSE_PROD) logs -f worker-indexer
logs-notifier:
$(COMPOSE_PROD) logs -f worker-notifier
logs-gost:
$(COMPOSE_PROD) logs -f worker-gost
# ─── Шеллы ────────────────────────────────────────────────────────────────────
shell-api:
$(COMPOSE_PROD) exec api bash
shell-gpu:
$(COMPOSE_PROD) exec worker-gpu bash
shell-indexer:
$(COMPOSE_PROD) exec worker-indexer bash
shell-db:
@echo "Postgres общий (192.168.1.11) — подключайся напрямую: psql -h 192.168.1.11 -U antiplagiator antiplagiator"
shell-redis:
@echo "Redis общий (192.168.1.19) — подключайся напрямую: redis-cli -h 192.168.1.19 -n 3"
# ─── Линтинг и тесты ──────────────────────────────────────────────────────────
lint:
$(COMPOSE_PROD) exec api ruff check . --fix
$(COMPOSE_PROD) exec api mypy app/
lint-frontend:
cd services/frontend && npm run lint
# Юнит-тесты чистой логики (L1/L2/L3 + ГОСТ) в изолированных контейнерах —
# без БД/Redis/GPU. Тот же скрипт гоняет CI как гейт перед деплоем.
test:
bash scripts/run_tests.sh
# Тесты одного сервиса, напр.: make test-one SVC=worker-gost
test-one:
bash scripts/run_tests.sh $(SVC)
# ─── Утилиты ──────────────────────────────────────────────────────────────────
# ВНИМАНИЕ: -v удаляет только ЛОКАЛЬНЫЕ volume (es_prod_data, faiss_index_prod) —
# общие postgres/redis/rabbitmq/minio не в Compose, их не затронет.
clean:
$(COMPOSE_PROD) down -v --remove-orphans
docker system prune -f
# Запустить парсер (пример: make parse PARSER=openalex ARGS="--limit 1000")
parse:
$(COMPOSE_PROD) exec api python /scripts/run_parser.py $(PARSER) $(ARGS)
# Создать MinIO бакеты (запускать один раз на общем MinIO 192.168.1.21, не локально)
minio-init:
@echo "MinIO общий (192.168.1.21) — бакеты documents/backups создаются на нём, см. .env MINIO_*"
# Создать ES индекс
es-init:
bash infra/elasticsearch/setup.sh
# Статистика Celery
flower:
@echo "Flower доступен по адресу http://localhost:5555"
@$(COMPOSE_PROD) ps flower
help:
@echo "Академический помощник — команды make:"
@echo ""
@echo " make test-up — запустить тестовый стек (hot reload, общая инфра)"
@echo " make dev — запустить полностью локальный sandbox (редко нужно)"
@echo " make build — собрать прод-образы"
@echo " make up — запустить в продакшн режиме"
@echo " make down — остановить все сервисы"
@echo " make migrate — применить миграции Alembic"
@echo " make logs — показать логи всех сервисов"
@echo " make shell-api — открыть shell в контейнере api"
@echo " make lint — запустить линтер"
@echo " make test — запустить тесты"
@echo " make clean — удалить прод-контейнеры и ЛОКАЛЬНЫЕ volume"