# Интеграционные проверки SQL на настоящем PostgreSQL + pgvector: миграции вверх / вниз / вверх, # запросы сканера, отпечатков, шаблонов и очереди, сквозной сценарий пользователя через HTTP (Go), # загрузка каталога, профиля и обучение ALS (Python). name: ci / db on: workflow_dispatch: # перезапуск вручную (например, после чистки раннера) push: branches: [main] paths: - 'services/api/**' - 'services/recommender/**' - '.gitea/workflows/ci-db.yml' pull_request: paths: - 'services/api/**' - 'services/recommender/**' - '.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 MUSICBRAINZ_ENABLED: "false" steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: { go-version: "1.24", cache-dependency-path: services/api/go.sum } # Контейнеры сервисов стартуют параллельно с job: без ожидания тесты иногда не находят даже DNS-имя postgres. - name: Место на раннере и готовность Postgres, Redis, Meilisearch run: | # Диск раннера общий с контейнерами сервисов: при нехватке места Postgres падает посреди тестов. free=$(df -Pm / | awk 'NR==2 {print $4}') echo "свободно на раннере: ${free} МБ" [ "$free" -ge 2048 ] || { echo "на раннере меньше 2 ГБ — почистите: docker system prune -af" >&2; exit 1; } for svc in postgres:5432 redis:6379 meilisearch:7700; do host=${svc%:*}; port=${svc#*:} for i in $(seq 1 60); do if getent hosts "$host" >/dev/null && timeout 2 bash -c "/dev/null; then echo "$svc готов"; break fi [ "$i" = 60 ] && { echo "$svc не поднялся за 2 минуты" >&2; exit 1; } sleep 2 done done - name: Go — миграции и запросы store working-directory: services/api # These suites share one database; dbtest also rolls all migrations down # and cleans orphan catalog rows. Do not run the packages concurrently. run: go test -p 1 -tags integration -count=1 -v ./internal/dbtest/ ./internal/social/ ./internal/uploads/ - name: Go — релевантность поиска на Meilisearch working-directory: services/api run: go test -tags integration -count=1 -v ./internal/search/ - 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