Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
bf35235
feat(extensions): deliver SP220-07 leaf packages
MrFr3di Aug 22, 2026
89db94d
fix(runtime): close SP220-07 acceptance gates
MrFr3di Aug 22, 2026
4b604d7
fix(tooling): normalize process-host pipe failures
MrFr3di Aug 22, 2026
45d44b5
fix(ci): isolate self-hosted NuGet packages
MrFr3di Aug 22, 2026
f5ac54f
fix(tooling): retain bounded consumer diagnostics
MrFr3di Aug 22, 2026
14bb61a
fix(tooling): shorten consumer workspace paths
MrFr3di Aug 22, 2026
97c9fcb
Merge pull request #64 from MrFr3di/sp220/07-channels-transforms-data…
MrFr3di Aug 22, 2026
c08466d
ci: add targeted diagnostics and runner cleanup
MrFr3di Aug 22, 2026
6ef844c
fix(ci): harden self-hosted runner lifecycle
MrFr3di Aug 22, 2026
a2f360b
fix(ci): replace unavailable hosted security gates
MrFr3di Aug 24, 2026
0eca5db
fix(ci): move cleanup before self-hosted jobs
MrFr3di Aug 24, 2026
c27b9a3
fix(ci): fail closed on ambiguous runner listeners
MrFr3di Aug 24, 2026
496deff
fix(ci): recreate workspace after pre-job cleanup
MrFr3di Aug 24, 2026
aec9921
fix(ci): accept empty pre-job workspace
MrFr3di Aug 24, 2026
4be8f98
fix(ci): avoid unused PR artifact uploads
MrFr3di Aug 24, 2026
f711489
Merge pull request #65 from MrFr3di/upd-ci-efficiency-self-hosted
MrFr3di Aug 24, 2026
0a8adc2
build(deps): apply .NET 10.0.11 servicing
MrFr3di Aug 25, 2026
8dce0dd
ci: retire SmartPipe self-hosted runner
MrFr3di Aug 27, 2026
4586d81
fix(ci): keep hosted restores source-stable
MrFr3di Aug 27, 2026
45ef2e3
Merge pull request #67 from MrFr3di/upd-sp220-ci-hosted-cleanup
MrFr3di Aug 27, 2026
88a4c3d
Merge remote-tracking branch 'origin/sp220/checkpoint-d' into upd-sp2…
MrFr3di Aug 27, 2026
3ae9a52
Merge pull request #66 from MrFr3di/upd-sp220-08-dotnet-servicing
MrFr3di Aug 28, 2026
e5370e6
feat(json): add reusable pipeline definitions
MrFr3di Aug 31, 2026
f0a6fce
fix(build): normalize benchmark lock file
MrFr3di Aug 31, 2026
b094aac
test(repo): update JSON consumer inventory
MrFr3di Aug 31, 2026
e9d5296
test(ci): update JSON consumer contract
MrFr3di Aug 31, 2026
1b5210a
fix(json): reuse consumer templates
MrFr3di Aug 31, 2026
741892d
Merge pull request #70 from MrFr3di/upd-sp220-08-json-integration
MrFr3di Aug 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 135 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,50 @@ name: CI

on:
workflow_dispatch:
inputs:
diagnostic-sha:
description: Exact 40-character commit SHA for a single-consumer diagnostic
required: false
type: string
default: ''
diagnostic-scenario:
description: Exact consumer scenario ID for a single-consumer diagnostic
required: false
type: string
default: ''
diagnostic-repeat:
description: Number of diagnostic runs (1-5)
required: false
type: string
default: ''
push:
branches: [ main, upd, release/2.2.0 ]
pull_request:
branches: [ main, upd, release/2.2.0, sp220/checkpoint-c ]
branches: [ main, upd, release/2.2.0, sp220/checkpoint-c, sp220/checkpoint-d ]

permissions:
contents: read

env:
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages

jobs:
validation:
if: (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && (github.event_name != 'workflow_dispatch' || (inputs.diagnostic-sha == '' && inputs.diagnostic-scenario == '' && inputs.diagnostic-repeat == ''))
uses: ./.github/workflows/reusable-release-validation.yml
permissions:
contents: read
with:
runner-labels: ${{ github.event_name == 'pull_request' && '["windows-latest"]' || '["ubuntu-latest"]' }}

hosting-integration:
name: Hosting integration (${{ matrix.os }})
name: Hosting integration (${{ matrix.os == 'windows-latest' && 'Windows' || matrix.os }})
if: (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && (github.event_name != 'workflow_dispatch' || (inputs.diagnostic-sha == '' && inputs.diagnostic-scenario == '' && inputs.diagnostic-repeat == ''))
runs-on: ${{ matrix.os }}
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
matrix: ${{ fromJSON(github.event_name == 'pull_request' && '{"os":["windows-latest"]}' || '{"os":["ubuntu-latest","windows-latest"]}') }}

steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
Expand All @@ -34,9 +56,11 @@ jobs:
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5.4.0
with:
global-json-file: global.json
cache: true
cache-dependency-path: '**/packages.lock.json'

- name: Restore Hosting integration tests
run: dotnet restore tests/SmartPipe.Extensions.Hosting.Tests/SmartPipe.Extensions.Hosting.Tests.csproj --locked-mode
run: dotnet restore tests/SmartPipe.Extensions.Hosting.Tests/SmartPipe.Extensions.Hosting.Tests.csproj --locked-mode -p:DisableImplicitLibraryPacksFolder=true

- name: Build Hosting integration tests
run: dotnet build tests/SmartPipe.Extensions.Hosting.Tests/SmartPipe.Extensions.Hosting.Tests.csproj --configuration Release --no-restore -warnaserror
Expand All @@ -45,6 +69,7 @@ jobs:
run: dotnet test --project tests/SmartPipe.Extensions.Hosting.Tests/SmartPipe.Extensions.Hosting.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Hosting.Tests.Integration.GenericHostIntegrationTests --minimum-expected-tests 1

json-file-windows:
if: (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && (github.event_name != 'workflow_dispatch' || (inputs.diagnostic-sha == '' && inputs.diagnostic-scenario == '' && inputs.diagnostic-repeat == ''))
runs-on: windows-latest
timeout-minutes: 20

Expand All @@ -57,35 +82,52 @@ jobs:
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5.4.0
with:
global-json-file: global.json
cache: true
cache-dependency-path: '**/packages.lock.json'

- name: Restore locked
run: dotnet restore SmartPipe.Core.slnx --locked-mode
run: dotnet restore SmartPipe.Core.slnx --locked-mode -p:DisableImplicitLibraryPacksFolder=true

- name: Build JSON test project
run: dotnet build tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-restore -warnaserror

- name: JSON file source, path, open, and share tests
shell: pwsh
run: |
dotnet test --project tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Tests.Sources.JsonFileSourceTests --minimum-expected-tests 1
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
dotnet test --project tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Tests.Sources.JsonFileSourceRecoveryTests --minimum-expected-tests 1
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
dotnet test --project tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Tests.Sources.JsonFileSourceMetadataTests --minimum-expected-tests 1
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }

- name: JSON file sink and dispose tests
shell: pwsh
run: |
dotnet test --project tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Tests.Sinks.JsonFileSinkTests --minimum-expected-tests 1
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
dotnet test --project tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Tests.Sinks.JsonFileSinkAppendTests --minimum-expected-tests 1
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
dotnet test --project tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Json.Tests.Sinks.JsonFileSinkLifecycleTests --minimum-expected-tests 1
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }

- name: Dead-letter source and sink tests
shell: pwsh
run: |
dotnet test --project tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Tests.Sources.DeadLetterSourceTests --minimum-expected-tests 1
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
dotnet test --project tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Tests.Sources.DeadLetterSourceRecoveryTests --minimum-expected-tests 1
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
dotnet test --project tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Tests.DeadLetterSinkTests --minimum-expected-tests 1
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
dotnet test --project tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Tests.DeadLetterSinkAppendTests --minimum-expected-tests 1
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
dotnet test --project tests/SmartPipe.Extensions.Json.Tests/SmartPipe.Extensions.Json.Tests.csproj --configuration Release --no-build --filter-class SmartPipe.Extensions.Json.Tests.DeadLetterSinkLifecycleTests --minimum-expected-tests 1
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }

baseline-contract-windows:
name: Baseline contract (Windows)
if: (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && (github.event_name != 'workflow_dispatch' || (inputs.diagnostic-sha == '' && inputs.diagnostic-scenario == '' && inputs.diagnostic-repeat == ''))
runs-on: windows-latest
timeout-minutes: 20

Expand All @@ -99,6 +141,8 @@ jobs:
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5.4.0
with:
global-json-file: global.json
cache: true
cache-dependency-path: '**/packages.lock.json'

- name: Restore locked
run: dotnet restore SmartPipe.Core.slnx --locked-mode -p:DisableImplicitLibraryPacksFolder=true
Expand All @@ -114,3 +158,88 @@ jobs:

- name: Verify 2.1.2 baseline offline
run: dotnet run --project eng/SmartPipe.RepositoryChecks/SmartPipe.RepositoryChecks.csproj --configuration Release --no-build -- verify-baseline --repo-root . --manifest eng/baselines/2.1.2/manifest.json --packages-dir artifacts/baselines/2.1.2 --offline --mode integrity

diagnostic-consumer:
name: Diagnostic consumer (${{ inputs.diagnostic-scenario }})
if: github.event_name == 'workflow_dispatch' && (inputs.diagnostic-sha != '' || inputs.diagnostic-scenario != '' || inputs.diagnostic-repeat != '')
runs-on: windows-latest
timeout-minutes: 45
steps:
- name: Validate diagnostic inputs
shell: pwsh
env:
DIAGNOSTIC_SHA: ${{ inputs.diagnostic-sha }}
DIAGNOSTIC_SCENARIO: ${{ inputs.diagnostic-scenario }}
DIAGNOSTIC_REPEAT: ${{ inputs.diagnostic-repeat }}
run: |
$ErrorActionPreference = 'Stop'
if ($env:DIAGNOSTIC_SHA -notmatch '^[0-9a-f]{40}$') { throw 'diagnostic-sha must be exactly 40 lowercase hexadecimal characters.' }
if ($env:DIAGNOSTIC_SCENARIO -notmatch '^[a-z0-9-]+$') { throw 'diagnostic-scenario must contain lowercase letters, digits, or hyphens.' }
if ($env:DIAGNOSTIC_REPEAT -notmatch '^[1-5]$') { throw 'diagnostic-repeat must be an integer from 1 through 5.' }

- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ inputs.diagnostic-sha }}
persist-credentials: false
fetch-depth: 1

- name: Verify exact diagnostic checkout
shell: pwsh
env:
DIAGNOSTIC_SHA: ${{ inputs.diagnostic-sha }}
run: |
$ErrorActionPreference = 'Stop'
$actual = (git rev-parse HEAD).Trim()
if ($LASTEXITCODE -ne 0 -or $actual -cne $env:DIAGNOSTIC_SHA) { throw "Checked out SHA '$actual' does not match the requested diagnostic SHA." }

- name: Setup .NET
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5.4.0
with:
global-json-file: global.json
cache: true
cache-dependency-path: '**/packages.lock.json'

- name: Restore locked
run: dotnet restore SmartPipe.Core.slnx --locked-mode -p:DisableImplicitLibraryPacksFolder=true

- name: Build
run: dotnet build SmartPipe.Core.slnx --configuration Release --no-restore -warnaserror

- name: Set package version
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$packageVersion = (dotnet msbuild src/SmartPipe.Core/SmartPipe.Core.csproj -getProperty:Version -nologo).Trim()
if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($packageVersion)) { throw 'Unable to determine the package version.' }
"PACKAGE_VERSION=$packageVersion" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

- name: Pack packages from graph
shell: pwsh
run: >
dotnet run --project eng/SmartPipe.RepositoryChecks/SmartPipe.RepositoryChecks.csproj
--configuration Release --no-build -- pack-packages
--mode current --configuration Release --package-version "$env:PACKAGE_VERSION"
--output artifacts/packages --manifest artifacts/packages/manifest.json

- name: Run diagnostic consumer
shell: pwsh
env:
DIAGNOSTIC_SCENARIO: ${{ inputs.diagnostic-scenario }}
DIAGNOSTIC_REPEAT: ${{ inputs.diagnostic-repeat }}
run: |
$ErrorActionPreference = 'Stop'
$rows = [Collections.Generic.List[string]]::new()
$failed = $false
for ($pass = 1; $pass -le [int]$env:DIAGNOSTIC_REPEAT; $pass++) {
$output = (& dotnet run --project eng/SmartPipe.RepositoryChecks/SmartPipe.RepositoryChecks.csproj --configuration Release --no-build -- run-consumers --set current --scenario $env:DIAGNOSTIC_SCENARIO --package-directory artifacts/packages --package-version "$env:PACKAGE_VERSION" 2>&1 | Out-String).Trim()
$exitCode = $LASTEXITCODE
$snippet = ($output -replace '\r?\n', ' ').Trim()
if ($snippet.Length -gt 512) { $snippet = $snippet.Substring($snippet.Length - 512) }
$rows.Add("- pass ${pass}: exit=$exitCode; $snippet")
if ($exitCode -ne 0) { $failed = $true; break }
}
$summary = @('## Single-consumer diagnostic', '', "- scenario: $env:DIAGNOSTIC_SCENARIO", "- repeat requested: $env:DIAGNOSTIC_REPEAT") + $rows
$summaryText = ($summary -join [Environment]::NewLine)
if ($summaryText.Length -gt 8192) { $summaryText = $summaryText.Substring(0, 8192) + [Environment]::NewLine + '... summary truncated ...' }
Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value $summaryText
if ($failed) { exit 1 }
11 changes: 10 additions & 1 deletion .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,20 @@ on:
push:
branches: [ main, upd, release/2.2.0 ]
pull_request:
branches: [ main, release/2.2.0, sp220/checkpoint-c ]
branches: [ main, release/2.2.0, sp220/checkpoint-c, sp220/checkpoint-d ]
schedule:
- cron: '27 3 * * 1'

permissions:
contents: read
security-events: write

env:
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages

jobs:
analyze:
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
Expand All @@ -24,6 +28,8 @@ jobs:
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5.4.0
with:
global-json-file: global.json
cache: true
cache-dependency-path: '**/packages.lock.json'

- name: Initialize CodeQL
uses: github/codeql-action/init@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
Expand All @@ -35,3 +41,6 @@ jobs:

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
with:
ram: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && '16384' || '' }}
threads: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && '2' || '' }}
2 changes: 1 addition & 1 deletion .github/workflows/dependency-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Dependency Review

on:
pull_request:
branches: [ main, release/2.2.0, sp220/checkpoint-c ]
branches: [ main, release/2.2.0, sp220/checkpoint-c, sp220/checkpoint-d ]

permissions:
contents: read
Expand Down
Loading
Loading