From 042407f03ed935d26576cbd31dbaaca0e24d8a84 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Thu, 15 Oct 2026 22:14:14 +0700 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B8=D1=82=D1=8C=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BA=20=D0=B1=D0=B0=D0=B7=D0=B5=20=D0=B2=20=D1=81=D0=B5=D1=82?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/docker.yml | 37 ++++++++++++++++++++++++++++++++----- backend/src/test/pg.ts | 1 + docs/ux-ui-progress.md | 6 ++++++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/.gitea/workflows/docker.yml b/.gitea/workflows/docker.yml index f9017341..65fadfa3 100644 --- a/.gitea/workflows/docker.yml +++ b/.gitea/workflows/docker.yml @@ -57,16 +57,31 @@ jobs: run: | set -euo pipefail NAME="mm-pg-${{ gitea.run_id }}-${{ gitea.run_attempt }}" - docker rm -f "$NAME" mm-pg 2>/dev/null || true - HOST_PORT=$(python3 -c 'import socket; s=socket.socket(); s.bind(("127.0.0.1", 0)); print(s.getsockname()[1]); s.close()') + docker rm -f "$NAME" 2>/dev/null || true + # Docker-backed Gitea runners execute this step in a separate container. + # Join its network; a published host loopback port is not reachable here. + NETWORKS=$(docker inspect --format '{{range $name, $network := .NetworkSettings.Networks}}{{println $name}}{{end}}' "$(cat /etc/hostname)" 2>/dev/null || true) + if [ -n "$NETWORKS" ]; then + test "$(printf '%s\n' "$NETWORKS" | wc -l)" -eq 1 + NETWORK_ARGS=(--network "$NETWORKS" --network-alias "$NAME") + PG_HOST="$NAME" + PG_PORT=5432 + else + # Host-based runners can use a Docker-assigned ephemeral host port. + NETWORK_ARGS=(-p 127.0.0.1::5432) + PG_HOST=127.0.0.1 + fi docker run -d --name "$NAME" --rm \ -e POSTGRES_USER=mmapp \ -e POSTGRES_PASSWORD=mmapp \ -e POSTGRES_DB=mmapp \ - -p "127.0.0.1:${HOST_PORT}:5432" \ + "${NETWORK_ARGS[@]}" \ postgres:18-alpine echo "PG_CONTAINER=$NAME" >> "${GITHUB_ENV}" - echo "DATABASE_URL=postgres://mmapp:mmapp@127.0.0.1:${HOST_PORT}/mmapp" >> "${GITHUB_ENV}" + if [ "$PG_HOST" = 127.0.0.1 ]; then + PG_PORT=$(docker port "$NAME" 5432/tcp | awk -F: '{print $NF}') + fi + echo "DATABASE_URL=postgres://mmapp:mmapp@${PG_HOST}:${PG_PORT}/mmapp" >> "${GITHUB_ENV}" for i in $(seq 1 40); do if docker exec "$NAME" pg_isready -U mmapp -d mmapp; then exit 0 @@ -79,15 +94,27 @@ jobs: - name: Install and test backend shell: bash + env: + REQUIRE_TEST_POSTGRES: "1" run: | set -euo pipefail npm ci + node --input-type=module <<'NODE' + import pg from 'pg'; + const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL, connectionTimeoutMillis: 8000 }); + try { + await pool.query('SELECT 1'); + console.log('PostgreSQL reachable from the test process'); + } finally { + await pool.end(); + } + NODE npm run test --prefix backend - name: Stop PostgreSQL if: always() shell: bash - run: docker rm -f "${PG_CONTAINER:-}" mm-pg 2>/dev/null || true + run: docker rm -f "${PG_CONTAINER:-}" 2>/dev/null || true backend-image: needs: diff --git a/backend/src/test/pg.ts b/backend/src/test/pg.ts index c3df76c5..91d6add5 100644 --- a/backend/src/test/pg.ts +++ b/backend/src/test/pg.ts @@ -10,6 +10,7 @@ export function withPgOrSkip(): Promise { await initDatabase() return true } catch (err) { + if (process.env.REQUIRE_TEST_POSTGRES === "1") throw err console.warn( "skip: PostgreSQL недоступен", err instanceof Error ? err.message : err, diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 1317fe51..3151525a 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -38,6 +38,12 @@ | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Завершён2026-10-15 в границах предоставленного стенда:1396 UI/221 context,120 live states30 экранов, production builds/ReUI checklist и реальные интеграции. Ограничения — в [акте](ux-ui-acceptance-candidate.md); production-выпуск не выполнялся. | +## Production267 — подключение PostgreSQL в CI (2026-10-15) + +После push main backend-test2466/8410 завершился ECONNREFUSED: PostgreSQL публиковался на loopback Docker-хоста, но тестовый процесс работал в отдельном контейнере Gitea runner. Прежние SQL-тесты пропускали подключение; новый обязательный retention-тест выявил проблему. PostgreSQL теперь присоединяется к сети контейнера задания и доступен по уникальному DNS alias; для host runner сохранён вариант с назначенным Docker портом. Удаление общего mm-pg исключено, cleanup затрагивает только контейнер текущего запуска. Перед тестами выполняется SELECT1 из процесса задания; REQUIRE_TEST_POSTGRES=1 запрещает скрытый skip при недоступности/ошибке bootstrap. + +Workflow YAML/scoped ESLint/diff check прошли. Проверены оба режима helper на недоступном localhost-порту: локально false/skip, в обязательном режиме исходная ошибка подключения выходит наружу. Полная CI-проверка сети и SQL-профилей должна подтвердиться следующим запуском; успешный тест retention на реальном тестовом PostgreSQL описан в266. Production этим блоком напрямую не изменялся. + ## Production266 — online-индекс retention и проверка нагрузки (2026-10-15) После прямого разрешения владельца только на индекс и проверку нагрузки в14:55:45 UTC запущен CREATE INDEX CONCURRENTLY idx_scheduler_runs_finished_at ON public.scheduler_runs(finished_at). Завершён успешно, indisvalid/indisready=true. В15:01:30 UTC индекс23МБ,697 использований; план эквивалентного SELECT сменился с Parallel Seq Scan на Bitmap Index Scan. PostgreSQL CPU66,51% →0,16% →0,13%; секундные vmstat iowait29–34% →0–5% →0–1%, CPU idle0% →74–94% →94–97%. Наблюдения ограничены несколькими минутами обычной нагрузки и не доказывают устранение каждого тайм-аута RouterOS.