Второй CI-гейт после тестов: ruff как статический анализатор всего Python-кода (services + scripts). Раньше ни линта, ни проверки типов в CI не было вовсе. Конфиг ruff.toml: правила E/F/W/I/UP/B/SIM/C4, line-length 100. Осознанно выключены E501 (длину держит форматтер; длинные RU-комментарии — норма), B008 (Depends()/Query() в дефолтах — идиома FastAPI, не баг) и UP042 ((str, Enum)→StrEnum меняет __str__/сериализацию — не трогаем). Починено под ноль находок: - B904 (11): raise ... from exc / from None — читаемые цепочки исключений в Celery-ретраях и HTTPException, ошибки обработки не маскируют исходные. - SIM105 (5): try/except/pass → contextlib.suppress (faiss remove_ids, lsh.remove, сброс кэша, ws-disconnect, парс года). - C416/SIM108/B905/F841/UP035/UP017/F401/I001: dict(rows), тернарник, zip strict, мёртвая переменная, устаревшие импорты, timezone.utc→UTC, чистка/сортировка. Обвязка: scripts/run_lint.sh (ruff в изолированном python:3.11-slim), шаг «Линт» в job test перед юнит-тестами (падаем раньше). make lint / make lint-fix. Все 41 юнит-тест по-прежнему зелёные, изменённые файлы компилируются. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
161 lines
7.0 KiB
Makefile
161 lines
7.0 KiB
Makefile
.PHONY: dev build migrate logs shell-api shell-gpu lint lint-fix 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"
|
|
|
|
# ─── Линтинг и тесты ──────────────────────────────────────────────────────────
|
|
# Ruff-линт всего Python-кода в изолированном контейнере (конфиг — ruff.toml).
|
|
# Тот же скрипт гоняет CI как гейт перед деплоем. Автофиксы: make lint-fix.
|
|
lint:
|
|
bash scripts/run_lint.sh
|
|
|
|
lint-fix:
|
|
ruff check services/ scripts/ --fix
|
|
|
|
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"
|