diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 60c8131..ea2b7b6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,6 +9,8 @@ on: jobs: build: runs-on: ubuntu-latest + permissions: + contents: write steps: - uses: actions/checkout@v6 with: @@ -24,8 +26,46 @@ jobs: - name: Build run: dotnet build src/Endpointer.slnx --no-restore -c Release - - name: Test - run: dotnet test --solution src/Endpointer.slnx --no-build -c Release + - name: Test with Coverage + run: | + dotnet tool install -g dotnet-coverage + dotnet-coverage collect -s src/coverage.runsettings -f cobertura -o ./coverage/coverage.cobertura.xml "dotnet test --solution src/Endpointer.slnx --no-build -c Release --verbosity normal" + + - name: Generate Coverage Report + run: | + dotnet tool install -g dotnet-reportgenerator-globaltool + reportgenerator -reports:./coverage/coverage.cobertura.xml -targetdir:./coverage/report -reporttypes:"MarkdownSummaryGithub;Badges" -assemblyfilters:"+Endpointer" + + - name: Add Coverage to Job Summary + if: always() + run: cat ./coverage/report/SummaryGithub.md >> $GITHUB_STEP_SUMMARY + + - name: Publish Coverage Badge + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + mkdir -p /tmp/badges + cp ./coverage/report/badge_linecoverage.svg /tmp/badges/ + cp ./coverage/report/badge_branchcoverage.svg /tmp/badges/ + + if git ls-remote --exit-code --heads origin coverage; then + git fetch origin coverage:coverage + git switch coverage + else + git switch --orphan coverage + fi + + cp /tmp/badges/*.svg . + git add badge_linecoverage.svg badge_branchcoverage.svg + + if git diff --staged --quiet; then + echo "No changes to coverage badges" + else + git commit -m "Update coverage badges" + git push origin coverage + fi - name: Pack run: dotnet pack src/Endpointer/Endpointer.csproj --no-build -c Release -o ./artifacts diff --git a/.gitignore b/.gitignore index 084f8c7..fadc911 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ ScaffoldingReadMe.txt ~$* *~ CodeCoverage/ +coverage/ # MSBuild Binary and Structured Log *.binlog diff --git a/README.md b/README.md index 079eb86..7b2f04b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,13 @@ # Endpointer [![Build](https://github.com/stephanprobst/Endpointer/actions/workflows/build.yml/badge.svg)](https://github.com/stephanprobst/Endpointer/actions/workflows/build.yml) +[![Coverage](https://raw.githubusercontent.com/stephanprobst/Endpointer/coverage/badge_linecoverage.svg)](https://github.com/stephanprobst/Endpointer) [![NuGet](https://img.shields.io/nuget/v/Endpointer.svg)](https://www.nuget.org/packages/Endpointer/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -[![netstandard2.0](https://img.shields.io/badge/netstandard-2.0-blue)](https://docs.microsoft.com/en-us/dotnet/standard/net-standard) [![Roslyn](https://img.shields.io/badge/Roslyn-Source%20Generator-blueviolet)](https://docs.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/) +[![.NET 8](https://img.shields.io/badge/.NET-8.0-blue)](https://dotnet.microsoft.com/) +[![.NET 9](https://img.shields.io/badge/.NET-9.0-blue)](https://dotnet.microsoft.com/) +[![.NET 10](https://img.shields.io/badge/.NET-10.0-blue)](https://dotnet.microsoft.com/) A **C# source generator** for ASP.NET Core Minimal APIs implementing the **REPR (Request-Endpoint-Response) pattern**. diff --git a/src/coverage.runsettings b/src/coverage.runsettings new file mode 100644 index 0000000..ab9e022 --- /dev/null +++ b/src/coverage.runsettings @@ -0,0 +1,21 @@ + + + + + + .*Endpointer\.dll$ + + + .*\.Tests\.dll$ + .*TestWebApi\.dll$ + .*Basic\.Reference\.Assemblies.* + + + + + ^System\.Diagnostics\.CodeAnalysis\.ExcludeFromCodeCoverageAttribute$ + ^System\.CodeDom\.Compiler\.GeneratedCodeAttribute$ + + + +