krona-staff/.forgejo/workflows/ci.yml
grok 27499da191 ci: задача windows, включаемая переменной, когда появится раннер
Зачем: владелец требует проверку запуска стенда на Windows 11, но
Windows-раннера у git.ochenstarik.ru сейчас нет. Задача без подходящего
раннера висела бы в очереди и держала статус прогона «в ожидании»,
поэтому она выключена по умолчанию и включается переменной репозитория
KRONA_WINDOWS_RUNNER=true.

Что: npm ci, тест запуска без .cmd-обёрток (node vitest.mjs, без npx),
а при заданном секрете WINDOWS_E2E_PG_ADMIN_URL — полный run-e2e с
выгрузкой evidence артефактом. actionlint (метки docker, docker-host,
windows) — 0 замечаний. Сама задача ни разу не запускалась — не проверено.
2026-09-26 15:20:47 +07:00

144 lines
7.1 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
# 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}" .