diff --git a/.github/workflows/New-FrameworkFilteredSolution.ps1 b/.github/workflows/New-FrameworkFilteredSolution.ps1 index aa05099612..3302a0391d 100644 --- a/.github/workflows/New-FrameworkFilteredSolution.ps1 +++ b/.github/workflows/New-FrameworkFilteredSolution.ps1 @@ -22,10 +22,13 @@ .PARAMETER Configuration Optional MSBuild configuration used when querying TargetFrameworks. Defaults to Debug. -.PARAMETER ProjectNameFilter +.PARAMETER TestProjectNameFilter Optional wildcard pattern to filter test project names (e.g., *UnitTests*, *IntegrationTests*). When specified, only test projects whose filename matches this pattern are kept. +.PARAMETER ExcludeSamples + When specified, removes all projects under the samples/ directory from the solution. + .PARAMETER OutputPath Optional output path for the filtered .slnx file. If not specified, a temp file is created. @@ -36,7 +39,7 @@ .EXAMPLE # Generate a solution with only unit test projects - ./eng/New-FilteredSolution.ps1 -Solution ./agent-framework-dotnet.slnx -TargetFramework net10.0 -ProjectNameFilter "*UnitTests*" -OutputPath filtered-unit.slnx + ./eng/New-FilteredSolution.ps1 -Solution ./agent-framework-dotnet.slnx -TargetFramework net10.0 -TestProjectNameFilter "*UnitTests*" -OutputPath filtered-unit.slnx .EXAMPLE # Inline usage with dotnet test (PowerShell) @@ -53,7 +56,9 @@ param( [string]$Configuration = "Debug", - [string]$ProjectNameFilter, + [string]$TestProjectNameFilter, + + [switch]$ExcludeSamples, [string]$OutputPath ) @@ -71,19 +76,31 @@ if (-not $OutputPath) { # Parse the .slnx XML [xml]$slnx = Get-Content $solutionPath -Raw -# Find all Project elements with paths containing "tests/" -$testProjects = $slnx.SelectNodes("//Project[contains(@Path, 'tests/')]") - $removed = @() $kept = @() +# Remove sample projects if requested +if ($ExcludeSamples) { + $sampleProjects = $slnx.SelectNodes("//Project[contains(@Path, 'samples/')]") + foreach ($proj in $sampleProjects) { + $projRelPath = $proj.GetAttribute("Path") + Write-Verbose "Removing (sample): $projRelPath" + $removed += $projRelPath + $proj.ParentNode.RemoveChild($proj) | Out-Null + } + Write-Host "Removed $($sampleProjects.Count) sample project(s)." -ForegroundColor Yellow +} + +# Find all Project elements with paths containing "tests/" +$testProjects = $slnx.SelectNodes("//Project[contains(@Path, 'tests/')]") + foreach ($proj in $testProjects) { $projRelPath = $proj.GetAttribute("Path") $projFullPath = Join-Path $solutionDir $projRelPath $projFileName = Split-Path $projRelPath -Leaf # Filter by project name pattern if specified - if ($ProjectNameFilter -and ($projFileName -notlike $ProjectNameFilter)) { + if ($TestProjectNameFilter -and ($projFileName -notlike $TestProjectNameFilter)) { Write-Verbose "Removing (name filter): $projRelPath" $removed += $projRelPath $proj.ParentNode.RemoveChild($proj) | Out-Null @@ -117,7 +134,7 @@ $slnx.Save($OutputPath) # Report results to stderr so stdout is clean for piping Write-Host "Filtered solution written to: $OutputPath" -ForegroundColor Green if ($removed.Count -gt 0) { - Write-Host "Removed $($removed.Count) test project(s) not targeting ${TargetFramework}:" -ForegroundColor Yellow + Write-Host "Removed $($removed.Count) project(s):" -ForegroundColor Yellow foreach ($r in $removed) { Write-Host " - $r" -ForegroundColor Yellow } diff --git a/.github/workflows/dotnet-build-and-test.yml b/.github/workflows/dotnet-build-and-test.yml index f62055f7ff..9899b6ee2e 100644 --- a/.github/workflows/dotnet-build-and-test.yml +++ b/.github/workflows/dotnet-build-and-test.yml @@ -59,20 +59,20 @@ jobs: if: steps.filter.outputs.dotnet != 'true' run: echo "NOT dotnet file" - dotnet-build-and-test: + # Build the full solution (including samples) on all TFMs. No tests. + dotnet-build: needs: paths-filter if: needs.paths-filter.outputs.dotnetChanges == 'true' strategy: fail-fast: false matrix: include: - - { targetFramework: "net10.0", os: "ubuntu-latest", configuration: Release, integration-tests: true, environment: "integration" } + - { targetFramework: "net10.0", os: "ubuntu-latest", configuration: Release } - { targetFramework: "net9.0", os: "windows-latest", configuration: Debug } - { targetFramework: "net8.0", os: "ubuntu-latest", configuration: Release } - - { targetFramework: "net472", os: "windows-latest", configuration: Release, integration-tests: true, environment: "integration" } + - { targetFramework: "net472", os: "windows-latest", configuration: Release } runs-on: ${{ matrix.os }} - environment: ${{ matrix.environment }} steps: - uses: actions/checkout@v6 with: @@ -84,16 +84,6 @@ jobs: python workflow-samples - # Start Cosmos DB Emulator for all integration tests and only for unit tests when CosmosDB changes happened) - - name: Start Azure Cosmos DB Emulator - if: ${{ runner.os == 'Windows' && (needs.paths-filter.outputs.cosmosDbChanges == 'true' || (github.event_name != 'pull_request' && matrix.integration-tests)) }} - shell: pwsh - run: | - Write-Host "Launching Azure Cosmos DB Emulator" - Import-Module "$env:ProgramFiles\Azure Cosmos DB Emulator\PSModules\Microsoft.Azure.CosmosDB.Emulator" - Start-CosmosDbEmulator -NoUI -Key "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" - echo "COSMOS_EMULATOR_AVAILABLE=true" >> $env:GITHUB_ENV - - name: Setup dotnet uses: actions/setup-dotnet@v5.1.0 with: @@ -140,20 +130,74 @@ jobs: popd rm -rf "$TEMP_DIR" - - name: Generate filtered solutions + # Build src+tests only (no samples) for a single TFM and run tests. + dotnet-test: + needs: paths-filter + if: needs.paths-filter.outputs.dotnetChanges == 'true' + strategy: + fail-fast: false + matrix: + include: + - { targetFramework: "net10.0", os: "ubuntu-latest", configuration: Release, integration-tests: true, environment: "integration" } + - { targetFramework: "net472", os: "windows-latest", configuration: Release, integration-tests: true, environment: "integration" } + + runs-on: ${{ matrix.os }} + environment: ${{ matrix.environment }} + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + sparse-checkout: | + . + .github + dotnet + python + workflow-samples + + # Start Cosmos DB Emulator for all integration tests and only for unit tests when CosmosDB changes happened) + - name: Start Azure Cosmos DB Emulator + if: ${{ runner.os == 'Windows' && (needs.paths-filter.outputs.cosmosDbChanges == 'true' || (github.event_name != 'pull_request' && matrix.integration-tests)) }} + shell: pwsh + run: | + Write-Host "Launching Azure Cosmos DB Emulator" + Import-Module "$env:ProgramFiles\Azure Cosmos DB Emulator\PSModules\Microsoft.Azure.CosmosDB.Emulator" + Start-CosmosDbEmulator -NoUI -Key "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" + echo "COSMOS_EMULATOR_AVAILABLE=true" >> $env:GITHUB_ENV + + - name: Setup dotnet + uses: actions/setup-dotnet@v5.1.0 + with: + global-json-file: ${{ github.workspace }}/dotnet/global.json + + - name: Generate test solution (no samples) + shell: pwsh + run: | + .github/workflows/New-FrameworkFilteredSolution.ps1 ` + -Solution dotnet/agent-framework-dotnet.slnx ` + -TargetFramework ${{ matrix.targetFramework }} ` + -Configuration ${{ matrix.configuration }} ` + -ExcludeSamples ` + -OutputPath dotnet/filtered.slnx ` + -Verbose + + - name: Build src and tests + shell: bash + run: dotnet build dotnet/filtered.slnx -c ${{ matrix.configuration }} -f ${{ matrix.targetFramework }} --warnaserror + + - name: Generate test-type filtered solutions shell: pwsh run: | $commonArgs = @{ - Solution = "dotnet/agent-framework-dotnet.slnx" + Solution = "dotnet/filtered.slnx" TargetFramework = "${{ matrix.targetFramework }}" Configuration = "${{ matrix.configuration }}" Verbose = $true } .github/workflows/New-FrameworkFilteredSolution.ps1 @commonArgs ` - -ProjectNameFilter "*UnitTests*" ` + -TestProjectNameFilter "*UnitTests*" ` -OutputPath dotnet/filtered-unit.slnx .github/workflows/New-FrameworkFilteredSolution.ps1 @commonArgs ` - -ProjectNameFilter "*IntegrationTests*" ` + -TestProjectNameFilter "*IntegrationTests*" ` -OutputPath dotnet/filtered-integration.slnx - name: Run Unit Tests @@ -262,7 +306,7 @@ jobs: dotnet-build-and-test-check: if: always() runs-on: ubuntu-latest - needs: [dotnet-build-and-test] + needs: [dotnet-build, dotnet-test] steps: - name: Get Date shell: bash