Repository navigation
Preserve active benchmark cohorts across automatic pushes #294
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 and Tests | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| workflow_dispatch: | |
| workflow_call: | |
| env: | |
| KEYLOAD_TEST_CONFIGURATION: Release | |
| permissions: | |
| contents: read | |
| # Shards and lanes come from scripts/Features/TestInfrastructure/ci-test-shards.json (ADR-148). | |
| # Test jobs build the whole solution: unit CodeQuality checks read every project's compiled image and | |
| # the cold bootstrap topology test launches src/KeyLoad.Cli, which the test projects do not reference. | |
| jobs: | |
| build: | |
| name: Strict Release build and compiled test inventory | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 30 | |
| steps: | |
| - name: Download source code | |
| uses: actions/checkout@v7 | |
| - name: Set up .NET | |
| uses: actions/setup-dotnet@v6 | |
| with: | |
| global-json-file: global.json | |
| - name: Check repository and website source inventory | |
| run: | | |
| node scripts/Features/RepositoryGovernance/verify.mjs | |
| node scripts/Features/BenchmarkComparisons/session-source-closure.mjs --verify=scripts/Features/BenchmarkComparisons/site-isolated-dependencies.txt | |
| - name: Check test shard partition | |
| run: node scripts/Features/TestInfrastructure/ci-test-shards.mjs verify | |
| - name: Build | |
| run: dotnet build KeyLoad.slnx --configuration "$KEYLOAD_TEST_CONFIGURATION" -warnaserror | |
| - name: Check compiled TUnit shard inventory | |
| run: node --test scripts/Features/TestInfrastructure/ci-test-inventory.test.mjs | |
| - name: Check compiled unit inventory and coverage selectors | |
| shell: pwsh | |
| run: | | |
| $evidence = Join-Path $PWD 'tests/KeyLoad.FunctionalTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/ci-inventory' | |
| New-Item -ItemType Directory -Path $evidence -ErrorAction Stop | Out-Null | |
| & ./scripts/Features/CodeQuality/functional-coverage.workflow-discovery.ps1 -Repository $PWD -EvidenceRoot $evidence | |
| - name: Save compiled discovery evidence | |
| if: ${{ always() }} | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: compiled-test-discovery | |
| path: | | |
| tests/KeyLoad.FunctionalTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/ci-inventory | |
| tests/*/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/compiled-shard-inventory-* | |
| if-no-files-found: warn | |
| retention-days: 30 | |
| shards: | |
| name: Plan named test groups | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 5 | |
| outputs: | |
| functional: ${{ steps.plan.outputs.functional }} | |
| cluster: ${{ steps.plan.outputs.cluster }} | |
| steps: | |
| - name: Download source code | |
| uses: actions/checkout@v7 | |
| - name: Read the shard manifest | |
| id: plan | |
| run: | | |
| echo "functional=$(node scripts/Features/TestInfrastructure/ci-test-shards.mjs matrix functional)" >> "$GITHUB_OUTPUT" | |
| echo "cluster=$(node scripts/Features/TestInfrastructure/ci-test-shards.mjs matrix cluster)" >> "$GITHUB_OUTPUT" | |
| functional: | |
| name: Functional tests – ${{ matrix.name }} | |
| needs: shards | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 30 | |
| strategy: | |
| fail-fast: false | |
| matrix: ${{ fromJSON(needs.shards.outputs.functional) }} | |
| env: | |
| SHARD: ${{ matrix.shard }} | |
| steps: | |
| - name: Download source code | |
| uses: actions/checkout@v7 | |
| - name: Set up .NET | |
| uses: actions/setup-dotnet@v6 | |
| with: | |
| global-json-file: global.json | |
| - name: Build | |
| run: dotnet build KeyLoad.slnx --configuration "$KEYLOAD_TEST_CONFIGURATION" -warnaserror | |
| - name: Test functional operations | |
| run: node scripts/Features/TestInfrastructure/ci-test-shards.mjs run "$SHARD" --results-directory "$GITHUB_WORKSPACE/tests/KeyLoad.FunctionalTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/ci-results" | |
| - name: Save test results | |
| if: ${{ always() }} | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: test-results-functional-${{ matrix.shard }} | |
| path: tests/KeyLoad.FunctionalTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/ci-results | |
| if-no-files-found: warn | |
| retention-days: 30 | |
| overwrite: true | |
| analyzers-recovery: | |
| name: Analyzers and process recovery | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 30 | |
| steps: | |
| - name: Download source code | |
| uses: actions/checkout@v7 | |
| - name: Set up .NET | |
| uses: actions/setup-dotnet@v6 | |
| with: | |
| global-json-file: global.json | |
| - name: Build | |
| run: dotnet build KeyLoad.slnx --configuration "$KEYLOAD_TEST_CONFIGURATION" -warnaserror | |
| - name: Test code analyzers | |
| run: node scripts/Features/TestInfrastructure/ci-test-shards.mjs run compiler-analyzers --results-directory "$GITHUB_WORKSPACE/tests/KeyLoad.AnalyzerTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/ci-results" | |
| - name: Test process recovery | |
| if: ${{ !cancelled() }} | |
| run: node scripts/Features/TestInfrastructure/ci-test-shards.mjs run process-crash-recovery --results-directory "$GITHUB_WORKSPACE/tests/KeyLoad.ProcessRecoveryTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/ci-results" | |
| - name: Save test results | |
| if: ${{ always() }} | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: test-results-analyzers-recovery | |
| path: | | |
| tests/KeyLoad.AnalyzerTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/ci-results | |
| tests/KeyLoad.ProcessRecoveryTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/ci-results | |
| if-no-files-found: warn | |
| retention-days: 30 | |
| overwrite: true | |
| cluster: | |
| name: Cluster tests – ${{ matrix.name }} | |
| needs: shards | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 55 | |
| strategy: | |
| fail-fast: false | |
| matrix: ${{ fromJSON(needs.shards.outputs.cluster) }} | |
| env: | |
| SHARD: ${{ matrix.shard }} | |
| steps: | |
| - name: Download source code | |
| uses: actions/checkout@v7 | |
| - name: Set up .NET | |
| uses: actions/setup-dotnet@v6 | |
| with: | |
| global-json-file: global.json | |
| - name: Build | |
| run: dotnet build KeyLoad.slnx --configuration "$KEYLOAD_TEST_CONFIGURATION" -warnaserror | |
| - name: Install administration browser | |
| if: ${{ matrix.playwright }} | |
| shell: pwsh | |
| run: tests/KeyLoad.ClusterTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/playwright.ps1 install --with-deps chromium | |
| - name: Prepare Chromium certificate store | |
| if: ${{ matrix.playwright }} | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install --yes libnss3-tools | |
| mkdir -p "$HOME/.pki/nssdb" | |
| if [[ ! -f "$HOME/.pki/nssdb/cert9.db" ]]; then | |
| certutil -N -d "sql:$HOME/.pki/nssdb" --empty-password | |
| fi | |
| - name: Trust standard Aspire development certificate | |
| run: | | |
| export SSL_CERT_DIR="$HOME/.aspnet/dev-certs/trust:/usr/lib/ssl/certs" | |
| echo "SSL_CERT_DIR=$SSL_CERT_DIR" >> "$GITHUB_ENV" | |
| dotnet dev-certs https --trust | |
| - name: Test Aspire topology lanes | |
| run: node scripts/Features/TestInfrastructure/ci-test-shards.mjs run "$SHARD" --results-directory "$GITHUB_WORKSPACE/tests/KeyLoad.ClusterTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/ci-results" | |
| - name: Save test results | |
| if: ${{ always() }} | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: test-results-cluster-${{ matrix.shard }} | |
| path: | | |
| tests/KeyLoad.ClusterTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/ci-results | |
| tests/KeyLoad.ClusterTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/aspire-diagnostics-*.log | |
| if-no-files-found: warn | |
| retention-days: 30 | |
| overwrite: true | |
| verify-partition: | |
| name: Verify every required test ran exactly once | |
| needs: [functional, analyzers-recovery, cluster] | |
| if: ${{ !cancelled() }} | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Download source code | |
| uses: actions/checkout@v7 | |
| - name: Download test results | |
| uses: actions/download-artifact@v8 | |
| with: | |
| pattern: test-results-* | |
| path: TestResults | |
| merge-multiple: true | |
| - name: Check every test ran exactly once | |
| run: node scripts/Features/TestInfrastructure/ci-test-shards.mjs verify TestResults |