# .gitea/workflows/test-matrix.yml # Unified test matrix pipeline with TRX reporting for all test categories # Sprint: SPRINT_20251226_003_CICD name: Test Matrix on: push: branches: [main] paths-ignore: - 'docs/**' - '*.md' pull_request: paths-ignore: - 'docs/**' - '*.md' schedule: - cron: '0 5 * * *' # Daily at 5 AM UTC workflow_dispatch: inputs: include_performance: description: 'Include performance tests' type: boolean default: false include_benchmark: description: 'Include benchmark tests' type: boolean default: false include_airgap: description: 'Include airgap tests' type: boolean default: false include_chaos: description: 'Include chaos tests' type: boolean default: false env: DOTNET_VERSION: '10.0.100' DOTNET_NOLOGO: 1 DOTNET_CLI_TELEMETRY_OPTOUT: 1 DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: 1 TZ: UTC jobs: # =========================================================================== # PR-GATING TESTS (run on every push/PR) # =========================================================================== unit: name: Unit Tests runs-on: ubuntu-22.04 timeout-minutes: 15 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} include-prerelease: true - name: Restore run: dotnet restore src/StellaOps.sln - name: Build run: dotnet build src/StellaOps.sln -c Release --no-restore - name: Run Unit Tests run: | dotnet test src/StellaOps.sln \ --filter "Category=Unit" \ --configuration Release \ --no-build \ --logger "trx;LogFileName=unit-tests.trx" \ --results-directory ./TestResults/Unit \ --collect:"XPlat Code Coverage" - name: Upload Test Results uses: actions/upload-artifact@v4 if: always() with: name: test-results-unit path: ./TestResults/Unit retention-days: 14 architecture: name: Architecture Tests runs-on: ubuntu-22.04 timeout-minutes: 10 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} include-prerelease: true - name: Restore run: dotnet restore src/StellaOps.sln - name: Build run: dotnet build src/StellaOps.sln -c Release --no-restore - name: Run Architecture Tests run: | dotnet test src/StellaOps.sln \ --filter "Category=Architecture" \ --configuration Release \ --no-build \ --logger "trx;LogFileName=architecture-tests.trx" \ --results-directory ./TestResults/Architecture - name: Upload Test Results uses: actions/upload-artifact@v4 if: always() with: name: test-results-architecture path: ./TestResults/Architecture retention-days: 14 contract: name: Contract Tests runs-on: ubuntu-22.04 timeout-minutes: 10 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} include-prerelease: true - name: Restore run: dotnet restore src/StellaOps.sln - name: Build run: dotnet build src/StellaOps.sln -c Release --no-restore - name: Run Contract Tests run: | dotnet test src/StellaOps.sln \ --filter "Category=Contract" \ --configuration Release \ --no-build \ --logger "trx;LogFileName=contract-tests.trx" \ --results-directory ./TestResults/Contract - name: Upload Test Results uses: actions/upload-artifact@v4 if: always() with: name: test-results-contract path: ./TestResults/Contract retention-days: 14 integration: name: Integration Tests runs-on: ubuntu-22.04 timeout-minutes: 30 services: postgres: image: postgres:16 env: POSTGRES_USER: stellaops POSTGRES_PASSWORD: stellaops POSTGRES_DB: stellaops_test ports: - 5432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} include-prerelease: true - name: Restore run: dotnet restore src/StellaOps.sln - name: Build run: dotnet build src/StellaOps.sln -c Release --no-restore - name: Run Integration Tests env: STELLAOPS_TEST_POSTGRES_CONNECTION: "Host=localhost;Port=5432;Database=stellaops_test;Username=stellaops;Password=stellaops" run: | dotnet test src/StellaOps.sln \ --filter "Category=Integration" \ --configuration Release \ --no-build \ --logger "trx;LogFileName=integration-tests.trx" \ --results-directory ./TestResults/Integration - name: Upload Test Results uses: actions/upload-artifact@v4 if: always() with: name: test-results-integration path: ./TestResults/Integration retention-days: 14 security: name: Security Tests runs-on: ubuntu-22.04 timeout-minutes: 20 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} include-prerelease: true - name: Restore run: dotnet restore src/StellaOps.sln - name: Build run: dotnet build src/StellaOps.sln -c Release --no-restore - name: Run Security Tests run: | dotnet test src/StellaOps.sln \ --filter "Category=Security" \ --configuration Release \ --no-build \ --logger "trx;LogFileName=security-tests.trx" \ --results-directory ./TestResults/Security - name: Upload Test Results uses: actions/upload-artifact@v4 if: always() with: name: test-results-security path: ./TestResults/Security retention-days: 14 golden: name: Golden Tests runs-on: ubuntu-22.04 timeout-minutes: 20 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} include-prerelease: true - name: Restore run: dotnet restore src/StellaOps.sln - name: Build run: dotnet build src/StellaOps.sln -c Release --no-restore - name: Run Golden Tests run: | dotnet test src/StellaOps.sln \ --filter "Category=Golden" \ --configuration Release \ --no-build \ --logger "trx;LogFileName=golden-tests.trx" \ --results-directory ./TestResults/Golden - name: Upload Test Results uses: actions/upload-artifact@v4 if: always() with: name: test-results-golden path: ./TestResults/Golden retention-days: 14 # =========================================================================== # SCHEDULED/ON-DEMAND TESTS # =========================================================================== performance: name: Performance Tests runs-on: ubuntu-22.04 timeout-minutes: 30 if: github.event_name == 'schedule' || github.event.inputs.include_performance == 'true' steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} include-prerelease: true - name: Restore run: dotnet restore src/StellaOps.sln - name: Build run: dotnet build src/StellaOps.sln -c Release --no-restore - name: Run Performance Tests run: | dotnet test src/StellaOps.sln \ --filter "Category=Performance" \ --configuration Release \ --no-build \ --logger "trx;LogFileName=performance-tests.trx" \ --results-directory ./TestResults/Performance - name: Upload Test Results uses: actions/upload-artifact@v4 if: always() with: name: test-results-performance path: ./TestResults/Performance retention-days: 14 benchmark: name: Benchmark Tests runs-on: ubuntu-22.04 timeout-minutes: 45 if: github.event_name == 'schedule' || github.event.inputs.include_benchmark == 'true' steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} include-prerelease: true - name: Restore run: dotnet restore src/StellaOps.sln - name: Build run: dotnet build src/StellaOps.sln -c Release --no-restore - name: Run Benchmark Tests run: | dotnet test src/StellaOps.sln \ --filter "Category=Benchmark" \ --configuration Release \ --no-build \ --logger "trx;LogFileName=benchmark-tests.trx" \ --results-directory ./TestResults/Benchmark - name: Upload Test Results uses: actions/upload-artifact@v4 if: always() with: name: test-results-benchmark path: ./TestResults/Benchmark retention-days: 14 airgap: name: AirGap Tests runs-on: ubuntu-22.04 timeout-minutes: 30 if: github.event.inputs.include_airgap == 'true' steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} include-prerelease: true - name: Restore run: dotnet restore src/StellaOps.sln - name: Build run: dotnet build src/StellaOps.sln -c Release --no-restore - name: Run AirGap Tests run: | dotnet test src/StellaOps.sln \ --filter "Category=AirGap" \ --configuration Release \ --no-build \ --logger "trx;LogFileName=airgap-tests.trx" \ --results-directory ./TestResults/AirGap - name: Upload Test Results uses: actions/upload-artifact@v4 if: always() with: name: test-results-airgap path: ./TestResults/AirGap retention-days: 14 chaos: name: Chaos Tests runs-on: ubuntu-22.04 timeout-minutes: 30 if: github.event.inputs.include_chaos == 'true' steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} include-prerelease: true - name: Restore run: dotnet restore src/StellaOps.sln - name: Build run: dotnet build src/StellaOps.sln -c Release --no-restore - name: Run Chaos Tests run: | dotnet test src/StellaOps.sln \ --filter "Category=Chaos" \ --configuration Release \ --no-build \ --logger "trx;LogFileName=chaos-tests.trx" \ --results-directory ./TestResults/Chaos - name: Upload Test Results uses: actions/upload-artifact@v4 if: always() with: name: test-results-chaos path: ./TestResults/Chaos retention-days: 14 # =========================================================================== # SUMMARY JOB # =========================================================================== summary: name: Test Summary runs-on: ubuntu-22.04 needs: [unit, architecture, contract, integration, security, golden] if: always() steps: - name: Download all test results uses: actions/download-artifact@v4 with: pattern: test-results-* path: ./TestResults - name: Install trx2junit run: dotnet tool install -g trx2junit - name: Convert TRX to JUnit run: | find ./TestResults -name "*.trx" -exec trx2junit {} \; || true - name: Generate Summary run: | echo "## Test Results Summary" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "| Category | Status |" >> $GITHUB_STEP_SUMMARY echo "|----------|--------|" >> $GITHUB_STEP_SUMMARY echo "| Unit | ${{ needs.unit.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Architecture | ${{ needs.architecture.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Contract | ${{ needs.contract.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Integration | ${{ needs.integration.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Security | ${{ needs.security.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Golden | ${{ needs.golden.result }} |" >> $GITHUB_STEP_SUMMARY - name: Upload Combined Results uses: actions/upload-artifact@v4 with: name: test-results-combined path: ./TestResults retention-days: 14 - name: Check for failures if: contains(needs.*.result, 'failure') run: exit 1