- байтовый порядок канонических форм остался тай-брейком только внутри одной доставки: на живом корпусе он решал 98,8% спорных координат и системно хранил меньшее значение, из-за чего step_count терял род и verify:archive был красным - правило перестало быть коммутативным осознанно, поэтому порядок свёртки приведён к журнальному: проход воркера прекращается на отложенной доставке, а свёртка вне порядка журнала пишет WARN - заведены счётчики PointsHeld и PointsErased — удержание полнотой и единственное направление, в котором правило теряет содержание
152 lines
6.8 KiB
YAML
152 lines
6.8 KiB
YAML
# yaml-language-server: $schema=https://taskfile.dev/schema.json
|
|
#
|
|
# Запуск команд проекта через Task (https://taskfile.dev).
|
|
# Список задач: `task --list`.
|
|
|
|
version: '3'
|
|
|
|
vars:
|
|
BINARY: healthlog
|
|
PKG: ./cmd/healthlog
|
|
# Версии инструментов для воспроизводимой установки (см. задачу setup).
|
|
GOLANGCI_VERSION: v2.12.2
|
|
# Проверка раскладки документов по канону av-dev-pm. Пусто — путь ищется в
|
|
# кеше плагинов (версия в пути меняется при обновлении, поэтому не зашита).
|
|
DOCS_PY: '{{.DOCS_PY | default ""}}'
|
|
|
|
tasks:
|
|
default:
|
|
desc: Список доступных задач
|
|
cmds:
|
|
- task --list
|
|
silent: true
|
|
|
|
run:
|
|
desc: 'Локальный запуск (config.toml не обязателен — есть умолчания)'
|
|
cmds:
|
|
- go run {{.PKG}} --config ./config.toml | hl
|
|
|
|
build:
|
|
desc: Статический бинарь linux/amd64 для сервера
|
|
cmds:
|
|
- CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags='-s -w' -o {{.BINARY}} {{.PKG}}
|
|
|
|
test:
|
|
desc: Прогон тестов
|
|
cmds:
|
|
- go test ./...
|
|
|
|
verify:archive:
|
|
desc: 'Сходимость на живом архиве: весь ./data/raw через разбор, повторный прогон обязан дать то же состояние'
|
|
cmds:
|
|
# Не входит в `task test` и `task gate` намеренно: архив в репозиторий не
|
|
# попадает, прогон занимает минуту, и держать его на каждом гейте значит
|
|
# платить за проверку, которая возможна только на этой машине.
|
|
- go test ./internal/replay -run TestReplay -healthlog.archive={{.ARCHIVE | default (printf "%s/data/raw" .ROOT_DIR)}} -v -count=1
|
|
|
|
verify:busy:
|
|
desc: 'Свёртка под удерживаемой блокировкой базы: доставка остаётся в очереди, а витрина не расходится с пересборкой (около 50 секунд)'
|
|
cmds:
|
|
# Не входит в `task test` и `task gate` намеренно: busy_timeout — пять
|
|
# секунд, повторов транзакции пять, и гейт гоняет тесты трижды. Проверяет
|
|
# при этом центральное решение задачи «разнести ответ и свёртку»:
|
|
# занятость базы — обстоятельство, а не свойство доставки.
|
|
- go test ./internal/fold -run TestBusy -healthlog.busy -v -count=1
|
|
# Второй прогон — композиция, ради которой заведён барьер журнального
|
|
# порядка: занятость откладывает доставку, проход прекращается на ней, и
|
|
# живая витрина всё равно совпадает с пересборкой. Порознь барьер и
|
|
# сходимость проверены в гейте; вместе — только здесь, потому что
|
|
# настоящая занятость стоит те же двадцать пять секунд.
|
|
- go test ./internal/replay -run TestBusy -healthlog.busy -v -count=1
|
|
|
|
lint:
|
|
desc: Запуск golangci-lint
|
|
cmds:
|
|
- golangci-lint run
|
|
|
|
up:
|
|
desc: 'Собрать и поднять сервис в контейнере (данные в ./data переживают пересборку)'
|
|
deps: [build]
|
|
cmds:
|
|
- docker compose up -d --build
|
|
- task: wait
|
|
|
|
down:
|
|
desc: Остановить контейнер
|
|
cmds:
|
|
- docker compose down
|
|
|
|
restart:
|
|
desc: 'Пересобрать бинарь и перезапустить сервис — основной цикл разработки'
|
|
deps: [build]
|
|
cmds:
|
|
- docker compose up -d --build
|
|
- task: wait
|
|
|
|
wait:
|
|
desc: 'Дождаться, пока сервис ответит на /healthz'
|
|
internal: true
|
|
cmds:
|
|
- |
|
|
for i in $(seq 1 30); do
|
|
if curl -fsS --max-time 2 http://127.0.0.1:8080/healthz >/dev/null 2>&1; then
|
|
echo "healthlog отвечает на :8080"; exit 0
|
|
fi
|
|
sleep 1
|
|
done
|
|
echo "healthlog не поднялся за 30 секунд, смотри: task logs" >&2
|
|
exit 1
|
|
|
|
logs:
|
|
desc: 'Логи сервиса (LINES=N — сколько строк, по умолчанию 50)'
|
|
vars:
|
|
LINES: '{{.LINES | default "50"}}'
|
|
cmds:
|
|
- docker compose logs --tail {{.LINES}} healthlog
|
|
|
|
ps:
|
|
desc: Состояние контейнера
|
|
cmds:
|
|
- docker compose ps
|
|
|
|
gate:
|
|
desc: 'Детерминированный гейт ревью: build/vet/lint/test/race/покрытие диффа/миграции/секреты/раскладка документов. BASE=<rev> — база диффа'
|
|
cmds:
|
|
- python3 scripts/gate.py {{.BASE}}
|
|
# Раскладка документов по канону av-dev-pm. Путь переопределяется
|
|
# переменной DOCS_PY — переустановка плагина не должна править Taskfile.
|
|
# Шаг обязан краснеть внятно, если скрипта нет: молча пропущенная
|
|
# проверка раскладки хуже отсутствующей.
|
|
- |
|
|
ds="{{.DOCS_PY}}"
|
|
if [ -z "$ds" ]; then
|
|
ds=$(ls -t "$HOME"/.claude/plugins/cache/*/av-dev-pm/*/skills/canon/scripts/docs.py 2>/dev/null | head -1)
|
|
fi
|
|
if [ -z "$ds" ] || [ ! -f "$ds" ]; then
|
|
echo "гейт: docs.py не найден"
|
|
echo " плагин av-dev-pm не установлен либо переехал —"
|
|
echo " поставь его или задай DOCS_PY=<путь> при вызове task gate"
|
|
exit 1
|
|
fi
|
|
python3 "$ds" check --dir . {{if .BASE}}--base {{.BASE}}{{end}}
|
|
|
|
review:context:
|
|
desc: 'Вход для архитектурного прохода ревью: пакеты, граф зависимостей, инвентарь концепций'
|
|
cmds:
|
|
- python3 scripts/review-context.py
|
|
|
|
tidy:
|
|
desc: go mod tidy
|
|
cmds:
|
|
- go mod tidy
|
|
|
|
clean:
|
|
desc: Удалить собранный бинарь
|
|
cmds:
|
|
- rm -f {{.BINARY}}
|
|
|
|
setup:
|
|
desc: Установка инструментов разработки
|
|
cmds:
|
|
- go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@{{.GOLANGCI_VERSION}}
|