From 0dd45800261ddf914202337490d549280f359153 Mon Sep 17 00:00:00 2001 From: Christopher Wolf <4867233+HaGGi13@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:30:10 +0100 Subject: [PATCH 01/10] Use dotnet CLI code coverage reports Instead of calling Coverlet directly via MSBuild property, the dotnet CLI integration is used. This was done to check if the code coverage reports are maybe merged OOTB. --- .github/workflows/build.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 94c4ce3..bb1c6da 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -97,9 +97,7 @@ jobs: --logger trx --results-directory "./TestResults/" --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" - /p:CollectCoverage=true - /p:CoverletOutputFormat=opencover - /p:CoverletOutput="./../../TestResults/" + --collect:"XPlat Code Coverage" - name: Upload dotnet test results uses: actions/upload-artifact@v4 From 53be8e7afbe676cf6cf3617fa93e720d36512ce5 Mon Sep 17 00:00:00 2001 From: Christopher Wolf <4867233+HaGGi13@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:46:04 +0100 Subject: [PATCH 02/10] Use Coverlet for merged code coverage reports Switch to using `dotnet test` with Coverlet MSBuild properties for generating JSON and Cobertura coverage formats. Adjusted output paths for proper merging of coverage results. --- .github/workflows/build.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index bb1c6da..2a4fad0 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -97,7 +97,10 @@ jobs: --logger trx --results-directory "./TestResults/" --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" - --collect:"XPlat Code Coverage" + /p:CollectCoverage=true + /p:CoverletOutputFormat=\"json,cobertura\" + /p:CoverletOutput="./../../TestResults/" + /p:MergeWith=./TestResults/coverage.json - name: Upload dotnet test results uses: actions/upload-artifact@v4 From 15d2dc6618fb040ebaf9395205be019f2d19721b Mon Sep 17 00:00:00 2001 From: Christopher Wolf <4867233+HaGGi13@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:51:28 +0100 Subject: [PATCH 03/10] Try to fix syntax --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 2a4fad0..db317aa 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -98,7 +98,7 @@ jobs: --results-directory "./TestResults/" --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" /p:CollectCoverage=true - /p:CoverletOutputFormat=\"json,cobertura\" + /p:CoverletOutputFormat="json,cobertura" /p:CoverletOutput="./../../TestResults/" /p:MergeWith=./TestResults/coverage.json From 090a420879aed09b3babb4cd1447f34a651808f9 Mon Sep 17 00:00:00 2001 From: Christopher Wolf <4867233+HaGGi13@users.noreply.github.com> Date: Thu, 19 Feb 2026 21:09:52 +0100 Subject: [PATCH 04/10] Switch to OpenCover format + merge coverage reports Updated the build pipeline to generate and merge test coverage reports in OpenCover format. Introduced `dotnet-reportgenerator` for merging coverage reports of different target framework runs and point SonarQube to merged coverage report location. --- .github/workflows/build.yaml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index db317aa..eab09e1 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -82,6 +82,7 @@ jobs: /v:"${{ env.GitVersion_FullSemVer }}" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.cs.opencover.reportsPaths=./TestResults/coverage.opencover.xml + /d:sonar.cs.opencover.reportsPaths=merged-coverage/opencover.xml # --- Build --- - name: Build ${{ env.solutionPath }} ${{ env.GitVersion_FullSemVer }} @@ -98,9 +99,18 @@ jobs: --results-directory "./TestResults/" --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" /p:CollectCoverage=true - /p:CoverletOutputFormat="json,cobertura" - /p:CoverletOutput="./../../TestResults/" - /p:MergeWith=./TestResults/coverage.json + /p:CoverletOutputFormat="opencover" + /p:CoverletOutput="./../../TestResults/coverage" + + - name: Install ReportGenerator + run: dotnet tool install --global dotnet-reportgenerator-globaltool + + - name: Merge coverage reports + run: > + reportgenerator + -reports:"TestResults/coverage*.opencover.xml" + -targetdir:"merged-coverage" + -reporttypes:opencover - name: Upload dotnet test results uses: actions/upload-artifact@v4 From 210567c00850b897e5a5d3a3f0c2bfb696bfdd35 Mon Sep 17 00:00:00 2001 From: Christopher Wolf <4867233+HaGGi13@users.noreply.github.com> Date: Thu, 19 Feb 2026 21:13:26 +0100 Subject: [PATCH 05/10] Fix SonarQube coverage report configuration --- .github/workflows/build.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index eab09e1..f22bcfc 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -81,7 +81,6 @@ jobs: /d:sonar.host.url="https://sonarcloud.io" /v:"${{ env.GitVersion_FullSemVer }}" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" - /d:sonar.cs.opencover.reportsPaths=./TestResults/coverage.opencover.xml /d:sonar.cs.opencover.reportsPaths=merged-coverage/opencover.xml # --- Build --- From bda02f3ed6733ff0a4af261a39fad73f3ed424a7 Mon Sep 17 00:00:00 2001 From: Christopher Wolf <4867233+HaGGi13@users.noreply.github.com> Date: Thu, 19 Feb 2026 21:36:02 +0100 Subject: [PATCH 06/10] Remove coverage report merging --- .github/workflows/build.yaml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f22bcfc..d98109b 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -81,7 +81,7 @@ jobs: /d:sonar.host.url="https://sonarcloud.io" /v:"${{ env.GitVersion_FullSemVer }}" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" - /d:sonar.cs.opencover.reportsPaths=merged-coverage/opencover.xml + /d:sonar.cs.opencover.reportsPaths=./TestResults/coverage*.opencover.xml # --- Build --- - name: Build ${{ env.solutionPath }} ${{ env.GitVersion_FullSemVer }} @@ -101,16 +101,6 @@ jobs: /p:CoverletOutputFormat="opencover" /p:CoverletOutput="./../../TestResults/coverage" - - name: Install ReportGenerator - run: dotnet tool install --global dotnet-reportgenerator-globaltool - - - name: Merge coverage reports - run: > - reportgenerator - -reports:"TestResults/coverage*.opencover.xml" - -targetdir:"merged-coverage" - -reporttypes:opencover - - name: Upload dotnet test results uses: actions/upload-artifact@v4 with: From b4f4f3d88024b50ec3999ac7eee0dbfbad296156 Mon Sep 17 00:00:00 2001 From: Christopher Wolf <4867233+HaGGi13@users.noreply.github.com> Date: Sat, 21 Feb 2026 21:52:41 +0100 Subject: [PATCH 07/10] Update NuGet packaging comment in build pipeline --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d98109b..371dbcb 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -115,7 +115,7 @@ jobs: run: | .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" - # --- NuGet Pack, Upload & Publish --- + # --- NuGet Pack + Upload --- - name: Pack NuGet package run: > dotnet pack ${{ env.solutionPath }} From d934ee5f7b795a109740603578e27dc6b8648ced Mon Sep 17 00:00:00 2001 From: Christopher Wolf <4867233+HaGGi13@users.noreply.github.com> Date: Sat, 21 Feb 2026 22:00:46 +0100 Subject: [PATCH 08/10] Undo changes on dotnet test coverlet configuration --- .github/workflows/build.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 371dbcb..8d40a03 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -98,8 +98,8 @@ jobs: --results-directory "./TestResults/" --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" /p:CollectCoverage=true - /p:CoverletOutputFormat="opencover" - /p:CoverletOutput="./../../TestResults/coverage" + /p:CoverletOutputFormat=opencover + /p:CoverletOutput="./../../TestResults" - name: Upload dotnet test results uses: actions/upload-artifact@v4 From a270363259590ebe6309ab6282c74d1bc45ac1b5 Mon Sep 17 00:00:00 2001 From: Christopher Wolf <4867233+HaGGi13@users.noreply.github.com> Date: Sat, 21 Feb 2026 22:08:19 +0100 Subject: [PATCH 09/10] Adjust Coverlet output path for having files starting with "coverage" --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 8d40a03..d836d6b 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -99,7 +99,7 @@ jobs: --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" /p:CollectCoverage=true /p:CoverletOutputFormat=opencover - /p:CoverletOutput="./../../TestResults" + /p:CoverletOutput="./../../TestResults/coverage" - name: Upload dotnet test results uses: actions/upload-artifact@v4 From bd07776577287d0b020fb4d0f70bf837b2dbd6a2 Mon Sep 17 00:00:00 2001 From: Christopher Wolf <4867233+HaGGi13@users.noreply.github.com> Date: Sat, 21 Feb 2026 22:17:01 +0100 Subject: [PATCH 10/10] Update artifact names to include `.zip` extension --- .github/workflows/build.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d836d6b..e926fb3 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -104,7 +104,7 @@ jobs: - name: Upload dotnet test results uses: actions/upload-artifact@v4 with: - name: TestResults + name: TestResults.zip path: ./TestResults/ # Use always() to always run this step to publish test results when there are test failures if: ${{ always() }} @@ -127,6 +127,6 @@ jobs: - name: Upload NuGet package artifact uses: actions/upload-artifact@v6 with: - name: NuGetPackage + name: NuGetPackage.zip path: ./nupkg/*.nupkg retention-days: 3