Skip to content

Reuse scoped record decoders during vector scans #352

Reuse scoped record decoders during vector scans

Reuse scoped record decoders during vector scans #352

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