diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 3ee3473..f650d3b 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -2,6 +2,16 @@ # для .NET (Automatic Analysis язык не поддерживает) — begin → build → test → end. # Результат уезжает на sonarcloud.io. Секрет SONAR_TOKEN секретам форков не виден, # поэтому анализ гоняем на push в main и вручную, а не на PR из форков. +# +# sonar.coverage.exclusions — из ИЗМЕРЕНИЯ покрытия исключены края, которые мы намеренно +# не покрываем юнитами (политика из CLAUDE.md: чистую логику тестируем, UI и железо — глазами): +# UI/WinForms, системная интеграция, точка входа, tools и два файла живого WMI — +# MifsClient/MifsEventWatcher (они дёргают ManagementObject, без ноутбука не выполняются; +# логика над ними тестируется через шов IMifsClient на фейках). Mifs.cs НЕ исключён: +# это чистые таблицы и маппинги, они покрыты тестами и должны такими оставаться. +# На статический анализ (баги, smells, уязвимости) исключение не влияет — только на coverage. +# Важно: Quality Gate «Sonar way» требует ≥80% покрытия нового кода, а свой гейт на бесплатном +# тарифе не завести (Team/Enterprise) — поэтому измеряем только то, что реально тестируем. name: sonarcloud on: @@ -43,7 +53,7 @@ jobs: /d:sonar.token="$env:SONAR_TOKEN" /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" /d:sonar.scanner.scanAll=false - /d:sonar.coverage.exclusions="src/Ui/**,src/SystemIntegration/**,src/Program.cs,tools/**" + /d:sonar.coverage.exclusions="src/Ui/**,src/SystemIntegration/**,src/Wmi/MifsClient.cs,src/Wmi/MifsEventWatcher.cs,src/Program.cs,tools/**" - name: Build run: dotnet build XiControl.sln -c Release diff --git a/CLAUDE.md b/CLAUDE.md index 416c638..190fbd4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -216,6 +216,13 @@ WMI-событий). `Program.cs`: single-instance mutex → DI-контейне - Тег с суффиксом через дефис (`v0.7.0-pre`) помечается pre-release и winget **не** трогает. - Каждый push в `main` собирает скользящий pre-release под тегом `pre` — всегда свежий билд из main; winget его не видит (слушает только `release: [released]`). +- **SonarCloud** (`.github/workflows/sonar.yml`, только push в `main`): бесплатный тариф даёт лишь + встроенный Quality Gate «Sonar way» — свой не завести (Team/Enterprise), а он требует **≥80% + покрытия нового кода**. Поэтому из ИЗМЕРЕНИЯ покрытия (`sonar.coverage.exclusions`) исключены + края, которые мы намеренно не покрываем юнитами: `src/Ui/**`, `src/SystemIntegration/**`, + `Program.cs`, `tools/**` и живой WMI — `MifsClient.cs`/`MifsEventWatcher.cs`. Чистая логика + (`Mifs.cs`, конфиг, guard-ы, роутер) измеряется и должна оставаться покрытой. Добавляешь новый + файл с живым железом — впиши его в исключения, иначе гейт покраснеет на ровном месте. - Локальная сборка помечается версией `0.0.0-dev` (дев-дефолт в `XiControl.csproj`, суффикс виден в AboutTab); реальную версию подставляет CI из тега: `publish -p:Version=X.Y.Z`.