Skip to content

Run isolated native 1 2 3 node intensive comparison cells #66

Run isolated native 1 2 3 node intensive comparison cells

Run isolated native 1 2 3 node intensive comparison cells #66

Workflow file for this run

name: KeyLoad CI
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
permissions:
contents: read
concurrency:
group: keyload-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
analyzer-rules:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
global-json-file: global.json
- run: dotnet restore tests/KeyLoad.Analyzers.Tests/KeyLoad.Analyzers.Tests.csproj
- run: dotnet build tests/KeyLoad.Analyzers.Tests/KeyLoad.Analyzers.Tests.csproj --no-restore --configuration Release
- run: dotnet test --project tests/KeyLoad.Analyzers.Tests --no-build --no-restore --configuration Release
- name: Retain rule regression and diagnostic evidence
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always()
with:
name: analyzer-rule-evidence
path: |
TestResults/**
tests/KeyLoad.Analyzers.Tests/**/TestResults/**
artifacts/code-quality/**
if-no-files-found: error
verify:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
timeout-minutes: 30
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
global-json-file: global.json
- run: dotnet restore KeyLoad.slnx
- id: build
run: dotnet build KeyLoad.slnx --no-restore --configuration Release
- name: Verify EditorConfig and analyzer fixes
run: dotnet format KeyLoad.slnx --verify-no-changes --no-restore
- name: Verify repository governance
run: node scripts/Features/RepositoryGovernance/verify.mjs
- name: Verify source-owned Roslyn rules
run: dotnet test --project tests/KeyLoad.Analyzers.Tests --no-build --no-restore --configuration Release
- run: dotnet test --project tests/KeyLoad.UnitTests --no-build --no-restore --configuration Release
- name: Qualify the full unit suite with hardware intrinsics disabled
run: dotnet test --project tests/KeyLoad.UnitTests --no-build --no-restore --configuration Release --results-directory TestResults/unit-scalar
env:
DOTNET_EnableHWIntrinsic: 0
- name: Qualify real process recovery after a successful build
if: ${{ !cancelled() && steps.build.outcome == 'success' }}
run: dotnet test --project tests/KeyLoad.RecoveryTests --no-build --no-restore --configuration Release
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always()
with:
name: test-results-${{ matrix.os }}
path: |
**/TestResults/**
artifacts/qualification/**
if-no-files-found: ignore
- name: Retain compiler diagnostic reports
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always()
with:
name: code-quality-${{ matrix.os }}
path: artifacts/code-quality/**
if-no-files-found: error
docker-rf3:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
global-json-file: global.json
- name: Require the actual Docker runtime
run: docker version
- name: Prepare immutable source-bound runtime images
id: images
run: node scripts/Features/BenchmarkComparisons/prepare-images.mjs
- name: Bind the verified runtime image receipt
shell: bash
env:
KEYLOAD_SERVER_IMAGE: ${{ steps.images.outputs.server-image }}
KEYLOAD_RUNNER_IMAGE: ${{ steps.images.outputs.load-generator-image }}
run: |
test -n "$KEYLOAD_SERVER_IMAGE" && test -n "$KEYLOAD_RUNNER_IMAGE"
printf 'KeyLoad__ContainerImages__Server=%s\nBenchmarks__ContainerImages__LoadGenerator=%s\nKEYLOAD_IMAGE_RECEIPT=%s\n' "$KEYLOAD_SERVER_IMAGE" "$KEYLOAD_RUNNER_IMAGE" "$RUNNER_TEMP/keyload-images/image-receipt.json" >> "$GITHUB_ENV"
- name: Require the actual administration browser
shell: bash
run: |
admin_chrome=$(command -v google-chrome || command -v google-chrome-stable || command -v chromium || command -v chromium-browser)
test -n "$admin_chrome" && test -x "$admin_chrome"
"$admin_chrome" --version
printf 'KEYLOAD_ADMIN_CHROME_PATH=%s\n' "$admin_chrome" >> "$GITHUB_ENV"
- run: dotnet restore KeyLoad.slnx
- run: dotnet build tests/KeyLoad.IntegrationTests --no-restore --configuration Release
- name: Qualify RF3 through the real SDK clients
run: dotnet test --project tests/KeyLoad.IntegrationTests --no-build --no-restore --configuration Release
- name: Capture and remove only the job-owned registry
if: ${{ always() && (steps.images.outcome == 'success' || steps.images.outcome == 'failure') }}
run: node scripts/Features/BenchmarkComparisons/cleanup-images.mjs
- name: Retain actual RF3 image manifest and lifecycle evidence
if: ${{ always() && (steps.images.outcome == 'success' || steps.images.outcome == 'failure') }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: docker-rf3-image-evidence
path: ${{ runner.temp }}/keyload-images/**
if-no-files-found: error
- name: Retain real topology and fault receipts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always()
with:
name: docker-rf3-qualification
path: |
TestResults/**
tests/KeyLoad.IntegrationTests/**/TestResults/**
artifacts/qualification/**
if-no-files-found: error
- name: Retain RF3 compiler diagnostic reports
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always()
with:
name: code-quality-docker-rf3
path: artifacts/code-quality/**
if-no-files-found: error
comparison-plan:
if: github.repository == 'managedcode/KeyLoad' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
timeout-minutes: 10
outputs:
crud: ${{ steps.plan.outputs.crud_matrix }}
specialized: ${{ steps.plan.outputs.specialized_matrix }}
preflight: ${{ steps.plan.outputs.preflight_matrix }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Freeze the complete intensive Linux cohort
id: plan
run: node scripts/Features/BenchmarkComparisons/isolated-plan.mjs --output="$RUNNER_TEMP/isolated-plan.json" --github-output="$GITHUB_OUTPUT"
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: comparison-plan
path: ${{ runner.temp }}/isolated-plan.json
if-no-files-found: error
retention-days: 90
comparison-images:
name: comparison-images
needs: [verify, comparison-plan]
runs-on: ubuntu-latest
timeout-minutes: 120
permissions:
contents: read
actions: read
outputs:
bundle-artifact-id: ${{ steps.bundle.outputs.artifact-id }}
env:
GH_TOKEN: ${{ github.token }}
KEYLOAD_COMPARISON_JOB_NAME: comparison-images
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68
with:
global-json-file: global.json
- name: Require the actual Docker runtime
run: docker version
- name: Prepare immutable source-bound runtime images once
id: images
run: node scripts/Features/BenchmarkComparisons/prepare-images.mjs
- name: Bind the verified runtime image receipt
env:
KEYLOAD_SERVER_IMAGE: ${{ steps.images.outputs.server-image }}
KEYLOAD_RUNNER_IMAGE: ${{ steps.images.outputs.load-generator-image }}
run: |
test -n "$KEYLOAD_SERVER_IMAGE" && test -n "$KEYLOAD_RUNNER_IMAGE"
printf 'KeyLoad__ContainerImages__Server=%s\nBenchmarks__ContainerImages__LoadGenerator=%s\nKEYLOAD_IMAGE_RECEIPT=%s\n' "$KEYLOAD_SERVER_IMAGE" "$KEYLOAD_RUNNER_IMAGE" "$RUNNER_TEMP/keyload-images/image-receipt.json" >> "$GITHUB_ENV"
- run: dotnet restore KeyLoad.slnx
- run: dotnet build tests/KeyLoad.ComparisonTests --no-restore --configuration Release
- name: Qualify native image export and import
id: roundtrip
run: dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/ImageBundleRealTests/*'
- name: Qualify authenticated current-job identity
run: dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedGitHubCurrentJobTests/*'
- name: Qualify exact native topology composition models
run: dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/Isolated*Resource*/*'
- name: Qualify time-series workload and aggregation contracts
run: |
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/TimeSeriesWorkloadTests/*'
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/TimeSeriesPackageVersionTests/*'
- name: Retain common image bundle
id: bundle
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: comparison-image-bundle
path: ${{ runner.temp }}/keyload-image-bundle/*
if-no-files-found: error
compression-level: 0
retention-days: 90
- name: Capture job-owned registry after an incomplete round-trip
if: ${{ always() && steps.roundtrip.outcome != 'success' && (steps.images.outcome == 'success' || steps.images.outcome == 'failure') }}
run: node scripts/Features/BenchmarkComparisons/cleanup-images.mjs
- name: Retain native image and source qualification evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: comparison-images-qualification
path: |
${{ runner.temp }}/keyload-images/**
${{ runner.temp }}/keyload-images-build/**
${{ runner.temp }}/keyload-cell-github/**
**/TestResults/**
artifacts/code-quality/**
if-no-files-found: error
retention-days: 90
comparison-preflight:
name: preflight / ${{ matrix.id }}
needs: [comparison-plan, comparison-images]
runs-on: ubuntu-latest
timeout-minutes: 150
permissions:
contents: read
actions: read
strategy:
fail-fast: false
max-parallel: 6
matrix: ${{ fromJSON(needs.comparison-plan.outputs.preflight) }}
env:
GH_TOKEN: ${{ github.token }}
KEYLOAD_COMPARISON_CELL_ID: ${{ matrix.id }}
KEYLOAD_COMPARISON_JOB_NAME: preflight / ${{ matrix.id }}
Benchmarks__Target: ${{ matrix.target }}
Benchmarks__NodeCount: ${{ matrix.nodeCount }}
Benchmarks__Scenario: ${{ matrix.scenario }}
Benchmarks__EvidenceProfile: ${{ matrix.profile }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Prepare isolated native case
id: images
uses: ./.github/workflows/Features/BenchmarkComparisons/IsolatedCellSetup
with:
bundle-artifact-id: ${{ needs.comparison-images.outputs.bundle-artifact-id }}
- run: dotnet restore KeyLoad.slnx
- run: dotnet build tests/KeyLoad.ComparisonTests --no-restore --configuration Release
- name: Run isolated native case
run: dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedNativeComparisonTests/*'
- name: Retain isolated worker evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: comparison-preflight-${{ matrix.id }}
path: artifacts/comparisons/isolated/workers/${{ matrix.id }}/*
if-no-files-found: error
retention-days: 90
- name: Retain native worker lifecycle evidence
if: always()
uses: ./.github/workflows/Features/BenchmarkComparisons/IsolatedCellTeardown
with:
setup-outcome: ${{ steps.images.outcome }}
artifact-name: comparison-preflight-qualification-${{ matrix.id }}
comparison-crud:
name: case / ${{ matrix.id }}
needs: [comparison-plan, comparison-images, comparison-preflight]
runs-on: ubuntu-latest
timeout-minutes: 150
permissions:
contents: read
actions: read
strategy:
fail-fast: false
max-parallel: 6
matrix: ${{ fromJSON(needs.comparison-plan.outputs.crud) }}
env:
GH_TOKEN: ${{ github.token }}
KEYLOAD_COMPARISON_CELL_ID: ${{ matrix.id }}
KEYLOAD_COMPARISON_JOB_NAME: case / ${{ matrix.id }}
Benchmarks__Target: ${{ matrix.target }}
Benchmarks__NodeCount: ${{ matrix.nodeCount }}
Benchmarks__Scenario: ${{ matrix.scenario }}
Benchmarks__EvidenceProfile: ${{ matrix.profile }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Prepare isolated native case
id: images
uses: ./.github/workflows/Features/BenchmarkComparisons/IsolatedCellSetup
with:
bundle-artifact-id: ${{ needs.comparison-images.outputs.bundle-artifact-id }}
- run: dotnet restore KeyLoad.slnx
- run: dotnet build tests/KeyLoad.ComparisonTests --no-restore --configuration Release
- name: Run isolated native case
run: dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedNativeComparisonTests/*'
- name: Retain isolated worker evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: comparison-worker-${{ matrix.id }}
path: artifacts/comparisons/isolated/workers/${{ matrix.id }}/*
if-no-files-found: error
retention-days: 90
- name: Retain native worker lifecycle evidence
if: always()
uses: ./.github/workflows/Features/BenchmarkComparisons/IsolatedCellTeardown
with:
setup-outcome: ${{ steps.images.outcome }}
artifact-name: comparison-case-qualification-${{ matrix.id }}
comparison-specialized:
name: case / ${{ matrix.id }}
needs: [comparison-plan, comparison-images, comparison-preflight, comparison-crud]
runs-on: ubuntu-latest
timeout-minutes: 150
permissions:
contents: read
actions: read
strategy:
fail-fast: false
max-parallel: 6
matrix: ${{ fromJSON(needs.comparison-plan.outputs.specialized) }}
env:
GH_TOKEN: ${{ github.token }}
KEYLOAD_COMPARISON_CELL_ID: ${{ matrix.id }}
KEYLOAD_COMPARISON_JOB_NAME: case / ${{ matrix.id }}
Benchmarks__Target: ${{ matrix.target }}
Benchmarks__NodeCount: ${{ matrix.nodeCount }}
Benchmarks__Scenario: ${{ matrix.scenario }}
Benchmarks__EvidenceProfile: ${{ matrix.profile }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Prepare isolated native case
id: images
uses: ./.github/workflows/Features/BenchmarkComparisons/IsolatedCellSetup
with:
bundle-artifact-id: ${{ needs.comparison-images.outputs.bundle-artifact-id }}
- run: dotnet restore KeyLoad.slnx
- run: dotnet build tests/KeyLoad.ComparisonTests --no-restore --configuration Release
- name: Run isolated native case
run: dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedNativeComparisonTests/*'
- name: Retain isolated worker evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: comparison-worker-${{ matrix.id }}
path: artifacts/comparisons/isolated/workers/${{ matrix.id }}/*
if-no-files-found: error
retention-days: 90
- name: Retain native worker lifecycle evidence
if: always()
uses: ./.github/workflows/Features/BenchmarkComparisons/IsolatedCellTeardown
with:
setup-outcome: ${{ steps.images.outcome }}
artifact-name: comparison-case-qualification-${{ matrix.id }}
comparison-aggregate:
needs: [comparison-plan, comparison-images, comparison-crud, comparison-specialized]
runs-on: ubuntu-latest
timeout-minutes: 150
permissions:
contents: read
actions: read
env:
GH_TOKEN: ${{ github.token }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Recreate the canonical complete intensive plan
run: node scripts/Features/BenchmarkComparisons/isolated-plan.mjs --output="$RUNNER_TEMP/isolated-plan.json"
- name: Collect exact authenticated native jobs and immutable raw artifacts
run: node scripts/Features/BenchmarkComparisons/isolated-github-collect.mjs --plan="$RUNNER_TEMP/isolated-plan.json" --input="$RUNNER_TEMP/isolated-capture"
- name: Validate and retain all270 byte-preserved workers
run: node scripts/Features/BenchmarkComparisons/aggregate-cli.mjs --plan="$RUNNER_TEMP/isolated-plan.json" --input="$RUNNER_TEMP/isolated-capture/data" --proof="$RUNNER_TEMP/isolated-capture/github/proof.json" --output="$RUNNER_TEMP/isolated-aggregate"
- name: Generate bounded native performance metrics
run: node site/scripts/build.mjs --isolated="$RUNNER_TEMP/isolated-aggregate" --output="$RUNNER_TEMP/isolated-site" --revision="$GITHUB_SHA" --site-revision="$GITHUB_SHA" --evidence-url="https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID"
- name: Retain the generated native metrics candidate
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: comparison-isolated-site-candidate
path: ${{ runner.temp }}/isolated-site/**
if-no-files-found: error
retention-days: 90
- name: Retain the complete qualified comparison cohort
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: comparison-isolated-suite
path: ${{ runner.temp }}/isolated-aggregate/**
if-no-files-found: error
retention-days: 90
- name: Retain authenticated provider and archive integrity evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: comparison-isolated-provider-evidence
path: ${{ runner.temp }}/isolated-capture/github/**
if-no-files-found: error
retention-days: 90