diff --git a/CLAUDE.md b/CLAUDE.md index 2b639ae..f3372fc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -44,6 +44,7 @@ SMB-сессия, S3, NATS, воркер; `GET /healthcheck`; gzip/proxy middlew проверяет `api/tests/unit/test_contract.py` (входит в `make check`). - `api/src/scan_emulator/` — эмулятор ИС Сканирование (`SCAN_FIXTURES_DIR`, `SCAN_EMULATOR_DELAY`, `SCAN_EMULATOR_POLL_SECONDS`); в compose контейнера пока нет — `make emulator`. -- `Makefile` (`venv`, `lint`, `test`, `test-integration`, `check`, `check-full`, `up`, `emulator`), `api/pyproject.toml` - (ruff, mypy), `Dockerfile` + `.dockerignore` (один образ: шлюз и эмулятор), `api/.env.example`, `api/.env.test`. +- `Makefile` (`venv`, `lint`, `test`, `test-integration`, `check`, `docker-build`, `check-full`, `up`, + `emulator`), `api/pyproject.toml` (ruff, mypy), `Dockerfile` + `.dockerignore` (один образ: шлюз и эмулятор), + `api/.env.example`, `api/.env.test`. - Тесты: `api/tests/unit/`, `api/tests/integration/` (маркеры `integration`, `fixtures`); перед PR — `make check-full`. diff --git a/Makefile b/Makefile index d8c2ff2..ddade17 100644 --- a/Makefile +++ b/Makefile @@ -5,8 +5,9 @@ BIN := $(CURDIR)/$(VENV)/bin # docs/dev — соседний репозиторий и в основном workspace, и в worktree .wt/<срез>/ COMPOSE_FILE ?= ../docs/dev/docker-compose.yml COMPOSE_PROJECT ?= arm-ka +IMAGE ?= scan-gateway:dev -.PHONY: help venv lint test test-integration check check-full up emulator +.PHONY: help venv lint test test-integration check docker-build check-full up emulator help: @echo "venv - окружение api/.venv (Python 3.11) с зависимостями без raisa_*" @@ -14,7 +15,8 @@ help: @echo "test - pytest без интеграционных тестов" @echo "test-integration - интеграционные тесты (нужны NATS и MinIO: make up)" @echo "check - lint + test" - @echo "check-full - check + test-integration" + @echo "docker-build - собрать docker-образ $(IMAGE) (контекст — корень репозитория)" + @echo "check-full - check + test-integration + docker-build (по порядку, до первой ошибки)" @echo "up - поднять NATS/MinIO/PostgreSQL общим compose-проектом arm-ka" @echo "emulator - запустить эмулятор ИС Сканирование (python -m src.scan_emulator)" @@ -37,8 +39,17 @@ test-integration: check: lint test -# Полная проверка перед PR. Сборку docker-образа добавит задача 15 -check-full: check test-integration +# Образ собирается без Nexus (raisa_* в образ не ставятся, см. Dockerfile). Тесты в образе не запускаются: +# tests/ в нём есть, но api/.env.test исключён через .dockerignore, поэтому pytest внутри контейнера не пройдёт. +docker-build: + docker build -t $(IMAGE) . + +# Полная проверка перед PR. Шаги вызываются последовательно через $(MAKE), а не как пререквизиты: +# так порядок check -> test-integration -> docker-build и остановка на первой ошибке гарантированы и при make -j. +check-full: + $(MAKE) check + $(MAKE) test-integration + $(MAKE) docker-build # Общий compose-проект workspace (arm-ka): его используют и другие сервисы, поэтому целей down/stop/restart нет. # --wait — только со списком долгоживущих сервисов: одноразовый minio-init завершается кодом 0, и compose считает это сбоем diff --git a/README.md b/README.md index 4627515..c088c75 100644 --- a/README.md +++ b/README.md @@ -180,7 +180,8 @@ curl -s localhost:8000/healthcheck ```bash make check # lint (ruff check, ruff format --check, mypy src) + test (pytest -m "not integration") make test-integration # pytest -m integration: нужны NATS и MinIO (make up) -make check-full # check + test-integration; перед PR +make docker-build # docker build -t scan-gateway:dev . (образ без Nexus) +make check-full # check + test-integration + docker-build; перед PR ``` Тесты запускаются из `api/`: `.env.test` подключается через `ENV_FILE=.env.test` в `api/pytest.ini` и разрешается @@ -188,7 +189,7 @@ make check-full # check + test-integration; перед PR исключается из `make test`; `fixtures` — нужны реальные данные из `../fixtures` (нет репозитория — тесты пропускаются). Тесты: `api/tests/unit/`, `api/tests/integration/`. Интеграционные тесты делят NATS с другими сервисами workspace: если в нём работает другой экземпляр `scan-gateway`, он может забрать запрос теста из queue group. -Сборка Docker-образа в `make check-full` пока не входит. +Шаги `make check-full` идут последовательно и прерываются на первой ошибке; тесты в образе не запускаются. ## `/healthcheck` @@ -221,4 +222,4 @@ make check-full # check + test-integration; перед PR - Режим `smb` покрыт unit-тестами с подменённым `smbclient`; на реальной шаре ИС Сканирование не проверялся. Фактические имена каталогов и путь шары на стенде неизвестны — они настраиваются, а не зашиты в код. - Повторной отправки в ИС нет (OQ-15); падение шлюза после ack теряет задание до `reply_deadline` ядра. -- Контейнер `scan-emulator` в compose отсутствует, сборка образа в `make check-full` не входит. +- Контейнер `scan-emulator` в compose отсутствует. diff --git a/docs/superpowers/plans/2026-10-03-slice-0-skeleton.md b/docs/superpowers/plans/2026-10-03-slice-0-skeleton.md index 8914be3..668f982 100644 --- a/docs/superpowers/plans/2026-10-03-slice-0-skeleton.md +++ b/docs/superpowers/plans/2026-10-03-slice-0-skeleton.md @@ -76,7 +76,7 @@ ### Task 15: [6.2] `make check-full` -- [ ] `make check-full`: `make check` + `pytest -m integration` + `docker build`; проверка: зелёный против compose docs на ветке `feat/1-slice-0-skeleton` +- [x] `make check-full`: `make check` + `pytest -m integration` + `docker build`; проверка: зелёный против compose docs на ветке `feat/1-slice-0-skeleton` ### Task 16: [6.3] Прогон DoD diff --git a/openspec/changes/slice-0-skeleton/tasks.md b/openspec/changes/slice-0-skeleton/tasks.md index 8f3a072..c87d80d 100644 --- a/openspec/changes/slice-0-skeleton/tasks.md +++ b/openspec/changes/slice-0-skeleton/tasks.md @@ -65,7 +65,7 @@ MinIO `uploads/…`, опубликовать `request-image.json`, собрать `recognition.result`: `processing`, затем `NOT_IMPLEMENTED` с `raw_s3_key`; проверить объект `raw/.json` в MinIO; второй запрос с `unknown.pdf` → `INVALID_DOCUMENT`; проверка: зелёный -- [ ] 6.2 `make check-full`: `make check` + `pytest -m integration` + `docker build`; проверка: зелёный против compose docs +- [x] 6.2 `make check-full`: `make check` + `pytest -m integration` + `docker build`; проверка: зелёный против compose docs на ветке `feat/1-slice-0-skeleton` - [ ] 6.3 Прогон DoD: `make up` → `make check-full` → ручная проверка из `docs/dev/README.md`; `openspec validate slice-0-skeleton --strict`; вывод `make check-full` — в описание PR