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 сейчас красный по 25 файлам (F14), и это не должно # маскировать статус 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 # 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}" .