diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bf2d097c..88399f3c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,10 +19,6 @@ env: jobs: build: runs-on: ubuntu-latest - # allow to run concurrently within separate branches - concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true steps: - name: PR - Checkout if: github.event_name == 'pull_request_target' @@ -37,37 +33,24 @@ jobs: with: fetch-depth: 0 - - name: Setup .NET 8.0 + - name: Setup .NET 9.0 uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x cache: false - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 9.0.x - cache: false - - - name: Restore dependencies - run: dotnet restore $SOLUTION_NAME - working-directory: ./src - - name: SonarCloud - Setup Java17 - #if: github.event_name == 'pull_request_target' uses: actions/setup-java@v4 with: distribution: "adopt" java-version: "17" - - name: SonarCloud - Install SonarCloud scanner - #if: github.event_name == 'pull_request_target' + - name: Install SonarCloud Scanner run: dotnet tool update dotnet-sonarscanner --tool-path ./.sonar/scanner - - name: SonarCloud - SonarScanner Begin - #if: github.event_name == 'pull_request_target' + - name: SonarCloud - Begin Analysis env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} run: | params="" @@ -75,36 +58,190 @@ jobs: if [[ -n "$pr_number" ]]; then params="/d:sonar.pullrequest.key=${pr_number}" fi - ../.sonar/scanner/dotnet-sonarscanner begin /k:"zarusz_SlimMessageBus" /o:"zarusz" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" /d:sonar.exclusions="Samples/**/*,Tests/**/*" $params + ../.sonar/scanner/dotnet-sonarscanner begin \ + /k:"zarusz_SlimMessageBus" /o:"zarusz" \ + /d:sonar.token="${{ secrets.SONAR_TOKEN }}" \ + /d:sonar.host.url="https://sonarcloud.io" \ + /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" \ + /d:sonar.exclusions="Samples/**/*,Tests/**/*" \ + $params + working-directory: ./src + + - name: Restore Dependencies + run: dotnet restore $SOLUTION_NAME working-directory: ./src - name: Build - run: | - dotnet build $SOLUTION_NAME \ - --configuration $SOLUTION_CONFIGURATION \ - --no-restore + run: dotnet build $SOLUTION_NAME --configuration $SOLUTION_CONFIGURATION --no-restore working-directory: ./src - - name: Unit Tests + unit_tests: + runs-on: ubuntu-latest + steps: + - name: PR - Checkout + if: github.event_name == 'pull_request_target' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + + - name: Checkout + if: github.event_name != 'pull_request_target' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET 8.0 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + cache: false + + - name: Setup .NET 9.0 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + cache: false + + # - name: SonarCloud - Setup Java17 + # #if: github.event_name == 'pull_request_target' + # uses: actions/setup-java@v4 + # with: + # distribution: "adopt" + # java-version: "17" + + # - name: Install SonarCloud Scanner + # #if: github.event_name == 'pull_request_target' + # run: dotnet tool update dotnet-sonarscanner --tool-path ./.sonar/scanner + + # - name: SonarCloud - Begin Analysis + # #if: github.event_name == 'pull_request_target' + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + # run: | + # params="" + # pr_number="${{ github.event.pull_request.number }}" + # if [[ -n "$pr_number" ]]; then + # params="/d:sonar.pullrequest.key=${pr_number}" + # fi + # ../.sonar/scanner/dotnet-sonarscanner begin \ + # /k:"zarusz_SlimMessageBus" /o:"zarusz" \ + # /d:sonar.token="${{ secrets.SONAR_TOKEN }}" \ + # /d:sonar.host.url="https://sonarcloud.io" \ + # /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" \ + # /d:sonar.exclusions="Samples/**/*,Tests/**/*" \ + # $params + # working-directory: ./src + + # - name: Restore Dependencies + # run: dotnet restore $SOLUTION_NAME + # working-directory: ./src + + # - name: Build + # run: dotnet build $SOLUTION_NAME --configuration $SOLUTION_CONFIGURATION --no-restore + # working-directory: ./src + + - name: Run Unit Tests run: | dotnet test $SOLUTION_NAME \ --configuration $SOLUTION_CONFIGURATION \ - --no-build \ --verbosity normal \ --logger "trx;LogFilePrefix=Unit" \ --collect:"XPlat Code Coverage;Format=opencover" \ --filter "Category!=Integration" working-directory: ./src - - name: Integration Tests - Infrastructure + - name: Collect Unit Test Coverage + if: success() || failure() + run: | + mkdir -p ./coverage/unit + find ./src -name "coverage.opencover.xml" -exec cp {} ./coverage/unit/ \; + + - name: Upload Unit Test Coverage + uses: actions/upload-artifact@v4 + with: + name: unit-test-coverage + path: ./coverage/unit + + integration_tests: + runs-on: ubuntu-latest + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + steps: + - name: PR - Checkout + if: github.event_name == 'pull_request_target' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + + - name: Checkout + if: github.event_name != 'pull_request_target' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET 8.0 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + cache: false + + - name: Setup .NET 9.0 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + cache: false + + # - name: SonarCloud - Setup Java17 + # #if: github.event_name == 'pull_request_target' + # uses: actions/setup-java@v4 + # with: + # distribution: "adopt" + # java-version: "17" + + # - name: Install SonarCloud Scanner + # #if: github.event_name == 'pull_request_target' + # run: dotnet tool update dotnet-sonarscanner --tool-path ./.sonar/scanner + + # - name: SonarCloud - Begin Analysis + # #if: github.event_name == 'pull_request_target' + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + # run: | + # params="" + # pr_number="${{ github.event.pull_request.number }}" + # if [[ -n "$pr_number" ]]; then + # params="/d:sonar.pullrequest.key=${pr_number}" + # fi + # ../.sonar/scanner/dotnet-sonarscanner begin \ + # /k:"zarusz_SlimMessageBus" /o:"zarusz" \ + # /d:sonar.token="${{ secrets.SONAR_TOKEN }}" \ + # /d:sonar.host.url="https://sonarcloud.io" \ + # /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" \ + # /d:sonar.exclusions="Samples/**/*,Tests/**/*" \ + # $params + # working-directory: ./src + + # - name: Restore Dependencies + # run: dotnet restore $SOLUTION_NAME + # working-directory: ./src + + # - name: Build + # run: dotnet build $SOLUTION_NAME --configuration $SOLUTION_CONFIGURATION --no-restore + # working-directory: ./src + + - name: Run Integration Tests - Infrastructure Setup run: | docker compose -f src/Infrastructure/docker-compose.yml up --detach --force-recreate -V - - name: Integration Tests + - name: Run Integration Tests run: | dotnet test $SOLUTION_NAME \ --configuration $SOLUTION_CONFIGURATION \ - --no-build \ --verbosity normal \ --logger "trx;LogFilePrefix=Integration" \ --collect:"XPlat Code Coverage;Format=opencover" \ @@ -158,54 +295,97 @@ jobs: nats_endpoint: "nats://localhost:4222" - - name: SonarCloud - SonarScanner End - #if: github.event_name == 'pull_request_target' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: ../.sonar/scanner/dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" - working-directory: ./src - - - name: Collect test results and rename + - name: Collect Integration Test Coverage if: success() || failure() run: | - mkdir -p ./test-results - # Find all the .trx files recursively and copy them to the test-results folder - # Use the grandparent directory name and filename - find ./src -name "*.trx" | while read file; do - # The grand parent will correspond to the csproj name e.g. SlimMessageBus.Host.Tests - grandparent_dir=$(basename $(dirname $(dirname "$file"))) - filename=$(basename "$file") - # Copy the file and use grandparent_dir and index as the new filename - cp "$file" "./test-results/${grandparent_dir}_${filename}" - done - - - name: Upload Test Results - if: success() || failure() + mkdir -p ./coverage/integration + find ./src -name "coverage.opencover.xml" -exec cp {} ./coverage/integration/ \; + + - name: Upload Integration Test Coverage uses: actions/upload-artifact@v4 with: - name: test-results - path: ./test-results + name: integration-test-coverage + path: ./coverage/integration - - name: Publish Test Results - if: success() || failure() - uses: dorny/test-reporter@v1 + sonarcloud_end: + runs-on: ubuntu-latest + needs: [build, unit_tests, integration_tests] + steps: + - name: Checkout + uses: actions/checkout@v4 with: - name: .NET Tests - path: ./test-results/*.trx - reporter: dotnet-trx - fail-on-error: true + fetch-depth: 0 - - name: Copy NuGet packages - shell: bash - run: | - mkdir ./dist - find -name "*.nupkg" -exec cp {} ./dist \; - find -name "*.snupkg" -exec cp {} ./dist \; - find ./dist + - name: Setup Java for SonarCloud + uses: actions/setup-java@v4 + with: + distribution: "adopt" + java-version: "17" - - name: Archive NuGet packages - uses: actions/upload-artifact@v4 + - name: Download Unit Test Coverage + uses: actions/download-artifact@v4 + with: + name: unit-test-coverage + path: ./coverage/unit + + - name: Download Integration Test Coverage + uses: actions/download-artifact@v4 with: - name: nuget-packages - path: "./dist" + name: integration-test-coverage + path: ./coverage/integration + + - name: SonarCloud - End Analysis + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: ../.sonar/scanner/dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" + working-directory: ./src +# publish_test_results: +# runs-on: ubuntu-latest +# concurrency: +# group: ${{ github.workflow }}-${{ github.ref }} +# cancel-in-progress: true +# steps: +# - name: Collect test results and rename +# if: success() || failure() +# run: | +# mkdir -p ./test-results +# # Find all the .trx files recursively and copy them to the test-results folder +# # Use the grandparent directory name and filename +# find ./src -name "*.trx" | while read file; do +# # The grand parent will correspond to the csproj name e.g. SlimMessageBus.Host.Tests +# grandparent_dir=$(basename $(dirname $(dirname "$file"))) +# filename=$(basename "$file") +# # Copy the file and use grandparent_dir and index as the new filename +# cp "$file" "./test-results/${grandparent_dir}_${filename}" +# done + +# - name: Upload Test Results +# if: success() || failure() +# uses: actions/upload-artifact@v4 +# with: +# name: test-results +# path: ./test-results + +# - name: Publish Test Results +# if: success() || failure() +# uses: dorny/test-reporter@v1 +# with: +# name: .NET Tests +# path: ./test-results/*.trx +# reporter: dotnet-trx +# fail-on-error: true + +# - name: Copy NuGet packages +# shell: bash +# run: | +# mkdir ./dist +# find -name "*.nupkg" -exec cp {} ./dist \; +# find -name "*.snupkg" -exec cp {} ./dist \; +# find ./dist + +# - name: Archive NuGet packages +# uses: actions/upload-artifact@v4 +# with: +# name: nuget-packages +# path: "./dist"