krona-staff/.forgejo/workflows/ci.yml
grok fc20f75b55 test(e2e): evidence прогонов вне git, в CI — артефакт
Зачем: 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.
2026-09-26 15:20:28 +07:00

114 lines
5.4 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}" .