test: verify release schema upgrade

This commit is contained in:
ik
2026-09-12 20:57:58 +07:00
parent 049f1ef30a
commit f6e6211871
4 changed files with 49 additions and 1 deletions
+6
View File
@@ -63,6 +63,12 @@ curl -fsS -H "Authorization: Bearer $ADMIN_TOKEN" -o rf4spotter-diagnostics.json
./deploy/test-production-bootstrap.sh
```
Отдельный upgrade-drill проверяет путь от предыдущей Alembic-ревизии к текущему head и сохранность контрольных данных:
```bash
./deploy/test-release-upgrade.sh
```
По умолчанию временно используются только loopback-порты `14321` и `18000`; PostgreSQL и MinIO наружу не публикуются. Контур и volumes удаляются после проверки. Drill успешно пройден 6 сентября 2026 года.
Одноразовый `migrate` применяет Alembic до rollout API; при ошибке новый runtime не запускается. API при старте выполняет только идемпотентный seed: в production он добавляет минимальные справочники и точки, а демонстрационные уловы жёстко отключены `SEED_DEMO_DATA=false`.
+40
View File
@@ -0,0 +1,40 @@
#!/bin/sh
set -eu
repo=$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)
cd "$repo"
project="rf4-upgrade-$$"
export COMPOSE_PROJECT_NAME="$project"
export POSTGRES_PASSWORD=upgrade-drill-postgres-password
export DATABASE_URL=postgresql+psycopg://rf4:upgrade-drill-postgres-password@db:5432/rf4_spotter
compose="docker compose --env-file .env.production.example -f compose.production.yaml"
previous_revision=48094a7d1b92
head_revision=20260910_recovery
probe_id=00000000-0000-0000-0000-000000000099
cleanup() {
status=$?
if [ "$status" -ne 0 ]; then
$compose ps >&2 || true
$compose logs --no-color db migrate >&2 || true
fi
$compose down --volumes --remove-orphans >/dev/null 2>&1 || true
}
trap cleanup EXIT INT TERM
$compose up --build -d --wait db
$compose run --rm migrate alembic upgrade "$previous_revision"
$compose exec -T db psql -v ON_ERROR_STOP=1 -U rf4 -d rf4_spotter -c \
"insert into fish(id,slug,name_ru,trophy_weight_g) values ('$probe_id','upgrade-probe','Проверка обновления',1234)" >/dev/null
$compose run --rm migrate
db_revision=$($compose exec -T db psql -At -U rf4 -d rf4_spotter -c 'select version_num from alembic_version')
probe_count=$($compose exec -T db psql -At -U rf4 -d rf4_spotter -c "select count(*) from fish where id='$probe_id' and slug='upgrade-probe' and trophy_weight_g=1234")
recovery_columns=$($compose exec -T db psql -At -U rf4 -d rf4_spotter -c "select count(*) from information_schema.columns where table_schema='public' and ((table_name='submission_attempt' and column_name in ('idempotency_key','catch_report_id','payload_hash')) or (table_name='import_record_event' and column_name in ('changes','provenance')))")
test "$db_revision" = "$head_revision"
test "$probe_count" = "1"
test "$recovery_columns" = "5"
printf 'Release upgrade passed: %s -> %s, control data preserved\n' "$previous_revision" "$head_revision"