From d1f69b84f697a5b70137b562ce44d243e073cf7e Mon Sep 17 00:00:00 2001 From: Mike Clift Date: Tue, 19 Aug 2025 22:41:21 +0100 Subject: [PATCH 1/6] Add test coverage to CI build --- .../workflows/BuildAndTestOnPullRequests.yml | 33 +++++++++++++++++-- test/Stateless.Tests/Stateless.Tests.csproj | 1 + 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/.github/workflows/BuildAndTestOnPullRequests.yml b/.github/workflows/BuildAndTestOnPullRequests.yml index b995b1dc..0d74cbd8 100644 --- a/.github/workflows/BuildAndTestOnPullRequests.yml +++ b/.github/workflows/BuildAndTestOnPullRequests.yml @@ -18,9 +18,38 @@ jobs: - name: Build Stateless solution run: dotnet build Stateless.sln --configuration Release --no-restore - - name: Test Stateless - run: dotnet test --no-restore --no-build --configuration Release + - name: Test with coverage (xUnit, Cobertura) + run: | + dotnet test --configuration Release --collect:"XPlat Code Coverage" \ + -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=Cobertura + - name: Install ReportGenerator + run: dotnet tool install -g dotnet-reportgenerator-globaltool + + - name: Generate coverage report + run: | + reportgenerator -reports:"**/coverage.cobertura.xml" -targetdir:"coveragereport" -reporttypes:"MarkdownSummaryGithub;Html;Badges" + + - name: Append coverage to job summary + if: always() + run: | + $SUMMARY_FILE = "${{ github.workspace }}/coveragereport/SummaryGithub.md" + if (Test-Path $SUMMARY_FILE) { + Get-Content $SUMMARY_FILE | Add-Content $env:GITHUB_STEP_SUMMARY + } else { + "Coverage summary not found at $SUMMARY_FILE" | Add-Content $env:GITHUB_STEP_SUMMARY + } + + - name: Upload coverage artifact + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: coveragereport + if-no-files-found: warn + retention-days: 7 + + - name: Pack alpha version if: github.ref == 'refs/heads/dev' && github.event_name == 'push' && github.repository == 'dotnet-state-machine/stateless' run: dotnet pack src\Stateless\Stateless.csproj --version-suffix dev-${{github.run_id}} --configuration Release diff --git a/test/Stateless.Tests/Stateless.Tests.csproj b/test/Stateless.Tests/Stateless.Tests.csproj index 2eed06a8..2665f5f1 100644 --- a/test/Stateless.Tests/Stateless.Tests.csproj +++ b/test/Stateless.Tests/Stateless.Tests.csproj @@ -24,6 +24,7 @@ + From ec4b6bb641a18acc515f096d51108193aa514024 Mon Sep 17 00:00:00 2001 From: Mike Clift Date: Tue, 19 Aug 2025 22:46:55 +0100 Subject: [PATCH 2/6] Fix typo in YAML file --- .github/workflows/BuildAndTestOnPullRequests.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/BuildAndTestOnPullRequests.yml b/.github/workflows/BuildAndTestOnPullRequests.yml index 0d74cbd8..92bc2cd9 100644 --- a/.github/workflows/BuildAndTestOnPullRequests.yml +++ b/.github/workflows/BuildAndTestOnPullRequests.yml @@ -19,9 +19,7 @@ jobs: run: dotnet build Stateless.sln --configuration Release --no-restore - name: Test with coverage (xUnit, Cobertura) - run: | - dotnet test --configuration Release --collect:"XPlat Code Coverage" \ - -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=Cobertura + run: dotnet test --configuration Release --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=Cobertura - name: Install ReportGenerator run: dotnet tool install -g dotnet-reportgenerator-globaltool From 66072d7f8a8385ea50d88adc6c02015012446a1d Mon Sep 17 00:00:00 2001 From: Mike Clift Date: Fri, 22 Aug 2025 13:21:18 +0100 Subject: [PATCH 3/6] Use public signing to allow coverage analysis, then apply strong naming --- .github/workflows/BuildAndTestOnPullRequests.yml | 9 ++++++++- src/Stateless/Stateless.csproj | 2 +- test/Stateless.Tests/Stateless.Tests.csproj | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/BuildAndTestOnPullRequests.yml b/.github/workflows/BuildAndTestOnPullRequests.yml index 92bc2cd9..99d2ec1f 100644 --- a/.github/workflows/BuildAndTestOnPullRequests.yml +++ b/.github/workflows/BuildAndTestOnPullRequests.yml @@ -21,6 +21,14 @@ jobs: - name: Test with coverage (xUnit, Cobertura) run: dotnet test --configuration Release --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=Cobertura + - name: Re-sign assemblies with full strong name + run: | + # Re-sign all built assemblies with the private key + $assemblies = Get-ChildItem -Path "src\Stateless\bin\Release" -Filter "*.dll" -Recurse + foreach ($assembly in $assemblies) { + sn -R $assembly.FullName ../../asset/Stateless.snk + } + - name: Install ReportGenerator run: dotnet tool install -g dotnet-reportgenerator-globaltool @@ -46,7 +54,6 @@ jobs: path: coveragereport if-no-files-found: warn retention-days: 7 - - name: Pack alpha version if: github.ref == 'refs/heads/dev' && github.event_name == 'push' && github.repository == 'dotnet-state-machine/stateless' diff --git a/src/Stateless/Stateless.csproj b/src/Stateless/Stateless.csproj index 45044c03..12727e5d 100644 --- a/src/Stateless/Stateless.csproj +++ b/src/Stateless/Stateless.csproj @@ -14,7 +14,7 @@ true ../../asset/Stateless.snk true - true + true Stateless.png https://github.com/dotnet-state-machine/stateless false diff --git a/test/Stateless.Tests/Stateless.Tests.csproj b/test/Stateless.Tests/Stateless.Tests.csproj index 2665f5f1..e76ccfe8 100644 --- a/test/Stateless.Tests/Stateless.Tests.csproj +++ b/test/Stateless.Tests/Stateless.Tests.csproj @@ -8,7 +8,7 @@ Stateless.Tests ../../asset/Stateless.snk true - true + true false false false From 0e35af41f90864f3c83420fc34b45ce8ac999b41 Mon Sep 17 00:00:00 2001 From: Mike Clift Date: Fri, 22 Aug 2025 13:30:55 +0100 Subject: [PATCH 4/6] Switch to dotnet sn --- .github/workflows/BuildAndTestOnPullRequests.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/BuildAndTestOnPullRequests.yml b/.github/workflows/BuildAndTestOnPullRequests.yml index 99d2ec1f..4f859e0c 100644 --- a/.github/workflows/BuildAndTestOnPullRequests.yml +++ b/.github/workflows/BuildAndTestOnPullRequests.yml @@ -23,10 +23,12 @@ jobs: - name: Re-sign assemblies with full strong name run: | - # Re-sign all built assemblies with the private key + # Locate and sign all built assemblies $assemblies = Get-ChildItem -Path "src\Stateless\bin\Release" -Filter "*.dll" -Recurse foreach ($assembly in $assemblies) { - sn -R $assembly.FullName ../../asset/Stateless.snk + Write-Host "Signing: $($assembly.FullName)" + dotnet sn --re-sign $assembly.FullName ../../asset/Stateless.snk + Write-Host "Successfully signed: $($assembly.Name)" } - name: Install ReportGenerator From dba44a07392f542738a7d9ab66eb276dfdcb2d3a Mon Sep 17 00:00:00 2001 From: Mike Clift Date: Fri, 22 Aug 2025 14:19:08 +0100 Subject: [PATCH 5/6] Use a separate build for coverage analysis --- .../workflows/BuildAndTestOnPullRequests.yml | 20 ++++++++----------- src/Stateless/Stateless.csproj | 2 +- test/Stateless.Tests/Stateless.Tests.csproj | 2 +- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/.github/workflows/BuildAndTestOnPullRequests.yml b/.github/workflows/BuildAndTestOnPullRequests.yml index 4f859e0c..ba09e12e 100644 --- a/.github/workflows/BuildAndTestOnPullRequests.yml +++ b/.github/workflows/BuildAndTestOnPullRequests.yml @@ -15,21 +15,17 @@ jobs: - name: Install dependencies run: dotnet restore - - name: Build Stateless solution + - name: Build Stateless solution (signed for distribution) run: dotnet build Stateless.sln --configuration Release --no-restore - - name: Test with coverage (xUnit, Cobertura) - run: dotnet test --configuration Release --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=Cobertura + - name: Build for coverage analysis (unsigned, single target) + run: dotnet build src\Stateless\Stateless.csproj --configuration Release --no-restore -p:SignAssembly=false -p:TargetFramework=net8.0 -o src\Stateless\bin\Coverage - - name: Re-sign assemblies with full strong name - run: | - # Locate and sign all built assemblies - $assemblies = Get-ChildItem -Path "src\Stateless\bin\Release" -Filter "*.dll" -Recurse - foreach ($assembly in $assemblies) { - Write-Host "Signing: $($assembly.FullName)" - dotnet sn --re-sign $assembly.FullName ../../asset/Stateless.snk - Write-Host "Successfully signed: $($assembly.Name)" - } + - name: Build test project for coverage (unsigned) + run: dotnet build test\Stateless.Tests\Stateless.Tests.csproj --configuration Release --no-restore -p:SignAssembly=false -p:TargetFramework=net8.0 -o test\Stateless.Tests\bin\Coverage + + - name: Test with coverage (xUnit, Cobertura) + run: dotnet test test\Stateless.Tests\bin\Coverage\net8.0\Stateless.Tests.dll --configuration Release --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=Cobertura - name: Install ReportGenerator run: dotnet tool install -g dotnet-reportgenerator-globaltool diff --git a/src/Stateless/Stateless.csproj b/src/Stateless/Stateless.csproj index 12727e5d..45044c03 100644 --- a/src/Stateless/Stateless.csproj +++ b/src/Stateless/Stateless.csproj @@ -14,7 +14,7 @@ true ../../asset/Stateless.snk true - true + true Stateless.png https://github.com/dotnet-state-machine/stateless false diff --git a/test/Stateless.Tests/Stateless.Tests.csproj b/test/Stateless.Tests/Stateless.Tests.csproj index e76ccfe8..2665f5f1 100644 --- a/test/Stateless.Tests/Stateless.Tests.csproj +++ b/test/Stateless.Tests/Stateless.Tests.csproj @@ -8,7 +8,7 @@ Stateless.Tests ../../asset/Stateless.snk true - true + true false false false From a0a86e2e2d4074835f80aae1ea205431e7fd4cfc Mon Sep 17 00:00:00 2001 From: Mike Clift Date: Fri, 22 Aug 2025 14:22:10 +0100 Subject: [PATCH 6/6] Use PublicSigned for coverage build --- .github/workflows/BuildAndTestOnPullRequests.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/BuildAndTestOnPullRequests.yml b/.github/workflows/BuildAndTestOnPullRequests.yml index ba09e12e..a089c652 100644 --- a/.github/workflows/BuildAndTestOnPullRequests.yml +++ b/.github/workflows/BuildAndTestOnPullRequests.yml @@ -18,11 +18,11 @@ jobs: - name: Build Stateless solution (signed for distribution) run: dotnet build Stateless.sln --configuration Release --no-restore - - name: Build for coverage analysis (unsigned, single target) - run: dotnet build src\Stateless\Stateless.csproj --configuration Release --no-restore -p:SignAssembly=false -p:TargetFramework=net8.0 -o src\Stateless\bin\Coverage + - name: Build for coverage analysis (public signed, single target) + run: dotnet build src\Stateless\Stateless.csproj --configuration Release --no-restore -p:PublicSign=true -p:TargetFramework=net8.0 -o src\Stateless\bin\Coverage - - name: Build test project for coverage (unsigned) - run: dotnet build test\Stateless.Tests\Stateless.Tests.csproj --configuration Release --no-restore -p:SignAssembly=false -p:TargetFramework=net8.0 -o test\Stateless.Tests\bin\Coverage + - name: Build test project for coverage (public signed) + run: dotnet build test\Stateless.Tests\Stateless.Tests.csproj --configuration Release --no-restore -p:PublicSign=true -p:TargetFramework=net8.0 -o test\Stateless.Tests\bin\Coverage - name: Test with coverage (xUnit, Cobertura) run: dotnet test test\Stateless.Tests\bin\Coverage\net8.0\Stateless.Tests.dll --configuration Release --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=Cobertura