Dev-лаунчер: применять миграции перед стартом

Ветка задачи может принести миграцию, а run.ps1/run.sh сразу запускали uvicorn:
приложение поднималось на старой схеме и падало 500 на первом обращении к новой
таблице. Так вышло с 0012_match_finish_draft — создание партии отвечало «no such
table: match_finish_drafts». В test/prod такого нет, там схему накатывает
entrypoint.sh контейнера.

Отдельно разобран случай «база новее ветки»: после возврата с ветки задачи alembic
не находит ревизию, которой в этой ветке ещё нет. Останавливать запуск тут не за
что — лишние таблицы старому коду не мешают, поэтому печатаем предупреждение и
идём дальше. Настоящая ошибка миграции по-прежнему останавливает запуск.

stderr alembic в run.ps1 уводится в файл: в Windows PowerShell 5.1 «2>&1» на
нативном exe заворачивает каждую строку в ErrorRecord, а решение принимается по
коду возврата. run.ps1 остался строго ASCII.

#36

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BoiJK9ux8peeyjLb8TYjFf
This commit is contained in:
2026-09-09 20:00:49 +03:00
co-authored by Claude Opus 5
parent 225e62fc1f
commit 763745a223
2 changed files with 41 additions and 0 deletions
+17
View File
@@ -50,6 +50,23 @@ case "$app_env" in
[ -x "$py" ] || py="$root/backend/.venv/Scripts/python.exe" # Git Bash на Windows
[ -x "$py" ] || { echo "Нет venv. Сначала: cd backend && python -m venv .venv && pip install -e '.[dev]'"; exit 1; }
[ -d "$root/frontend/node_modules" ] || { echo "Нет node_modules. Сначала: cd frontend && npm install"; exit 1; }
# Сначала схема: ветка могла принести миграцию, и без неё бэк поднимется на
# старой схеме и упадёт 500 на первом же обращении к новой таблице.
echo "Применяю миграции (alembic upgrade head)…"
mig_log="$( cd "$root/backend" && "$py" -m alembic upgrade head 2>&1 )" && mig_code=0 || mig_code=$?
if [ "$mig_code" -ne 0 ]; then
echo "$mig_log"
case "$mig_log" in
*"locate revision"*)
# В базе миграция, которой нет в этой ветке (вернулись с ветки задачи).
# Лишние таблицы старому коду не мешают — продолжаем запуск.
echo "База новее ветки — миграции пропущены." ;;
*)
echo "Миграции не применились — не запускаю. Исправьте ошибку выше и повторите."
exit 1 ;;
esac
fi
echo "Запуск бэка (uvicorn --reload) и фронта (vite)… Ctrl+C — остановить всё."
( cd "$root/backend" && exec "$py" -m uvicorn app.main:app --reload ) &
back=$!