Feature/magicodes ie io pre commit review (#619) #1073
Workflow file for this run
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
| ################################################### | |
| # Magicodes.IE CI | |
| # | |
| # Architecture: | |
| # changed -> skip detection (docs-only PRs skip tests) | |
| # test -> legacy core test matrix | |
| # io-test -> IO test matrix (all platforms, net8.0+net10.0) | |
| # io-test-macos-debug -> macOS arm64 Debug CRC32 self-check | |
| # check -> alls-green gate (single required status check) | |
| # | |
| # Matrix coverage: | |
| # test: 7 OS × [net8.0, net10.0] + net9.0 × 3 + net471/net6.0 (Win) | |
| # io: 3 OS × [net8.0, net10.0] + net6.0 × 3 + net471 (Win) + macOS Debug CRC trap | |
| # Total: ~30 parallel jobs (fail-fast: false) | |
| # | |
| # Test runner conventions: | |
| # --filter Category!=Flaky exclude flaky tests (MassTransit pattern) | |
| # --logger GitHubActions native PR annotations (MassTransit pattern) | |
| # --blame-hang/crash-dump post-mortem diagnostics (Orleans pattern) | |
| # -bl binary log (Orleans pattern) | |
| # | |
| # Notes: | |
| # - macOS: Qt cocoa plugin may crash on process exit in headless CI. | |
| # We parse "Test Run Successful"/"Test Run Failed" to distinguish. | |
| # - net471 / net6.0: Windows only. | |
| # - Runner versions pinned where possible (Polly/efcore pattern). | |
| ################################################### | |
| name: CI | |
| on: | |
| push: | |
| branches: [ "develop", "release/*", "master" ] | |
| pull_request: | |
| branches: [ "develop", "release/*", "master" ] | |
| workflow_dispatch: | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| permissions: | |
| contents: read | |
| env: | |
| DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true | |
| DOTNET_CLI_TELEMETRY_OPTOUT: true | |
| DOTNET_NOLOGO: true | |
| DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 | |
| TERM: xterm | |
| TEST_PROJECT: src/Magicodes.ExporterAndImporter.Tests/Magicodes.IE.Tests.csproj | |
| jobs: | |
| # ── SKIP DETECTION ────────────────────────────── | |
| changed: | |
| name: Detect changes | |
| runs-on: ubuntu-latest | |
| outputs: | |
| should_skip: ${{ steps.skip.outputs.should_skip }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Check changed files | |
| id: filter | |
| uses: dorny/paths-filter@v3 | |
| with: | |
| filters: | | |
| code: | |
| - 'src/**' | |
| - 'tests/**' | |
| - '*.sln' | |
| - '*.props' | |
| - 'Directory.Build.*' | |
| - '.github/workflows/dotnetcore.yml' | |
| list-files: json | |
| - name: Set skip flag | |
| id: skip | |
| run: | | |
| if [ "${{ steps.filter.outputs.code }}" == "false" ]; then | |
| echo "should_skip=true" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "should_skip=false" >> "$GITHUB_OUTPUT" | |
| fi | |
| # ── LEGACY CORE TEST MATRIX ───────────────────── | |
| test: | |
| name: ${{ matrix.os }} / ${{ matrix.framework }} | |
| needs: changed | |
| if: needs.changed.outputs.should_skip != 'true' | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 20 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: | |
| - ubuntu-22.04 | |
| - ubuntu-24.04 | |
| - ubuntu-latest | |
| - windows-2022 | |
| - windows-latest | |
| - macos-15 | |
| - macos-latest | |
| framework: | |
| - net8.0 | |
| - net10.0 | |
| include: | |
| # net9.0 STS: one per OS family | |
| - { os: ubuntu-latest, framework: net9.0 } | |
| - { os: windows-latest, framework: net9.0 } | |
| - { os: macos-latest, framework: net9.0 } | |
| # Windows-only legacy frameworks | |
| - { os: windows-latest, framework: net471 } | |
| - { os: windows-latest, framework: net6.0 } | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup .NET SDK | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| dotnet-version: | | |
| 6.0.x | |
| 8.0.x | |
| 9.0.x | |
| 10.0.x | |
| cache: true | |
| cache-dependency-path: | | |
| Magicodes.IE.sln | |
| src/**/*.csproj | |
| # ── OS-specific pre-flight ── | |
| - name: Install native dependencies (Linux) | |
| if: runner.os == 'Linux' | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y --no-install-recommends \ | |
| libgdiplus libc6-dev libjpeg62 libxrender1 \ | |
| fontconfig xfonts-75dpi | |
| - name: Install wkhtmltopdf (Linux) | |
| if: runner.os == 'Linux' | |
| run: sudo apt-get install -y wkhtmltopdf || true | |
| - name: Set TEMP to D-drive (Windows speedup) | |
| if: runner.os == 'Windows' | |
| shell: pwsh | |
| run: | | |
| New-Item -Path "D:\Temp" -ItemType Directory -Force | Out-Null | |
| "TEMP=D:\Temp" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
| # ── Build & Test ── | |
| - name: Restore | |
| run: dotnet restore ${{ env.TEST_PROJECT }} | |
| - name: Build | |
| run: dotnet build ${{ env.TEST_PROJECT }} -c Release --no-restore -bl | |
| - name: Test | |
| shell: bash | |
| run: | | |
| # macOS: Qt cocoa plugin may crash on process exit in headless CI. | |
| # We tee the output and check for "Test Run Successful"/"Test Run Failed" | |
| # to distinguish real test failures from Qt cleanup crashes. | |
| dotnet test ${{ env.TEST_PROJECT }} \ | |
| -c Release --no-build \ | |
| -f ${{ matrix.framework }} \ | |
| --filter Category!=Flaky \ | |
| --blame-hang-timeout 10m \ | |
| --blame-crash-dump-type full \ | |
| --blame-hang-dump-type full \ | |
| --logger "trx;LogFileName=results-${{ matrix.framework }}.trx" \ | |
| --logger GitHubActions \ | |
| --results-directory TestResults \ | |
| 2>&1 | tee /tmp/test-output.log | |
| EXIT=${PIPESTATUS[0]} | |
| if [ $EXIT -ne 0 ]; then | |
| if [ "$RUNNER_OS" = "macOS" ] && grep -q "Test Run Successful\." /tmp/test-output.log; then | |
| echo "::warning::Test process exit $EXIT (Qt cocoa plugin cleanup); all tests passed" | |
| else | |
| echo "::error::Test run failed (exit $EXIT)" | |
| exit 1 | |
| fi | |
| fi | |
| - name: Upload test results | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: test-results-${{ runner.os }}-${{ matrix.framework }} | |
| path: TestResults | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| - name: Upload build log | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: build-log-${{ runner.os }}-${{ matrix.framework }} | |
| path: msbuild.binlog | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| # ── IO TEST MATRIX ────────────────────────────── | |
| io-test: | |
| name: IO ${{ matrix.os }} / ${{ matrix.framework }} | |
| needs: changed | |
| if: needs.changed.outputs.should_skip != 'true' | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 15 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, windows-latest, macos-latest] | |
| framework: [net8.0, net10.0] | |
| include: | |
| - { os: ubuntu-latest, framework: net6.0 } | |
| - { os: windows-latest, framework: net6.0 } | |
| - { os: macos-latest, framework: net6.0 } | |
| - { os: windows-latest, framework: net471 } | |
| env: | |
| IO_TEST_PROJECT: tests/Magicodes.IE.IO.Tests/Magicodes.IE.IO.Tests.csproj | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup .NET SDK | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| dotnet-version: | | |
| 6.0.x | |
| 8.0.x | |
| 10.0.x | |
| cache: true | |
| cache-dependency-path: | | |
| Magicodes.IE.sln | |
| src/**/*.csproj | |
| - name: Restore | |
| run: dotnet restore ${{ env.IO_TEST_PROJECT }} | |
| - name: Build | |
| run: dotnet build ${{ env.IO_TEST_PROJECT }} -c Release --no-restore -bl | |
| - name: Test | |
| run: > | |
| dotnet test ${{ env.IO_TEST_PROJECT }} | |
| -c Release --no-build | |
| -f ${{ matrix.framework }} | |
| --filter Category!=Flaky | |
| --blame-hang-timeout 10m | |
| --blame-crash-dump-type full | |
| --blame-hang-dump-type full | |
| --logger "trx;LogFileName=results-io-${{ matrix.framework }}.trx" | |
| --logger GitHubActions | |
| --results-directory TestResults | |
| - name: Upload test results | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: io-test-results-${{ matrix.os }}-${{ matrix.framework }} | |
| path: TestResults | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| - name: Upload build log | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: io-build-log-${{ matrix.os }}-${{ matrix.framework }} | |
| path: msbuild.binlog | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| # ── IO CRC32 SELF-CHECK (macOS arm64 / Debug) ── | |
| # | |
| # ForwardOnlyZipWriter has an #if DEBUG CRC32 self-check | |
| # ("123456789" => 0xCBF43926). A wrong arm64 CRC throws at | |
| # assembly load. Release CRC is still exercised by ZipArchive | |
| # reopen assertions in the io-test matrix above. | |
| io-test-macos-debug: | |
| name: IO Debug (macOS arm64 CRC check) | |
| needs: changed | |
| if: needs.changed.outputs.should_skip != 'true' | |
| runs-on: macos-latest | |
| timeout-minutes: 15 | |
| env: | |
| IO_TEST_PROJECT: tests/Magicodes.IE.IO.Tests/Magicodes.IE.IO.Tests.csproj | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup .NET SDK | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| dotnet-version: 8.0.x | |
| cache: true | |
| cache-dependency-path: | | |
| Magicodes.IE.sln | |
| src/**/*.csproj | |
| - name: Restore | |
| run: dotnet restore ${{ env.IO_TEST_PROJECT }} | |
| - name: Build | |
| run: dotnet build ${{ env.IO_TEST_PROJECT }} -c Debug --no-restore -bl | |
| - name: Test | |
| shell: bash | |
| run: | | |
| set +e | |
| dotnet test ${{ env.IO_TEST_PROJECT }} \ | |
| -c Debug --no-build \ | |
| -f net8.0 \ | |
| --filter Category!=Flaky \ | |
| --blame-hang-timeout 10m \ | |
| --blame-crash-dump-type full \ | |
| --blame-hang-dump-type full \ | |
| --logger "trx;LogFileName=results-io-macos-debug.trx" \ | |
| --logger GitHubActions \ | |
| --results-directory TestResults | |
| EXIT=$? | |
| set -e | |
| if [ $EXIT -ne 0 ]; then | |
| echo "::error::IO tests failed on macOS arm64 (Debug CRC self-check active)" | |
| exit 1 | |
| fi | |
| - name: Upload test results | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: io-test-results-macos-debug | |
| path: TestResults | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| - name: Upload build log | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: io-build-log-macos-debug | |
| path: msbuild.binlog | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| # ── ALLS-GREEN GATE ───────────────────────────── | |
| check: | |
| name: CI Passed | |
| if: always() | |
| needs: [changed, test, io-test, io-test-macos-debug] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: re-actors/alls-green@release/v1 | |
| with: | |
| allowed-skips: >- | |
| ${{ | |
| needs.changed.outputs.should_skip == 'true' | |
| && 'test,io-test,io-test-macos-debug' | |
| || '' | |
| }} | |
| jobs: ${{ toJSON(needs) }} |