Зачем: tests/e2e/evidence/ перезаписывается каждым прогоном (логи серверов с ULID и портами, JSON vitest), поэтому любой запуск стенда менял отслеживаемые файлы и засорял дифф (приёмка владельца, TASK-GROK-2 п.1). Что: tests/e2e/evidence/ убран из индекса (git rm --cached) и добавлен в корневой .gitignore (его же читает prettier, поэтому форматировать сгенерированные файлы больше не нужно — вызов prettier из run-e2e убран). В CI задача e2e выгружает папку артефактом e2e-evidence (actions/upload-artifact, закреплён SHA v4.6.2; Forgejo 9.0.3 поддерживает v4). Разовые доказательства, которые скрипты не перезаписывают (N5 до/после, замер N13), перенесены в tests/e2e/report-evidence/ — на них ссылается REPORT.md.
114 lines
5.4 KiB
YAML
114 lines
5.4 KiB
YAML
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
|
||
|
||
# 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}" .
|