Зачем: прежний CI запускал миграции и тесты под POSTGRES_USER сервиса (суперпользователь), не проверял откат миграций, не запускал e2e на реальной БД, держал плавающие теги actions (F13) и выполнял docker build в контейнере без Docker daemon. - verify: bootstrap-админ сервиса только создаёт роли (provision-pg.mjs, пароли случайные); миграции up -> откат всех -> up -> up (no-op) ролью krona_migrator без SUPERUSER; `npm run check` с DATABASE_TEST_URL (app-роль) и DATABASE_TEST_MIGRATION_URL (очистка, см. N5); npm audit. - format: prettier вынесен в отдельную задачу — он красный по 25 файлам (F14) и не должен маскировать статус verify/e2e. - e2e: реальный сервер + PostgreSQL 17 через scripts/test/run-e2e.mjs. Выбран «храповик» known-defects.json, а не отдельная задача с continue-on-error: так CI зелёный, только если стенд работает и каждый красный сценарий — известный открытый дефект; новый красный сценарий (регрессия) или исправленный, но не вычеркнутый дефект делают задачу красной. continue-on-error скрыл бы и поломку самого стенда. - docker-build: отдельная задача на метке `docker-host` только для push, после verify; без такого раннера она ждёт в очереди, не блокируя остальные. - actions/checkout v4.4.0 и actions/setup-node v4.4.0 закреплены SHA (git ls-remote; одинаковы на github.com и code.forgejo.org). Проверено: actionlint 1.7.12 (метки docker/docker-host объявлены как self-hosted) — 0 замечаний; scripts/test/ci-local.sh повторяет шаги verify/format/e2e на локальной PostgreSQL 17.11 (Forgejo-раннер реально не запускался — не проверено).
30 lines
1.3 KiB
Bash
Executable file
30 lines
1.3 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Локальный эквивалент задач verify/format/e2e из .forgejo/workflows/ci.yml
|
|
# (без Docker: PostgreSQL 17 уже запущен, E2E_PG_ADMIN_URL указывает на bootstrap-админа).
|
|
# docker-build локально не воспроизводится: Docker в этой среде нет.
|
|
set -uo pipefail
|
|
cd "$(dirname "$0")/../.."
|
|
: "${E2E_PG_ADMIN_URL:?E2E_PG_ADMIN_URL (bootstrap-админ PostgreSQL 17) обязателен}"
|
|
tmp="$(mktemp -d)"
|
|
trap 'rm -rf "$tmp"' EXIT
|
|
status=0
|
|
step() {
|
|
local name="$1"
|
|
shift
|
|
echo "::: [$name] $*"
|
|
if "$@"; then echo "::: [$name] OK"; else local code=$?; echo "::: [$name] FAIL exit=$code"; status=1; fi
|
|
}
|
|
with_db_env() { (set -a; . "$tmp/db.env"; set +a; unset DATABASE_URL POSTGRES_APP_PASSWORD; "$@"); }
|
|
|
|
echo "=== job verify"
|
|
step npm-ci npm ci --no-audit --no-fund
|
|
step provision node scripts/test/provision-pg.mjs --out "$tmp/db.env" --db krona_staff
|
|
step migrate-roundtrip with_db_env node scripts/test/migrate-roundtrip.mjs roundtrip
|
|
step check with_db_env npm run check
|
|
step audit npm audit --audit-level=high
|
|
echo "=== job format"
|
|
step format-check npm run format:check
|
|
echo "=== job e2e"
|
|
step e2e env E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs
|
|
echo "=== итог: status=$status"
|
|
exit $status
|