Files
healthlog/Taskfile.yml
T
av 63bffe2865 Приём отвечает 200 до свёртки, свёртку ведёт фоновый воркер
- Очередью служит сама таблица: доставка ждёт свёртки в статусе `pending`,
  канал несёт только бит «есть работа». Переполнять нечего, падение процесса
  очередь не теряет, а подбор `pending` при старте — обычный проход воркера, а
  не отдельный код. Классификация исхода общая с пересборкой журнала.
- Исход разбора начал отражать доставку, а не обстоятельства: отмена и
  занятость базы статус не меняют (иначе конкуренция за базу выводила бы
  доставку из очереди навсегда), паника свёртки больше не валит процесс, а
  учёт доставки идёт через транзакцию с повторами.
- Длинный бюджет ответа выдан маршруту приёма, а не всему серверу:
  `write_timeout` в Go покрывает и чтение тела, и общий подъём снял бы защиту с
  остальных маршрутов.
2026-08-02 11:01:42 +03:00

127 lines
4.7 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
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: 'Свёртка под удерживаемой блокировкой базы: занятость обязана оставить доставку в очереди (около 25 секунд)'
cmds:
# Не входит в `task test` и `task gate` намеренно: busy_timeout — пять
# секунд, повторов транзакции пять, и гейт гоняет тесты трижды. Проверяет
# при этом центральное решение задачи «разнести ответ и свёртку»:
# занятость базы — обстоятельство, а не свойство доставки.
- go test ./internal/fold -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}}
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}}