Repository navigation
docs: keep private ZoneTree reports concise and categorized #348
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] | |
| paths-ignore: | |
| - 'site/**' | |
| - '.github/workflows/website.yml' | |
| pull_request: | |
| paths-ignore: | |
| - 'site/**' | |
| - '.github/workflows/website.yml' | |
| 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). | |
| # Build owns the complete solution outputs. Test jobs consume that same build after it succeeds. | |
| jobs: | |
| build: | |
| name: Build | |
| 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 | |
| cache: true | |
| cache-dependency-path: | | |
| Directory.Packages.props | |
| global.json | |
| **/*.csproj | |
| - name: Check repository rules | |
| run: node scripts/Features/RepositoryGovernance/verify.mjs | |
| - 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 | |
| - name: Archive the built solution | |
| run: | | |
| python3 - <<'PY' | |
| from pathlib import Path | |
| import tarfile | |
| import xml.etree.ElementTree as ET | |
| Path('artifacts').mkdir(exist_ok=True) | |
| with tarfile.open('artifacts/compiled-solution.tar.gz', 'w:gz', compresslevel=1) as archive: | |
| for project in ET.parse('KeyLoad.slnx').findall('.//Project'): | |
| directory = Path(project.attrib['Path']).parent | |
| for output in (directory / 'bin' / 'Release', directory / 'obj'): | |
| if not output.is_dir(): | |
| raise FileNotFoundError(output) | |
| archive.add(output, arcname=output.as_posix()) | |
| PY | |
| - name: Save the built solution | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: compiled-solution | |
| path: artifacts/compiled-solution.tar.gz | |
| if-no-files-found: error | |
| compression-level: 0 | |
| retention-days: 1 | |
| overwrite: true | |
| shards: | |
| name: Plan named test groups | |
| needs: build | |
| 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: [build, 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 | |
| cache: true | |
| cache-dependency-path: | | |
| Directory.Packages.props | |
| global.json | |
| **/*.csproj | |
| - name: Download the built solution | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: compiled-solution | |
| path: artifacts | |
| - name: Prepare the built solution | |
| run: | | |
| tar -xzf artifacts/compiled-solution.tar.gz -C "$GITHUB_WORKSPACE" | |
| dotnet restore KeyLoad.slnx | |
| - 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 | |
| needs: build | |
| 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 | |
| cache: true | |
| cache-dependency-path: | | |
| Directory.Packages.props | |
| global.json | |
| **/*.csproj | |
| - name: Download the built solution | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: compiled-solution | |
| path: artifacts | |
| - name: Prepare the built solution | |
| run: | | |
| tar -xzf artifacts/compiled-solution.tar.gz -C "$GITHUB_WORKSPACE" | |
| dotnet restore KeyLoad.slnx | |
| - 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 | |
| tests/KeyLoad.ProcessRecoveryTests/bin/${{ env.KEYLOAD_TEST_CONFIGURATION }}/net10.0/TestResults/crash-trials-* | |
| if-no-files-found: warn | |
| retention-days: 30 | |
| overwrite: true | |
| cluster: | |
| name: Cluster tests – ${{ matrix.name }} | |
| needs: [build, shards] | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 55 | |
| strategy: | |
| fail-fast: false | |
| matrix: ${{ fromJSON(needs.shards.outputs.cluster) }} | |
| env: | |
| SHARD: ${{ matrix.shard }} | |
| LANE: ${{ matrix.lane }} | |
| steps: | |
| - name: Download source code | |
| uses: actions/checkout@v7 | |
| - name: Set up .NET | |
| uses: actions/setup-dotnet@v6 | |
| with: | |
| global-json-file: global.json | |
| cache: true | |
| cache-dependency-path: | | |
| Directory.Packages.props | |
| global.json | |
| **/*.csproj | |
| - name: Download the built solution | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: compiled-solution | |
| path: artifacts | |
| - name: Prepare the built solution | |
| run: | | |
| tar -xzf artifacts/compiled-solution.tar.gz -C "$GITHUB_WORKSPACE" | |
| dotnet restore KeyLoad.slnx | |
| - name: Prepare Aspire runtime | |
| run: dotnet msbuild build/KeyLoad.AppHost/KeyLoad.AppHost.csproj -target:ResolveAspireCliBundlePaths -property: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" --lane "$LANE" --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 }}-${{ matrix.lane }} | |
| 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: [build, functional, analyzers-recovery, cluster] | |
| if: ${{ !cancelled() && needs.build.result == 'success' }} | |
| 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 |