Fixed delist script #29
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build & Run Unit Tests | |
| on: | |
| push: | |
| branches: [ v2_release, v2_develop ] | |
| paths-ignore: | |
| - '**.md' | |
| pull_request: | |
| branches: [ v2_release, v2_develop ] | |
| paths-ignore: | |
| - '**.md' | |
| jobs: | |
| # Call the quick-build workflow to build Debug configuration only | |
| build: | |
| uses: ./.github/workflows/quick-build.yml | |
| non_parallel_unittests: | |
| name: Non-Parallel Unit Tests | |
| runs-on: ${{ matrix.os }} | |
| needs: build | |
| strategy: | |
| # Turn off fail-fast to let all runners run even if there are errors | |
| fail-fast: false | |
| matrix: | |
| os: [ ubuntu-latest, windows-latest, macos-latest ] | |
| timeout-minutes: 15 # Increased from 10 for Windows | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup .NET Core | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| dotnet-version: 10.x | |
| dotnet-quality: 'ga' | |
| - name: Download build artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: test-build-artifacts | |
| path: . | |
| # KEEP THIS - It's needed for --no-build to work | |
| - name: Restore NuGet packages | |
| run: dotnet restore | |
| # Optimize Windows performance | |
| - name: Disable Windows Defender (Windows only) | |
| if: runner.os == 'Windows' | |
| shell: powershell | |
| run: | | |
| Add-MpPreference -ExclusionPath "${{ github.workspace }}" | |
| Add-MpPreference -ExclusionProcess "dotnet.exe" | |
| Add-MpPreference -ExclusionProcess "testhost.exe" | |
| Add-MpPreference -ExclusionProcess "VSTest.Console.exe" | |
| - name: Set VSTEST_DUMP_PATH | |
| shell: bash | |
| run: echo "VSTEST_DUMP_PATH=logs/UnitTests/${{ runner.os }}/" >> $GITHUB_ENV | |
| - name: Run UnitTests | |
| shell: bash | |
| run: | | |
| if [ "${{ runner.os }}" == "Linux" ]; then | |
| # Run with coverage on Linux only | |
| dotnet test Tests/UnitTests \ | |
| --no-build \ | |
| --verbosity normal \ | |
| --collect:"XPlat Code Coverage" \ | |
| --settings Tests/UnitTests/runsettings.xml \ | |
| --diag:logs/UnitTests/${{ runner.os }}/logs.txt \ | |
| --blame \ | |
| --blame-crash \ | |
| --blame-hang \ | |
| --blame-hang-timeout 60s \ | |
| --blame-crash-collect-always | |
| else | |
| # Run without coverage on Windows/macOS for speed | |
| dotnet test Tests/UnitTests \ | |
| --no-build \ | |
| --verbosity normal \ | |
| --settings Tests/UnitTests/runsettings.xml \ | |
| --diag:logs/UnitTests/${{ runner.os }}/logs.txt \ | |
| --blame \ | |
| --blame-crash \ | |
| --blame-hang \ | |
| --blame-hang-timeout 120s \ | |
| --blame-crash-collect-always | |
| fi | |
| - name: Upload Test Logs | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: non_parallel_unittests-logs-${{ runner.os }} | |
| path: | | |
| logs/UnitTests/ | |
| Tests/UnitTests/logs/ | |
| TestResults/ | |
| **/*.dmp | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| - name: Upload Non-Parallel UnitTests Coverage to Codecov | |
| if: matrix.os == 'ubuntu-latest' && always() | |
| uses: codecov/codecov-action@v4 | |
| with: | |
| files: TestResults/**/coverage.cobertura.xml | |
| flags: unittests-nonparallel | |
| name: UnitTests-${{ runner.os }} | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| fail_ci_if_error: false | |
| parallel_unittests: | |
| name: Parallel Unit Tests | |
| runs-on: ${{ matrix.os }} | |
| needs: build | |
| strategy: | |
| # Turn off fail-fast to let all runners run even if there are errors | |
| fail-fast: false | |
| matrix: | |
| os: [ ubuntu-latest, windows-latest, macos-latest ] | |
| timeout-minutes: 60 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup .NET Core | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| dotnet-version: 10.x | |
| dotnet-quality: 'ga' | |
| - name: Download build artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: test-build-artifacts | |
| path: . | |
| - name: Restore NuGet packages | |
| run: dotnet restore | |
| - name: Disable Windows Defender (Windows only) | |
| if: runner.os == 'Windows' | |
| shell: powershell | |
| run: | | |
| Add-MpPreference -ExclusionPath "${{ github.workspace }}" | |
| Add-MpPreference -ExclusionProcess "dotnet.exe" | |
| Add-MpPreference -ExclusionProcess "testhost.exe" | |
| Add-MpPreference -ExclusionProcess "VSTest.Console.exe" | |
| - name: Set VSTEST_DUMP_PATH | |
| shell: bash | |
| run: echo "VSTEST_DUMP_PATH=logs/UnitTestsParallelizable/${{ runner.os }}/" >> $GITHUB_ENV | |
| - name: Run UnitTestsParallelizable | |
| shell: bash | |
| run: | | |
| # Detect CPU count and calculate optimal thread count | |
| if [ "${{ runner.os }}" == "Linux" ]; then | |
| CPU_COUNT=$(nproc) | |
| elif [ "${{ runner.os }}" == "macOS" ]; then | |
| CPU_COUNT=$(sysctl -n hw.ncpu) | |
| else # Windows | |
| CPU_COUNT=$NUMBER_OF_PROCESSORS | |
| fi | |
| # Use 2x CPU count for I/O-bound tests, capped at reasonable max | |
| # macOS uses lower cap (4) to prevent thread pool exhaustion | |
| MAX_THREADS=$((CPU_COUNT * 2)) | |
| if [ "${{ runner.os }}" == "macOS" ]; then | |
| if [ $MAX_THREADS -gt 4 ]; then | |
| MAX_THREADS=2 | |
| fi | |
| HANG_TIMEOUT="240s" | |
| else | |
| if [ $MAX_THREADS -gt 16 ]; then | |
| MAX_THREADS=16 | |
| fi | |
| HANG_TIMEOUT="60s" | |
| fi | |
| echo "Detected $CPU_COUNT CPUs, using $MAX_THREADS parallel threads" | |
| # Run tests with dynamic thread count | |
| if [ "${{ runner.os }}" == "Linux" ]; then | |
| dotnet test Tests/UnitTestsParallelizable \ | |
| --no-build \ | |
| --verbosity normal \ | |
| --collect:"XPlat Code Coverage" \ | |
| --settings Tests/UnitTests/runsettings.coverage.xml \ | |
| --diag:logs/UnitTestsParallelizable/${{ runner.os }}/logs.txt \ | |
| --blame \ | |
| --blame-crash \ | |
| --blame-hang \ | |
| --blame-hang-timeout $HANG_TIMEOUT \ | |
| --blame-crash-collect-always \ | |
| -- xUnit.MaxParallelThreads=$MAX_THREADS \ | |
| -- xUnit.StopOnFail=true | |
| else | |
| dotnet test Tests/UnitTestsParallelizable \ | |
| --no-build \ | |
| --verbosity normal \ | |
| --settings Tests/UnitTestsParallelizable/runsettings.xml \ | |
| --diag:logs/UnitTestsParallelizable/${{ runner.os }}/logs.txt \ | |
| --blame \ | |
| --blame-crash \ | |
| --blame-hang \ | |
| --blame-hang-timeout $HANG_TIMEOUT \ | |
| --blame-crash-collect-always \ | |
| -- xUnit.MaxParallelThreads=$MAX_THREADS \ | |
| -- xUnit.StopOnFail=true | |
| fi | |
| echo "============================================" | |
| echo "Parallel unit tests completed successfully!" | |
| echo "============================================" | |
| - name: Upload UnitTestsParallelizable Logs | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: parallel_unittests-logs-${{ runner.os }} | |
| path: | | |
| logs/UnitTestsParallelizable/ | |
| Tests/UnitTestsParallelizable/logs/ | |
| TestResults/ | |
| **/*.dmp | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| - name: Upload Parallelizable UnitTests Coverage to Codecov | |
| if: matrix.os == 'ubuntu-latest' && always() | |
| uses: codecov/codecov-action@v4 | |
| with: | |
| files: TestResults/**/coverage.cobertura.xml | |
| flags: unittests-parallel | |
| name: UnitTestsParallelizable-${{ runner.os }} | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| fail_ci_if_error: false |