diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 49f6495..59ada62 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,8 +1,9 @@ name: "Build" on: + workflow_dispatch: push: - branches: [main] + branches: [main, 'release/v[0-9]+.[0-9]+.[0-9]+'] jobs: analyze: @@ -23,6 +24,12 @@ jobs: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: Tag current commit + if: startsWith(github.ref, 'refs/heads/release/') + shell: bash + run: | + version="${GITHUB_REF#refs/heads/release/}" + git tag "${version}" - name: Cache SonarCloud packages uses: actions/cache@v4 with: @@ -68,6 +75,12 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 + - name: Tag current commit + if: startsWith(github.ref, 'refs/heads/release/') + shell: bash + run: | + version="${GITHUB_REF#refs/heads/release/}" + git tag "${version}" - name: Setup .NET uses: actions/setup-dotnet@v4 with: @@ -92,6 +105,12 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 + - name: Tag current commit + if: startsWith(github.ref, 'refs/heads/release/') + shell: bash + run: | + version="${GITHUB_REF#refs/heads/release/}" + git tag "${version}" - name: Setup .NET uses: actions/setup-dotnet@v4 with: @@ -116,6 +135,12 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 + - name: Tag current commit + if: startsWith(github.ref, 'refs/heads/release/') + shell: bash + run: | + version="${GITHUB_REF#refs/heads/release/}" + git tag "${version}" - name: Setup .NET uses: actions/setup-dotnet@v4 with: @@ -140,12 +165,14 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 + - name: Tag current commit + if: startsWith(github.ref, 'refs/heads/release/') + shell: bash + run: | + version="${GITHUB_REF#refs/heads/release/}" + git tag "${version}" - name: Setup .NET uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 6.0.x - 7.0.x - name: Setup MSBuild uses: microsoft/setup-msbuild@v2 - name: Setup VSTest @@ -192,3 +219,113 @@ jobs: with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} coverage-reports: coverage-report/Cobertura.xml + + stryker: + name: Stryker mutation testing + runs-on: ubuntu-latest + timeout-minutes: 300 + steps: + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + with: + fetch-depth: 0 + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: | + 6.0.x + 7.0.x + - name: Install .NET Stryker + shell: bash + run: | + dotnet tool install dotnet-stryker --tool-path ../tools + - name: Analyze Testably.Abstractions.FluentAssertions + env: + STRYKER_DASHBOARD_API_KEY: ${{ secrets.STRYKER_DASHBOARD_API_KEY }} + shell: bash + run: | + cd Tests + ../../tools/dotnet-stryker -f ../.github/stryker/Stryker.Config.json -v "${GITHUB_REF#refs/heads/}" -r "Dashboard" -r "cleartext" + + deploy: + name: Deploy + if: startsWith(github.ref, 'refs/heads/release/') + runs-on: ubuntu-latest + environment: production + needs: [analyze, test-macos, test-ubuntu, test-windows, test-net-framework, stryker] + steps: + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + with: + fetch-depth: 0 + - name: Tag current commit + id: tag + shell: bash + run: | + version="${GITHUB_REF#refs/heads/release/}" + git tag "${version}" + git push origin "${version}" + echo "release_version=${version}" >> "$GITHUB_OUTPUT" + - name: Setup NuGet + uses: NuGet/setup-nuget@v2.0.0 + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: | + 6.0.x + 7.0.x + - name: Prepare README.md + shell: bash + run: | + version="${GITHUB_REF#refs/heads/release/}" + # Add changelog badge to README.md + sed -i -e "2 a\[!\[Changelog](https:\/\/img\.shields\.io\/badge\/Changelog-${version}-blue)](https:\/\/github\.com\/Testably\/Testably\.Abstractions\.FluentAssertions\/releases\/tag\/${version})" "./README.md" + for f in "README.md" + do + echo "Processing $f" # always double quote "$f" filename + # do something on $f + # Remove the codacy badge as it is not aligned to the release + grep -v "Codacy Badge" "./$f" > "./$f.backup" && mv "./$f.backup" "./$f" + # Change status badges to display explicit version + sed -i -e "s/branch=main/branch=release%2F${version}/g" "./$f" + sed -i -e "s/Testably.Abstractions.FluentAssertions%2Fmain/Testably.Abstractions.FluentAssertions%2Frelease%2F${version}/g" "./$f" + sed -i -e "s/Testably.Abstractions.FluentAssertions%2Fmain/Testably.Abstractions.FluentAssertions%2Frelease%2F${version}/g" "./$f" + sed -i -e "s/Testably.Abstractions.FluentAssertions\/main)/Testably.Abstractions.FluentAssertions\/release\/${version})/g" "./$f" + done + - name: Build + run: dotnet build --configuration "Release" + - name: Publish + run: nuget push **\*.nupkg -Source 'https://api.nuget.org/v3/index.json' -ApiKey ${{secrets.NUGET_API_KEY}} + - name: Create GitHub release + uses: softprops/action-gh-release@v2 + with: + name: ${{ steps.tag.outputs.release_version }} + tag_name: ${{ steps.tag.outputs.release_version }} + token: ${{ secrets.GITHUB_TOKEN }} + generate_release_notes: true + + cleanup: + name: Cleanup + if: startsWith(github.ref, 'refs/heads/release/') + runs-on: ubuntu-latest + needs: [deploy] + steps: + - name: Comment relevant issues and pull requests + uses: apexskier/github-release-commenter@v1.3.6 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + comment-template: | + This is addressed in release {release_link}. + label-template: | + state: released + skip-label: | + state: released + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + with: + fetch-depth: 0 + - name: Delete release branch + shell: bash + run: | + version="${GITHUB_REF#refs/heads/release/}" + git push origin -d "refs/heads/release/${version}" diff --git a/.github/workflows/ci-stryker.yml b/.github/workflows/ci-stryker.yml deleted file mode 100644 index 5f21202..0000000 --- a/.github/workflows/ci-stryker.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: "CI (Stryker)" - -on: - workflow_dispatch: - -jobs: - stryker: - name: Mutation testing - runs-on: ubuntu-latest - timeout-minutes: 300 - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - with: - fetch-depth: 0 - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 6.0.x - 7.0.x - - name: Install .NET Stryker - shell: bash - run: | - dotnet tool install dotnet-stryker --tool-path ../tools - - name: Prepare Reports directory - shell: bash - run: | - mkdir Tests/StrykerOutput/Reports -p - - name: Analyze Testably.Abstractions.FluentAssertions - env: - STRYKER_DASHBOARD_API_KEY: ${{ secrets.STRYKER_DASHBOARD_API_KEY }} - shell: bash - run: | - cd Tests - ../../tools/dotnet-stryker -f ../.github/stryker/Stryker.Config.json -v "${GITHUB_HEAD_REF}" -r "html" -r "cleartext" --since:main - mv ./StrykerOutput/**/reports/*.html ./StrykerOutput/Reports/Testably.Abstractions.FluentAssertions-report.html - - name: Upload Stryker reports - uses: actions/upload-artifact@v4 - with: - name: Stryker - path: Tests/StrykerOutput/Reports/* - - name: Add comment to pull request - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - shell: bash - run: | - prNumber="${{ github.event.number }}" - commentsUrl="https://api.github.com/repos/Testably/Testably.Abstractions.FluentAssertions/issues/$prNumber/comments" - dashboardLink="attached Stryker dashboards on the build pipeline" - echo "Search for comment in PR#$prNumber containing $dashboardLink..." - result=$(curl -X GET $commentsUrl \ - -H "Content-Type: application/json" \ - -H "Authorization: token $GITHUB_TOKEN") - if [[ $result != *"$dashboardLink"* ]] - then - body="{\"body\":\"Please check the attached Stryker dashboards on the build pipeline.\"}" - curl -X POST $commentsUrl \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: token $GITHUB_TOKEN" \ - -d "$body" - fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ceb3fa2..4106f8b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -120,3 +120,60 @@ jobs: with: name: Test results (.NET Framework) path: TestResults + + stryker: + name: Mutation testing + runs-on: ubuntu-latest + timeout-minutes: 300 + steps: + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + with: + fetch-depth: 0 + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: | + 6.0.x + 7.0.x + - name: Install .NET Stryker + shell: bash + run: | + dotnet tool install dotnet-stryker --tool-path ../tools + - name: Prepare Reports directory + shell: bash + run: | + mkdir Tests/StrykerOutput/Reports -p + - name: Analyze Testably.Abstractions.FluentAssertions + env: + STRYKER_DASHBOARD_API_KEY: ${{ secrets.STRYKER_DASHBOARD_API_KEY }} + shell: bash + run: | + cd Tests + ../../tools/dotnet-stryker -f ../.github/stryker/Stryker.Config.json -v "${GITHUB_HEAD_REF}" -r "html" -r "cleartext" --since:main + mv ./StrykerOutput/**/reports/*.html ./StrykerOutput/Reports/Testably.Abstractions.FluentAssertions-report.html + - name: Upload Stryker reports + uses: actions/upload-artifact@v4 + with: + name: Stryker + path: Tests/StrykerOutput/Reports/* + - name: Add comment to pull request + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + prNumber="${{ github.event.number }}" + commentsUrl="https://api.github.com/repos/Testably/Testably.Abstractions.FluentAssertions/issues/$prNumber/comments" + dashboardLink="attached Stryker dashboards on the build pipeline" + echo "Search for comment in PR#$prNumber containing $dashboardLink..." + result=$(curl -X GET $commentsUrl \ + -H "Content-Type: application/json" \ + -H "Authorization: token $GITHUB_TOKEN") + if [[ $result != *"$dashboardLink"* ]] + then + body="{\"body\":\"Please check the attached Stryker dashboards on the build pipeline.\"}" + curl -X POST $commentsUrl \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: token $GITHUB_TOKEN" \ + -d "$body" + fi diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml deleted file mode 100644 index 41a7f3b..0000000 --- a/.github/workflows/pr.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: "PR" - -on: - pull_request_target: - types: - - opened - - edited -permissions: - contents: read - -jobs: - main: - permissions: - pull-requests: read - statuses: write - name: Check "Conventional Commits" - runs-on: ubuntu-latest - steps: - - uses: amannn/action-semantic-pull-request@v5 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - types: | - chore - coverage - docs - feat - fix - refactor - scopes: | - file - random - time - access-control - compression - deps - requireScope: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 61d6c65..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,269 +0,0 @@ -name: "Release" - -on: - push: - branches: - - 'release/v[0-9]+.[0-9]+.[0-9]+' - -jobs: - analyze: - name: Static code analysis - runs-on: windows-latest - steps: - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 6.0.x - 7.0.x - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '17' - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Tag current commit - shell: bash - run: | - version="${GITHUB_REF#refs/heads/release/}" - git tag "${version}" - - name: Cache SonarCloud packages - uses: actions/cache@v4 - with: - path: ~\sonar\cache - key: ${{ runner.os }}-sonar - restore-keys: ${{ runner.os }}-sonar - - name: Cache SonarCloud scanner - id: cache-sonar-scanner - uses: actions/cache@v4 - with: - path: .\.sonar\scanner - key: ${{ runner.os }}-sonar-scanner - restore-keys: ${{ runner.os }}-sonar-scanner - - name: Install SonarCloud scanner - if: steps.cache-sonar-scanner.outputs.cache-hit != 'true' - shell: powershell - run: | - New-Item -Path .\.sonar\scanner -ItemType Directory - dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner - - name: Build and analyze - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - shell: powershell - run: | - dotnet tool install minver-cli --global - dotnet tool restore - $version = minver -t v - $productVersion,$prerelease = $version -split '-',2 - echo "Detected product version: $productVersion" - .\.sonar\scanner\dotnet-sonarscanner begin /k:"Testably_Testably.Abstractions.FluentAssertions" /o:"testably" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" /v:"$productVersion" /d:sonar.cs.vscoveragexml.reportsPaths=coverage.xml - dotnet tool install --global dotnet-coverage - dotnet restore -s 'nuget.config' - dotnet build --no-incremental /p:NetCoreOnly=True --configuration "Release" - dotnet-coverage collect 'dotnet test --no-build' -f xml -o 'coverage.xml' - .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" - - test-macos: - name: Test (MacOS) - runs-on: macos-latest - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - with: - fetch-depth: 0 - - name: Tag current commit - shell: bash - run: | - version="${GITHUB_REF#refs/heads/release/}" - git tag "${version}" - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 6.0.x - 7.0.x - - name: Build solution - run: dotnet build /p:NetCoreOnly=True --configuration "Release" - - name: Run tests - run: dotnet test --no-build - - test-ubuntu: - name: Test (Ubuntu) - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - with: - fetch-depth: 0 - - name: Tag current commit - shell: bash - run: | - version="${GITHUB_REF#refs/heads/release/}" - git tag "${version}" - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 6.0.x - 7.0.x - - name: Build solution - run: dotnet build /p:NetCoreOnly=True --configuration "Release" - - name: Run tests - run: dotnet test --no-build - - test-windows: - name: Test (Windows) - runs-on: windows-latest - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - with: - fetch-depth: 0 - - name: Tag current commit - shell: bash - run: | - version="${GITHUB_REF#refs/heads/release/}" - git tag "${version}" - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 6.0.x - 7.0.x - - name: Build solution - run: dotnet build /p:NetCoreOnly=True --configuration "Release" - - name: Run tests - run: dotnet test --no-build - - test-net-framework: - name: Test (.NET Framework) - runs-on: windows-latest - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - with: - fetch-depth: 0 - - name: Tag current commit - shell: bash - run: | - version="${GITHUB_REF#refs/heads/release/}" - git tag "${version}" - - name: Setup MSBuild - uses: microsoft/setup-msbuild@v2 - - name: Setup VSTest - uses: darenm/Setup-VSTest@v1 - - name: Navigate to Workspace - run: cd $GITHUB_WORKSPACE - - name: Build solution - run: msbuild.exe Testably.Abstractions.FluentAssertions.sln /p:NetFrameworkOnly=True /p:platform="Any CPU" /p:configuration="Release" -t:restore,build -p:RestorePackagesConfig=true - - name: Run tests - run: vstest.console.exe .\Build\Tests\Testably.Abstractions.FluentAssertions.Tests\net48\Testably.Abstractions.FluentAssertions.Tests.dll - - stryker: - name: Analyze quality of unit test coverage with .NET Stryker - runs-on: ubuntu-latest - timeout-minutes: 300 - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - with: - fetch-depth: 0 - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 6.0.x - 7.0.x - - name: Install .NET Stryker - shell: bash - run: | - dotnet tool install dotnet-stryker --tool-path ../tools --version 3.7.1 - - name: Analyze Testably.Abstractions.FluentAssertions - env: - STRYKER_DASHBOARD_API_KEY: ${{ secrets.STRYKER_DASHBOARD_API_KEY }} - shell: bash - run: | - cd Tests - ../../tools/dotnet-stryker -f ../.github/stryker/Stryker.Config.json -v "${GITHUB_REF#refs/heads/}" -r "Dashboard" -r "cleartext" - - deploy: - name: Deploy - runs-on: ubuntu-latest - environment: production - needs: [analyze, test-macos, test-ubuntu, test-windows, test-net-framework] - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - with: - fetch-depth: 0 - - name: Tag current commit - id: tag - shell: bash - run: | - version="${GITHUB_REF#refs/heads/release/}" - git tag "${version}" - git push origin "${version}" - echo "release_version=${version}" >> "$GITHUB_OUTPUT" - - name: Setup NuGet - uses: NuGet/setup-nuget@v2.0.0 - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 6.0.x - 7.0.x - - name: Prepare README.md - shell: bash - run: | - version="${GITHUB_REF#refs/heads/release/}" - # Add changelog badge to README.md - sed -i -e "2 a\[!\[Changelog](https:\/\/img\.shields\.io\/badge\/Changelog-${version}-blue)](https:\/\/github\.com\/Testably\/Testably\.Abstractions\.FluentAssertions\/releases\/tag\/${version})" "./README.md" - for f in "README.md" - do - echo "Processing $f" # always double quote "$f" filename - # do something on $f - # Remove the codacy badge as it is not aligned to the release - grep -v "Codacy Badge" "./$f" > "./$f.backup" && mv "./$f.backup" "./$f" - # Change status badges to display explicit version - sed -i -e "s/branch=main/branch=release%2F${version}/g" "./$f" - sed -i -e "s/Testably.Abstractions.FluentAssertions%2Fmain/Testably.Abstractions.FluentAssertions%2Frelease%2F${version}/g" "./$f" - sed -i -e "s/Testably.Abstractions.FluentAssertions%2Fmain/Testably.Abstractions.FluentAssertions%2Frelease%2F${version}/g" "./$f" - sed -i -e "s/Testably.Abstractions.FluentAssertions\/main)/Testably.Abstractions.FluentAssertions\/release\/${version})/g" "./$f" - done - - name: Build - run: dotnet build --configuration "Release" - - name: Publish - run: nuget push **\*.nupkg -Source 'https://api.nuget.org/v3/index.json' -ApiKey ${{secrets.NUGET_API_KEY}} - - name: Create GitHub release - uses: softprops/action-gh-release@v2 - with: - name: ${{ steps.tag.outputs.release_version }} - tag_name: ${{ steps.tag.outputs.release_version }} - token: ${{ secrets.GITHUB_TOKEN }} - generate_release_notes: true - - cleanup: - name: Cleanup - runs-on: ubuntu-latest - needs: [deploy, stryker] - steps: - - name: Comment relevant issues and pull requests - uses: apexskier/github-release-commenter@v1.3.6 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - comment-template: | - This is addressed in release {release_link}. - label-template: | - state: released - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - with: - fetch-depth: 0 - - name: Delete release branch - shell: bash - run: | - version="${GITHUB_REF#refs/heads/release/}" - git push origin -d "refs/heads/release/${version}" diff --git a/.github/workflows/stryker.yml b/.github/workflows/stryker.yml deleted file mode 100644 index 21c4b5d..0000000 --- a/.github/workflows/stryker.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: "Stryker" - -on: - workflow_dispatch: - push: - branches: [main] - -jobs: - stryker: - name: Stryker mutation testing - runs-on: ubuntu-latest - timeout-minutes: 300 - steps: - - name: Checkout sources - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - with: - fetch-depth: 0 - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 6.0.x - 7.0.x - - name: Install .NET Stryker - shell: bash - run: | - dotnet tool install dotnet-stryker --tool-path ../tools --version 3.7.1 - - name: Analyze Testably.Abstractions.FluentAssertions - env: - STRYKER_DASHBOARD_API_KEY: ${{ secrets.STRYKER_DASHBOARD_API_KEY }} - shell: bash - run: | - cd Tests - ../../tools/dotnet-stryker -f ../.github/stryker/Stryker.Config.json -v "${GITHUB_REF#refs/heads/}" -r "Dashboard" -r "cleartext" diff --git a/Testably.Abstractions.FluentAssertions.sln b/Testably.Abstractions.FluentAssertions.sln index b3cc82d..87d1337 100644 --- a/Testably.Abstractions.FluentAssertions.sln +++ b/Testably.Abstractions.FluentAssertions.sln @@ -38,11 +38,8 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{8FD8E33B-2072-48CA-8164-DE2AA5DCB8FD}" ProjectSection(SolutionItems) = preProject .github\workflows\build.yml = .github\workflows\build.yml - .github\workflows\ci-stryker.yml = .github\workflows\ci-stryker.yml .github\workflows\ci.yml = .github\workflows\ci.yml - .github\workflows\pr.yml = .github\workflows\pr.yml - .github\workflows\release.yml = .github\workflows\release.yml - .github\workflows\stryker.yml = .github\workflows\stryker.yml + .github\workflows\test-report.yml = .github\workflows\test-report.yml EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Testably.Abstractions.FluentAssertions", "Source\Testably.Abstractions.FluentAssertions\Testably.Abstractions.FluentAssertions.csproj", "{BC318ADF-0A23-4D0F-8FBE-4E73F839450A}"