ci(coverage): exclude generated EF migrations to stop coverage OOM (exit 137)
Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 7s
Build ErsatzTV Image / decisions.md append-only (pull_request) Successful in 8s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 4m26s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 16s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 17s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 6m5s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
Build ErsatzTV Image / Functional E2E (curl contracts) (pull_request) Successful in 3m46s
Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 7s
Build ErsatzTV Image / decisions.md append-only (pull_request) Successful in 8s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 4m26s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 16s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 17s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 6m5s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
Build ErsatzTV Image / Functional E2E (curl contracts) (pull_request) Successful in 3m46s
The shared Build & test job OOM-killed (exit 137) with coverage enabled: the whole-solution Architecture.Tests process instruments both EF migration folders (~2.59M generated lines vs ~200k authored), ballooning coverlet's in-memory hit-count arrays past the runner's limit. Add coverlet.runsettings excluding **/Migrations/*.cs (+ generated/compiler attributes) and pass it via --settings on the Test step. This cuts the instrumented surface ~126x (2,510,185 -> 19,963 coverable lines in the Architecture.Tests process, verified locally) and makes the reported percentage reflect authored code. Documented in docs/ci-cd.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -103,7 +103,7 @@ jobs:
|
|||||||
- name: Test
|
- name: Test
|
||||||
run: >-
|
run: >-
|
||||||
dotnet test --configuration Release --no-build --blame-hang-timeout "2m" --verbosity normal
|
dotnet test --configuration Release --no-build --blame-hang-timeout "2m" --verbosity normal
|
||||||
--collect:"XPlat Code Coverage" --results-directory ./coverage
|
--collect:"XPlat Code Coverage" --settings coverlet.runsettings --results-directory ./coverage
|
||||||
|
|
||||||
# Coverage reporting (ersatztv#15 scope item 4): coverlet.collector emits a Cobertura report
|
# Coverage reporting (ersatztv#15 scope item 4): coverlet.collector emits a Cobertura report
|
||||||
# per test project (via --collect above); ReportGenerator merges them into a human-readable
|
# per test project (via --collect above); ReportGenerator merges them into a human-readable
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Coverage collector config (ersatztv#15). Passed to dotnet test via
|
||||||
|
"settings coverlet.runsettings" alongside collect:"XPlat Code Coverage".
|
||||||
|
The two EF Core migration folders are ~2.59M lines of generated snapshot code
|
||||||
|
(vs ~200k lines of authored code); instrumenting them balloons coverlet memory
|
||||||
|
and OOM killed the shared Build and test job (exit 137). Excluding generated
|
||||||
|
migration code bounds memory and makes the reported percentage reflect authored
|
||||||
|
code. Keep this comment free of double hyphens (invalid in XML comments).
|
||||||
|
-->
|
||||||
|
<RunSettings>
|
||||||
|
<DataCollectionRunSettings>
|
||||||
|
<DataCollectors>
|
||||||
|
<DataCollector friendlyName="XPlat Code Coverage">
|
||||||
|
<Configuration>
|
||||||
|
<ExcludeByFile>**/Migrations/*.cs</ExcludeByFile>
|
||||||
|
<ExcludeByAttribute>GeneratedCodeAttribute,CompilerGeneratedAttribute,ExcludeFromCodeCoverageAttribute</ExcludeByAttribute>
|
||||||
|
<Exclude>[*]*.Migrations.*</Exclude>
|
||||||
|
<SkipAutoProps>true</SkipAutoProps>
|
||||||
|
</Configuration>
|
||||||
|
</DataCollector>
|
||||||
|
</DataCollectors>
|
||||||
|
</DataCollectionRunSettings>
|
||||||
|
</RunSettings>
|
||||||
+11
-5
@@ -96,11 +96,17 @@ Docker build) → `dotnet build -c Release` → `dotnet test -c Release --no-bui
|
|||||||
the image build.
|
the image build.
|
||||||
|
|
||||||
- **Code coverage** (ersatztv#15): `dotnet test` runs with `--collect:"XPlat Code Coverage"
|
- **Code coverage** (ersatztv#15): `dotnet test` runs with `--collect:"XPlat Code Coverage"
|
||||||
--results-directory ./coverage`, so `coverlet.collector` (referenced by every `*.Tests`
|
--settings coverlet.runsettings --results-directory ./coverage`, so `coverlet.collector`
|
||||||
project) emits a Cobertura report per project. A follow-up **Coverage summary** step merges
|
(referenced by every `*.Tests` project) emits a Cobertura report per project. A follow-up
|
||||||
them with ReportGenerator (`TextSummary` to the log, `MarkdownSummaryGithub` to the job step
|
**Coverage summary** step merges them with ReportGenerator (`TextSummary` to the log,
|
||||||
summary). No floor is enforced yet ("decide on a floor later" — #15); the step is
|
`MarkdownSummaryGithub` to the job step summary). No floor is enforced yet ("decide on a
|
||||||
`continue-on-error: true`, so a missing report or a transient tool install never blocks a build.
|
floor later" — #15); the step is `continue-on-error: true`, so a missing report or a
|
||||||
|
transient tool install never blocks a build.
|
||||||
|
- **`coverlet.runsettings` excludes generated EF migration code** (`**/Migrations/*.cs`,
|
||||||
|
~2.59M generated lines vs ~200k authored). Instrumenting it OOM-killed the shared `test`
|
||||||
|
job (exit 137); excluding it cuts the instrumented surface ~126× (2.5M→20k coverable
|
||||||
|
lines in the whole-solution `Architecture.Tests` process) and makes the percentage reflect
|
||||||
|
authored code.
|
||||||
- **Shallow checkout**: `fetch-depth: 1` (ersatztv#190) — this job never runs `git
|
- **Shallow checkout**: `fetch-depth: 1` (ersatztv#190) — this job never runs `git
|
||||||
describe`/`git log`, only `build` needs full history/tags for version computation, so
|
describe`/`git log`, only `build` needs full history/tags for version computation, so
|
||||||
`test` and `migrations` both check out shallow. `build`'s checkout stays `fetch-depth: 0`.
|
`test` and `migrations` both check out shallow. `build`'s checkout stays `fetch-depth: 0`.
|
||||||
|
|||||||
Reference in New Issue
Block a user