From fb533257b69c78e152a80895c25f4d69d1a54653 Mon Sep 17 00:00:00 2001 From: Egil Hansen Date: Tue, 26 Sep 2023 14:10:15 +0000 Subject: [PATCH] ci: add stryker.net to build --- .github/workflows/publish.yml | 93 ++++++++++++++++++++++++++++++++++- README.md | 1 + stryker-config.json | 20 ++++++++ 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 stryker-config.json diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a7536f5..440850a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,10 +13,16 @@ on: types: - published # Run the workflow when a new GitHub release is published +concurrency: + group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/main' && github.run_id || github.event.pull_request.number || github.ref }} + cancel-in-progress: true + env: DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 DOTNET_NOLOGO: true NuGetDirectory: ${{ github.workspace}}/nuget + TestResultsDirectory: ${{ github.workspace}}/TestResults + BRANCH_NAME: ${{ github.head_ref || github.ref_name }} defaults: run: @@ -76,6 +82,10 @@ jobs: run_test: runs-on: ubuntu-latest + env: + TestResultsDirectory: ${{ github.workspace}}/TestResults + permissions: + checks: write steps: - uses: actions/checkout@v3 @@ -89,7 +99,88 @@ jobs: 8.0.x - name: Run tests - run: dotnet test --configuration Release + run: dotnet test --configuration Release --logger trx --results-directory "${{ env.TestResultsDirectory }}" --collect:"XPlat Code Coverage" --blame-hang --blame-hang-timeout 5min + + - uses: actions/upload-artifact@v3 + if: always() + with: + name: test-results + if-no-files-found: error + retention-days: 3 + path: ${{ env.TestResultsDirectory }}/**/* + + - name: Test Report + uses: dorny/test-reporter@v1 + if: github.actor != 'dependabot[bot]' && (success() || failure()) && github.repository_owner == 'egil' + with: + name: test-results + path: ${{ env.TestResultsDirectory }}/**/*.trx + path-replace-backslashes: 'true' + reporter: dotnet-trx + + stryker: + runs-on: ubuntu-latest + env: + StrykerDirectory: ${{ github.workspace }}/Stryker + permissions: + pull-requests: write + steps: + - uses: actions/checkout@v3 + + # Install the .NET SDK indicated in the global.json file + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: | + 3.1.x + 6.0.x + 8.0.x + + - name: Install Stryker.NET + run: dotnet tool install -g dotnet-stryker + + - name: Run Stryker.NET + id: stryker + run: | + cd test/TimeProviderExtensions.Tests + dotnet stryker --config-file "../../stryker-config.json" --dashboard-api-key "${{ secrets.STRYKER_DASHBOARD_API_KEY }}" --version ${{ env.BRANCH_NAME }} --output ${{ env.StrykerDirectory }} + + - uses: actions/upload-artifact@v3 + if: always() + with: + name: stryker-reports + if-no-files-found: error + retention-days: 3 + path: ${{ env.StrykerDirectory }}/**/* + + - name: Find Stryker Report comment + if: github.event_name == 'pull_request' && github.actor != 'dependabot[bot]' && (success() || failure()) && github.repository_owner == 'egil' + uses: peter-evans/find-comment@v2.4.0 + id: fc + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: Mutation Testing Summary + + - name: Create or update Stryker Report comment + if: github.event_name == 'pull_request' && github.actor != 'dependabot[bot]' && (success() || failure()) && github.repository_owner == 'egil' + id: couc + uses: peter-evans/create-or-update-comment@v3.0.2 + with: + comment-id: ${{ steps.fc.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body-path: Stryker/reports/mutation-report.md + edit-mode: replace + + - if: github.event_name == 'pull_request' && github.actor != 'dependabot[bot]' && success() && github.repository_owner == 'egil' + uses: peter-evans/create-or-update-comment@v3.0.2 + with: + comment-id: ${{ steps.couc.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: | + + See the [full report](https://dashboard.stryker-mutator.io/reports/github.com/egil/TimeProviderExtensions/${{ env.BRANCH_NAME }}) on the Stryker Dashboard. + edit-mode: append deploy: # Publish only when creating a GitHub Release diff --git a/README.md b/README.md index be8418e..9283d48 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ [![GitHub tag (latest SemVer pre-release)](https://img.shields.io/github/v/tag/egil/TimeProviderExtensions?include_prereleases&logo=github&style=flat-square)](https://github.com/egil/TimeProviderExtensions/releases) [![Nuget](https://img.shields.io/nuget/dt/TimeProviderExtensions?logo=nuget&style=flat-square)](https://www.nuget.org/packages/TimeProviderExtensions/) [![Issues Open](https://img.shields.io/github/issues/egil/TimeProviderExtensions.svg?style=flat-square&logo=github)](https://github.com/egil/TimeProviderExtensions/issues) +[![Mutation testing badge](https://img.shields.io/endpoint?style=flat&url=https%3A%2F%2Fbadge-api.stryker-mutator.io%2Fgithub.com%2Fegil%2FTimeProviderExtensions%2Fmain)](https://dashboard.stryker-mutator.io/reports/github.com/egil/TimeProviderExtensions/main) # TimeProvider Extensions diff --git a/stryker-config.json b/stryker-config.json new file mode 100644 index 0000000..7906860 --- /dev/null +++ b/stryker-config.json @@ -0,0 +1,20 @@ +{ + "stryker-config": { + "mutate": [ + "!**/System.*/*" + ], + "language-version": "Preview", + "target-framework": "net8.0", + "mutation-level": "Complete", + "reporters": [ + "markdown", + "dashboard", + "html" + ], + "baseline": { + "enabled": false, + "fallback-version": "main", + "provider": "Dashboard" + } + } +} \ No newline at end of file