Зачем Стенд поднимался пустым, и всякая приёмка следующих этапов начиналась с ручной заливки данных. Теперь `make up` сам приводит стенд к одному и тому же состоянию, а в git лежит то, чем это состояние проверяется. Что - Опись мира `data/world-inventory.json`: паспорт (зерно, версия генератора, хеш каталога) и по строке на каждый из восьми дней — дата, число событий, хеш байтов. Собирается `make inventory`, свежесть сторожит `test_inventory.py` — тем же способом, что свежесть описания выгрузки. - Разовая служба `world-init` вышла из-под профиля и играет в топик восемь дней при каждом подъёме; зависимый у неё — `airflow-init`, иначе `--wait` считает успешно отработавшую службу упавшей. - `scripts/wait-for-world.sh` — вторая половина `make up`: приём асинхронный, поэтому ждать надо доезда до `ods.event`, а не завершения заливки. Ограниченный цикл опроса, не пауза наугад. - Девятая проверка `make check-clickhouse`: подневный счёт событий против описи, рамка по датам стартового мира, счёт через `FINAL`. При расхождении называет, где искать, — в событиях или в браке. - Порог «день ≤ 30 с» снят из спеки генератора в обоих местах: замер дал 1,7 с, порог был выше факта в восемнадцать раз. На его месте — замеры с датой. Раздел 9 спеки закрыт: открытых вопросов не осталось. - Слова: «манифест» стал описью мира, «зерновой мир» — стартовым миром (решение владельца). Оба заведены в словарь CONTEXT.md. Проверка `make clean && make up` с нуля — 2 м 50 с, доехало ровно 401 185 событий. `make check-clickhouse` зелёный (8 с), `make smoke` зелёный (9 с), `make test` — 407 тестов за 71 с, `make lint`, `make typecheck`, `make config-test` зелёные. Что проверка умеет краснеть, снято двумя поломками: снос партиции 2026-06-03 дал диагноз «не доехали до ODS», негодная строка в сырье — «сломан разбор». Строки опыта убраны, день переигран, счёт вернулся. Тест свежести проверен молчаливой правкой цены в каталоге: покраснел. Ссылка: #42
62 lines
1.6 KiB
Makefile
62 lines
1.6 KiB
Makefile
COMPOSE ?= docker compose
|
|
GENERATOR_DAY ?= 0
|
|
GENERATOR_LIMIT ?=
|
|
GENERATOR_SPEED ?=
|
|
|
|
.PHONY: up down clean ps logs generate-batch generate-live config-test lint typecheck test docs inventory smoke check-clickhouse check-services
|
|
|
|
# Второй шаг: `--wait` дожидается служб, а приём событий асинхронный — довод
|
|
# целиком в шапке скрипта.
|
|
up:
|
|
$(COMPOSE) up --detach --build --wait --wait-timeout 600
|
|
COMPOSE_BIN="$(COMPOSE)" ./scripts/wait-for-world.sh
|
|
|
|
down:
|
|
$(COMPOSE) down --remove-orphans
|
|
|
|
clean:
|
|
$(COMPOSE) down --volumes --remove-orphans
|
|
|
|
ps:
|
|
$(COMPOSE) ps
|
|
|
|
logs:
|
|
$(COMPOSE) logs --follow
|
|
|
|
generate-batch:
|
|
$(COMPOSE) --profile generator run --rm generator batch --day "$(GENERATOR_DAY)" \
|
|
$(if $(GENERATOR_LIMIT),--limit "$(GENERATOR_LIMIT)")
|
|
|
|
generate-live:
|
|
$(COMPOSE) --profile generator run --rm generator live --day "$(GENERATOR_DAY)" \
|
|
$(if $(GENERATOR_SPEED),--speed "$(GENERATOR_SPEED)")
|
|
|
|
config-test:
|
|
COMPOSE_BIN="$(COMPOSE)" ./scripts/config-test.sh
|
|
|
|
lint:
|
|
cd generator && uv run ruff check && uv run ruff format --check
|
|
|
|
typecheck:
|
|
cd generator && uv run ty check
|
|
|
|
test:
|
|
cd generator && uv run pytest
|
|
|
|
docs:
|
|
cd generator && uv run python -m clickstream_generator.schema_doc \
|
|
../docs/formats/clickstream-event.md
|
|
|
|
inventory:
|
|
cd generator && uv run python -m clickstream_generator.inventory \
|
|
../data/world-inventory.json
|
|
|
|
smoke:
|
|
COMPOSE_BIN="$(COMPOSE)" ./scripts/stand-smoke.sh
|
|
|
|
check-clickhouse:
|
|
./scripts/check-clickhouse.sh
|
|
|
|
check-services:
|
|
COMPOSE_BIN="$(COMPOSE)" ./scripts/stand-services.sh
|