# Интеграционные проверки SQL на настоящем PostgreSQL + pgvector: миграции вверх / вниз / вверх, # запросы сканера, отпечатков, шаблонов и очереди, сквозной сценарий пользователя через HTTP (Go), # загрузка каталога, профиля и обучение ALS (Python). name: ci / db on: workflow_dispatch: # перезапуск вручную (например, после чистки раннера) push: branches: [main] paths: - 'services/api/**' - 'services/recommender/**' - 'deploy/backup.sh' - '.gitea/workflows/ci-db.yml' pull_request: paths: - 'services/api/**' - 'services/recommender/**' - 'deploy/backup.sh' - '.gitea/workflows/ci-db.yml' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: db: runs-on: ubuntu-latest services: postgres: image: pgvector/pgvector:0.8.7-pg17 env: POSTGRES_USER: pipu POSTGRES_PASSWORD: pipu POSTGRES_DB: pipu options: >- --health-cmd "pg_isready -U pipu" --health-interval 5s --health-timeout 5s --health-retries 20 redis: image: redis:7.4-alpine meilisearch: image: getmeili/meilisearch:v1.11 env: MEILI_MASTER_KEY: ci-master-key-0123456789 MEILI_ENV: development env: TEST_DATABASE_URL: postgres://pipu:pipu@postgres:5432/pipu?sslmode=disable TEST_REDIS_URL: redis://redis:6379/0 TEST_MEILI_URL: http://meilisearch:7700 TEST_MEILI_KEY: ci-master-key-0123456789 steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: { go-version: "1.24", cache-dependency-path: services/api/go.sum } - name: Go — миграции и запросы store working-directory: services/api run: go test -tags integration -count=1 -v ./internal/dbtest/ - name: Go — сквозной сценарий пользователя (newApp на Postgres, Redis, Meilisearch) working-directory: services/api run: go test -tags integration -count=1 -v -run TestUserJourney ./cmd/api/ - uses: astral-sh/setup-uv@v6 with: { version: "0.10.2", enable-cache: true, cache-dependency-glob: services/recommender/uv.lock } - name: Python — каталог, профиль, обучение ALS working-directory: services/recommender run: | uv sync --frozen uv run pytest -q tests/test_db_integration.py # База уже наполнена сценариями выше — проверяем настоящий цикл копия → проверка → восстановление. - name: Бэкап, проверка и восстановление (deploy/backup.sh) env: PGHOST: postgres PGUSER: pipu PGPASSWORD: pipu PGDATABASE: pipu BACKUP_DIR: /tmp/backups VERIFY_EXACT: "1" run: | SUDO=$(command -v sudo || true) $SUDO install -d /usr/share/postgresql-common/pgdg $SUDO curl -fsSLo /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc https://www.postgresql.org/media/keys/ACCC4CF8.asc echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(. /etc/os-release && echo "$VERSION_CODENAME")-pgdg main" | $SUDO tee /etc/apt/sources.list.d/pgdg.list >/dev/null $SUDO apt-get update -qq && $SUDO apt-get install -y -qq postgresql-client-17 >/dev/null export PATH=/usr/lib/postgresql/17/bin:$PATH before=$(psql -Atc "SELECT count(*) FROM tracks") file=$(bash deploy/backup.sh once) bash deploy/backup.sh verify "$file" bash deploy/backup.sh restore "$file" after=$(psql -Atc "SELECT count(*) FROM tracks") echo "tracks: $before → $after" test "$before" = "$after"