name: ci on: push: branches: [main, codex/bootstrap-platform-foundation] pull_request: # Все actions закреплены полным SHA коммита (F13); SHA получены `git ls-remote` # и совпадают на github.com и code.forgejo.org (зеркало), поэтому закрепление # работает при любом DEFAULT_ACTIONS_URL раннера. # # Роли БД как в pilot, но с минимальными привилегиями: POSTGRES_USER сервиса — # только bootstrap-админ (роль DBA/entrypoint образа), им scripts/test/provision-pg.mjs # создаёт krona_migrator (NOSUPERUSER, владелец БД) и krona_staff_app (NOBYPASSRLS) # со случайными паролями. Ни миграции, ни тесты, ни сервер под bootstrap-админом не работают. jobs: verify: runs-on: docker services: postgres: image: postgres:17-alpine@sha256:18cfe3ef5e6815560c98237d6216d1e5119702fb0f3894c8785dd58b8bbe5d73 env: POSTGRES_DB: postgres POSTGRES_USER: ci_bootstrap POSTGRES_PASSWORD: ci-bootstrap-only options: >- --health-cmd "pg_isready -U ci_bootstrap -d postgres" --health-interval 5s --health-timeout 3s --health-retries 20 env: E2E_PG_ADMIN_URL: postgres://ci_bootstrap:ci-bootstrap-only@postgres:5432/postgres steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: { node-version: 22, cache: npm } - run: npm ci - name: provision roles (migrator NOSUPERUSER, app NOBYPASSRLS) run: node scripts/test/provision-pg.mjs --out "$RUNNER_TEMP/db.env" --db krona_staff - name: migrations up -> rollback all -> up -> up (no-op) run: | set -a; . "$RUNNER_TEMP/db.env"; set +a node scripts/test/migrate-roundtrip.mjs roundtrip - name: npm run check (tenant-isolation on real PostgreSQL as app role) run: | set -a; . "$RUNNER_TEMP/db.env"; set +a unset DATABASE_URL POSTGRES_APP_PASSWORD npm run check - run: npm audit --audit-level=high # Отдельная задача: prettier сейчас красный по 23 файлам (F14; замер 2026-09-26), и это не должно # маскировать статус verify/e2e. format: runs-on: docker steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: { node-version: 22, cache: npm } - run: npm ci - run: npm run format:check # Приёмочные сценарии на реальном сервере и PostgreSQL 17. Красные сценарии # известных открытых дефектов перечислены в tests/e2e/known-defects.json: # задача зелёная, если стенд работает ([HARNESS]/[CTRL] зелёные) и каждый # красный сценарий есть в списке; новый красный сценарий или исправленный, # но не вычеркнутый дефект делают задачу красной. e2e: runs-on: docker services: postgres: image: postgres:17-alpine@sha256:18cfe3ef5e6815560c98237d6216d1e5119702fb0f3894c8785dd58b8bbe5d73 env: POSTGRES_DB: postgres POSTGRES_USER: ci_bootstrap POSTGRES_PASSWORD: ci-bootstrap-only options: >- --health-cmd "pg_isready -U ci_bootstrap -d postgres" --health-interval 5s --health-timeout 3s --health-retries 20 env: E2E_PG_ADMIN_URL: postgres://ci_bootstrap:ci-bootstrap-only@postgres:5432/postgres E2E_MIGRATIONS: roundtrip steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: { node-version: 22, cache: npm } - run: npm ci - name: e2e (known-defects ratchet) run: node scripts/test/run-e2e.mjs - name: e2e table if: always() run: cat tests/e2e/evidence/e2e-table.md || true # tests/e2e/evidence/ в .gitignore: полный вывод vitest, JSON, логи серверов — # артефакт прогона, а не файлы репозитория (TASK-GROK-2 п.1). - name: upload e2e evidence if: always() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: e2e-evidence path: tests/e2e/evidence/ retention-days: 14 if-no-files-found: warn # Windows 11 (проект разрабатывается под Windows). Windows-раннера у сервера пока # НЕТ, поэтому задача включается только переменной репозитория # KRONA_WINDOWS_RUNNER=true (иначе пропускается и не висит в очереди). # Раннер: forgejo-runner в режиме host с меткой `windows`, Node 22+. # e2e на Windows идёт, только если задан секрет WINDOWS_E2E_PG_ADMIN_URL # (bootstrap-админ локальной PostgreSQL 17 на раннере). НЕ ПРОВЕРЕНО: не запускалась. windows: if: vars.KRONA_WINDOWS_RUNNER == 'true' runs-on: windows env: E2E_PG_ADMIN_URL: ${{ secrets.WINDOWS_E2E_PG_ADMIN_URL }} steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: { node-version: 22, cache: npm } - run: npm ci - name: spawn without .cmd wrappers run: node node_modules/vitest/vitest.mjs run tests/e2e/harness/node-commands.test.ts - name: e2e on Windows (needs local PostgreSQL 17) if: env.E2E_PG_ADMIN_URL != '' run: node scripts/test/run-e2e.mjs - name: upload Windows e2e evidence if: always() && env.E2E_PG_ADMIN_URL != '' uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: e2e-evidence-windows path: tests/e2e/evidence/ retention-days: 14 if-no-files-found: warn # docker build требует Docker daemon, которого нет в контейнере метки `docker`. # Нужен раннер с меткой `docker-host` (хост с доступом к Docker). Пока такого # раннера нет, задача ждёт в очереди и не блокирует verify/format/e2e. docker-build: runs-on: docker-host needs: [verify] if: github.event_name == 'push' steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - run: docker build -t "krona-staff:${GITHUB_SHA}" .