From 2976856760bd153048d527b40efa6ab0cf08a524 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 8 Sep 2026 20:10:00 +0300 Subject: [PATCH] =?UTF-8?q?:white=5Fcheck=5Fmark:=20fix(scripts):=20check.?= =?UTF-8?q?ps1=20=D0=B4=D0=B5=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=8F=D0=B5=D1=82,=20=D0=B0=20=D0=BD=D0=B5=20=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=B5=D1=82=20=D0=B2=D0=B8=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Скрипт был зелёным всегда. `$ErrorActionPreference = "Stop"` не влияет на код возврата нативных команд, поэтому упавший pytest проходил как успех: проверено на живом примере — прежняя схема при команде с кодом 3 доходила до конца и возвращала 0. Теперь каждый шаг сверяется с $LASTEXITCODE, провалившиеся перечисляются в конце, скрипт выходит с 1. Кроме этого: - явные `-f compose.yaml -f compose.dev.yaml`: сервисы frontend и web-chat (node) существуют только в dev-оверлее, в базовом compose frontend — production-образ nginx, где нет npm. Голый `docker compose` три шага из четырёх выполнить не мог в принципе; - добавлены CLI-тесты и e2e — раньше их не было ни в одном скрипте; - порядок от быстрых проверок к длинным: typecheck, vitest, CLI, e2e, backend (~20 минут). Дешёвые ошибки всплывают за секунды; - скрипт не останавливается на первом падении: прогоняет всё и показывает список провалов, иначе каждая ошибка стоила бы отдельного круга. playwright.config.ts: `webServer` поднимал только internal-ui на :5173, а проект web-chat-mobile ходит на :5175 — без заранее поднятого dev-стека прогон падал. Описаны оба сервера, e2e стали самодостаточными; без этого включать их в check.ps1 не имело смысла. Проверка: полный прогон скрипта — 6 шагов, все зелёные, exit code 0 (typecheck ×2, vitest 76, CLI 9, e2e 8, backend 624). Co-Authored-By: Claude Opus 5 --- playwright.config.ts | 22 +++++++++++++----- scripts/check.ps1 | 54 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/playwright.config.ts b/playwright.config.ts index b371f9a..00de701 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -8,12 +8,22 @@ export default defineConfig({ use: { trace: "on-first-retry", }, - webServer: { - command: "npm --workspace @chatballs/internal-ui run dev", - url: "http://localhost:5173", - reuseExistingServer: true, - timeout: 120_000, - }, + // Оба проекта должны подниматься сами: web-chat-mobile ходит на :5175, и без + // второго сервера прогон падал везде, где dev-стек не был поднят заранее. + webServer: [ + { + command: "npm --workspace @chatballs/internal-ui run dev", + url: "http://localhost:5173", + reuseExistingServer: true, + timeout: 120_000, + }, + { + command: "npm --workspace @chatballs/web-chat run dev", + url: "http://localhost:5175", + reuseExistingServer: true, + timeout: 120_000, + }, + ], projects: [ { name: "internal-ui", diff --git a/scripts/check.ps1 b/scripts/check.ps1 index 456aff3..22ac329 100644 --- a/scripts/check.ps1 +++ b/scripts/check.ps1 @@ -1,6 +1,52 @@ +# Полная проверка репозитория Chatballs (Windows). +# +# Запускается из любого каталога: скрипт сам переходит в корень code/chatballs. +# +# Два места, где прежняя редакция скрипта молча врала: +# 1) голый `docker compose` читает только compose.yaml, а сервисы frontend и +# web-chat (node) существуют лишь в dev-оверлее — в базовом compose +# frontend это production-образ nginx, где нет npm; +# 2) $ErrorActionPreference не останавливает скрипт на ненулевом коде +# возврата нативных команд, поэтому падение тестов проходило как успех. +# Каждый шаг проверяется явно по $LASTEXITCODE. +# +# Требуется один раз: npx playwright install chromium. $ErrorActionPreference = "Stop" -docker compose run --rm backend-app pytest -docker compose run --rm frontend npm run test -docker compose run --rm frontend npm run typecheck -docker compose run --rm web-chat npm run typecheck +Set-Location (Join-Path $PSScriptRoot "..") + +$compose = "compose", "-f", "compose.yaml", "-f", "compose.dev.yaml" +$failed = @() + +function Invoke-Step { + param( + [Parameter(Mandatory = $true)][string] $Name, + [Parameter(Mandatory = $true)][scriptblock] $Body + ) + Write-Host "" + Write-Host "==> $Name" -ForegroundColor Cyan + & $Body + if ($LASTEXITCODE -ne 0) { + $script:failed += $Name + Write-Host "!!! $Name — код возврата $LASTEXITCODE" -ForegroundColor Red + } +} + +# Сначала быстрые проверки, затем длинные: backend-сьют идёт около 20 минут. +Invoke-Step "internal-ui · typecheck" { docker @compose run --rm --no-deps frontend npm run typecheck } +Invoke-Step "web-chat · typecheck" { docker @compose run --rm --no-deps web-chat npm run typecheck } +Invoke-Step "internal-ui · vitest" { docker @compose run --rm --no-deps frontend npm run test } +Invoke-Step "deployment CLI · pytest" { python -m pytest -q tests/cli } +# Playwright сам поднимает нужные dev-серверы (webServer в playwright.config.ts). +Invoke-Step "e2e · playwright" { npx playwright test } +# backend-app сам поднимает postgres, redis и миграции через сервис init. +Invoke-Step "backend · pytest" { docker @compose run --rm backend-app pytest -q } + +Write-Host "" +if ($failed.Count -gt 0) { + Write-Host "Провалено шагов: $($failed.Count)" -ForegroundColor Red + $failed | ForEach-Object { Write-Host " - $_" -ForegroundColor Red } + exit 1 +} + +Write-Host "Все проверки пройдены." -ForegroundColor Green