From b08df040e94927bc3b37546cf73e55df0b45a2ad Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 4 Oct 2026 05:26:51 +0400 Subject: [PATCH] =?UTF-8?q?build(dev):=20Makefile.common=20=E2=80=94=20?= =?UTF-8?q?=D1=8D=D1=82=D0=B0=D0=BB=D0=BE=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=84?= =?UTF-8?q?=D1=80=D0=B0=D0=B3=D0=BC=D0=B5=D0=BD=D1=82=20=D0=BE=D0=B1=D1=89?= =?UTF-8?q?=D0=B8=D1=85=20=D1=86=D0=B5=D0=BB=D0=B5=D0=B9=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B8=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Цели venv, lint, test, test-integration, check, docker-build, check-full, up по эталону scan-gateway; различия сервисов вынесены в переменные (MYPY_PATHS, IMAGE, COMPOSE_*, CHECK_FULL_STEPS). Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2 --- dev/Makefile.common | 74 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 dev/Makefile.common diff --git a/dev/Makefile.common b/dev/Makefile.common new file mode 100644 index 0000000..37b03ce --- /dev/null +++ b/dev/Makefile.common @@ -0,0 +1,74 @@ +# Эталонный фрагмент общих целей разработки для сервисов АРМ КА (arm-core, tabular-parser, scan-gateway). +# Описание целей и порядок проверок перед PR — dev/checks.md. Источник эталона: Makefile scan-gateway. +# +# Подключение (два способа, смысл одинаков): +# 1. include (в workspace и в worktree .wt/<срез>/ docs лежит рядом с сервисом): +# include ../docs/dev/Makefile.common +# Ставьте include ПОСЛЕ первой собственной цели сервиса или задайте `.DEFAULT_GOAL := check`, +# иначе целью по умолчанию станет `venv` (первая цель этого файла). +# 2. копирование: скопируйте содержимое в Makefile сервиса, не меняя рецепты общих целей. +# +# Запуск — из корня репозитория сервиса; рецепты сами переходят в api/ и используют окружение api/.venv. +# Все переменные заданы через `?=`: сервис переопределяет их до include (или в командной строке: make up COMPOSE_PROJECT=x). +# +# VENV каталог окружения относительно корня сервиса (api/.venv) +# BIN каталог исполняемых файлов окружения (абсолютный путь, строится от $(CURDIR)) +# MYPY_PATHS что проверяет mypy (src; у arm-core: src scripts) +# COMPOSE_FILE compose-файл инфраструктуры (../docs/dev/docker-compose.yml) +# COMPOSE_PROJECT имя compose-проекта; общее для всех сервисов workspace (arm-ka), поэтому целей down/stop/restart нет +# IMAGE тег docker-образа (по умолчанию — имя каталога сервиса) +# CHECK_FULL_STEPS цели `check-full` по порядку; сервис дописывает свои (arm-core: check dbml-check check-infra +# test-integration docker-build web-check). Собственные цели сервиса (migrate, seed, web-check ...) +# определяются в его Makefile, не здесь. +# +# Запускайте без `make -j`: шаги check-full вызываются последовательно через $(MAKE) и останавливаются на первой ошибке. + +VENV ?= api/.venv +BIN ?= $(CURDIR)/$(VENV)/bin +MYPY_PATHS ?= src +COMPOSE_FILE ?= ../docs/dev/docker-compose.yml +COMPOSE_PROJECT ?= arm-ka +IMAGE ?= $(notdir $(CURDIR)) +CHECK_FULL_STEPS ?= check test-integration docker-build + +# Перевод строки для $(foreach ...) в рецепте: каждый шаг становится отдельной строкой рецепта (две пустые строки обязательны) +define newline + + +endef + +.PHONY: venv lint test test-integration check docker-build check-full up + +# Python 3.11 (версия платформы); внутренние пакеты raisa_* вне банка недоступны — пропускаем их +venv: + cd api && uv venv --python 3.11 --allow-existing .venv + cd api && grep -v '^raisa_' requirements.txt | uv pip install --python .venv/bin/python -r - + cd api && grep -v '^-r' requirements-dev.txt | uv pip install --python .venv/bin/python -r - + +lint: + cd api && $(BIN)/ruff check . + cd api && $(BIN)/ruff format --check . + cd api && $(BIN)/mypy $(MYPY_PATHS) + +test: + cd api && $(BIN)/pytest -m "not integration" + +test-integration: + cd api && $(BIN)/pytest -m integration + +check: lint test + +# Образ собирается из корня репозитория; тесты в образе не запускаются +docker-build: + docker build -t $(IMAGE) . + +# Полная проверка перед PR. Шаги вызываются последовательно через $(MAKE), а не как пререквизиты: +# порядок и остановка на первой ошибке гарантированы и при make -j. +check-full: + $(foreach step,$(CHECK_FULL_STEPS),$(MAKE) $(step)$(newline)) + +# Общий compose-проект workspace. --wait — только со списком долгоживущих сервисов: одноразовый minio-init +# завершается кодом 0, и compose считает это сбоем. Бакет arm-ka создаётся отдельным идемпотентным шагом. +up: + docker compose -f $(COMPOSE_FILE) --project-name $(COMPOSE_PROJECT) up -d --wait postgres nats minio + docker compose -f $(COMPOSE_FILE) --project-name $(COMPOSE_PROJECT) run --rm minio-init