From 9b54677d28e369d81ae3f537994b7e3cf85e81a6 Mon Sep 17 00:00:00 2001 From: Aaron Stannard Date: Tue, 26 Aug 2025 08:37:25 -0500 Subject: [PATCH 1/2] Parameterize Incrementalist base branch for Azure DevOps pipelines - Add dynamic incrementalist.baseBranch variable to pipeline templates - Use System.PullRequest.TargetBranch for PR builds - Default to 'dev' for non-PR builds - Update all Incrementalist commands to use --branch parameter This allows PRs targeting version branches (e.g., v1.5) to correctly compare against their target branch instead of always using dev, avoiding unnecessary full builds. --- build-system/azure-pipeline.mntr-template.yaml | 7 +++++++ build-system/azure-pipeline.template.yaml | 6 ++++++ build-system/pr-validation.yaml | 8 ++++---- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/build-system/azure-pipeline.mntr-template.yaml b/build-system/azure-pipeline.mntr-template.yaml index ec0d732cd13..1ccc64ecff2 100644 --- a/build-system/azure-pipeline.mntr-template.yaml +++ b/build-system/azure-pipeline.mntr-template.yaml @@ -14,6 +14,13 @@ jobs: timeoutInMinutes: ${{ parameters.timeoutInMinutes }} pool: vmImage: ${{ parameters.vmImage }} + variables: + # Determine the base branch for Incrementalist based on the target branch + - name: incrementalist.baseBranch + ${{ if eq(variables['System.PullRequest.TargetBranch'], '') }}: + value: 'dev' # Default for non-PR builds + ${{ else }}: + value: $(System.PullRequest.TargetBranch) steps: - task: UseDotNet@2 displayName: 'Use .NET' diff --git a/build-system/azure-pipeline.template.yaml b/build-system/azure-pipeline.template.yaml index 7cde35b6587..c90304484e8 100644 --- a/build-system/azure-pipeline.template.yaml +++ b/build-system/azure-pipeline.template.yaml @@ -21,6 +21,12 @@ jobs: value: true - name: xunit.skip.local.theory value: true + # Determine the base branch for Incrementalist based on the target branch + - name: incrementalist.baseBranch + ${{ if eq(variables['System.PullRequest.TargetBranch'], '') }}: + value: 'dev' # Default for non-PR builds + ${{ else }}: + value: $(System.PullRequest.TargetBranch) steps: - task: UseDotNet@2 displayName: 'Use .NET' diff --git a/build-system/pr-validation.yaml b/build-system/pr-validation.yaml index 3e52eafc15f..817d1ceb0ae 100644 --- a/build-system/pr-validation.yaml +++ b/build-system/pr-validation.yaml @@ -59,7 +59,7 @@ jobs: name: "netfx_tests_windows" displayName: ".NET Framework Unit Tests (Windows)" vmImage: "windows-latest" - command: "dotnet incrementalist run --config .incrementalist/testsOnly.json -- test -c Release --no-build --framework net48 --logger:trx --results-directory TestResults" + command: "dotnet incrementalist run --config .incrementalist/testsOnly.json --branch $(incrementalist.baseBranch) -- test -c Release --no-build --framework net48 --logger:trx --results-directory TestResults" outputDirectory: "TestResults" artifactName: "netfx_tests_windows-$(Build.BuildId)" @@ -80,7 +80,7 @@ jobs: name: "net_tests_windows" displayName: ".NET Unit Tests (Windows)" vmImage: "windows-latest" - command: "dotnet incrementalist run --config .incrementalist/testsOnly.json -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults" + command: "dotnet incrementalist run --config .incrementalist/testsOnly.json --branch $(incrementalist.baseBranch) -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults" outputDirectory: "TestResults" artifactName: "net_tests_windows-$(Build.BuildId)" @@ -89,7 +89,7 @@ jobs: name: "net_tests_linux" displayName: ".NET Unit Tests (Linux)" vmImage: "ubuntu-latest" - command: "dotnet incrementalist run --config .incrementalist/testsOnly.json -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults" + command: "dotnet incrementalist run --config .incrementalist/testsOnly.json --branch $(incrementalist.baseBranch) -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults" outputDirectory: "TestResults" artifactName: "net_tests_linux-$(Build.BuildId)" @@ -98,7 +98,7 @@ jobs: name: "net_mntr_windows" displayName: ".NET Multi-Node Tests (Windows)" vmImage: "windows-latest" - command: "dotnet incrementalist run --config .incrementalist/mutliNodeOnly.json -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults/multinode" + command: "dotnet incrementalist run --config .incrementalist/mutliNodeOnly.json --branch $(incrementalist.baseBranch) -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults/multinode" outputDirectory: "TestResults" artifactName: "net_mntr_windows-$(Build.BuildId)" mntrFailuresDir: 'TestResults\\multinode' From 40c0a90973e9b775a521ed530ef5a43f0f3f22e3 Mon Sep 17 00:00:00 2001 From: Aaron Stannard Date: Tue, 26 Aug 2025 08:50:50 -0500 Subject: [PATCH 2/2] Fix Incrementalist base branch detection for Azure DevOps PRs - Use PowerShell script to extract branch name from System.PullRequest.TargetBranch - Strip 'refs/heads/' prefix from target branch reference - Set IncrementalistBaseBranch variable dynamically at runtime - Update all Incrementalist commands to use the new variable This fixes the issue where PR builds always used 'dev' as the base branch even when targeting version branches like v1.5. --- .../azure-pipeline.mntr-template.yaml | 20 ++++++++++++------- build-system/azure-pipeline.template.yaml | 19 ++++++++++++------ build-system/pr-validation.yaml | 8 ++++---- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/build-system/azure-pipeline.mntr-template.yaml b/build-system/azure-pipeline.mntr-template.yaml index 1ccc64ecff2..f1c237867bc 100644 --- a/build-system/azure-pipeline.mntr-template.yaml +++ b/build-system/azure-pipeline.mntr-template.yaml @@ -14,19 +14,25 @@ jobs: timeoutInMinutes: ${{ parameters.timeoutInMinutes }} pool: vmImage: ${{ parameters.vmImage }} - variables: - # Determine the base branch for Incrementalist based on the target branch - - name: incrementalist.baseBranch - ${{ if eq(variables['System.PullRequest.TargetBranch'], '') }}: - value: 'dev' # Default for non-PR builds - ${{ else }}: - value: $(System.PullRequest.TargetBranch) steps: - task: UseDotNet@2 displayName: 'Use .NET' inputs: packageType: 'sdk' useGlobalJson: true + + # Set the Incrementalist base branch based on PR target branch + - pwsh: | + if ('$(Build.Reason)' -eq 'PullRequest') { + # Extract branch name from refs/heads/branch format + $targetBranch = '$(System.PullRequest.TargetBranch)'.Replace('refs/heads/', '') + Write-Host "PR detected - using base branch: $targetBranch" + Write-Host "##vso[task.setvariable variable=IncrementalistBaseBranch]$targetBranch" + } else { + Write-Host "Not a PR - using default base branch: dev" + Write-Host "##vso[task.setvariable variable=IncrementalistBaseBranch]dev" + } + displayName: 'Set Incrementalist base branch' - script: dotnet tool restore displayName: 'Restore dotnet tools' diff --git a/build-system/azure-pipeline.template.yaml b/build-system/azure-pipeline.template.yaml index c90304484e8..09d1ee5d667 100644 --- a/build-system/azure-pipeline.template.yaml +++ b/build-system/azure-pipeline.template.yaml @@ -21,18 +21,25 @@ jobs: value: true - name: xunit.skip.local.theory value: true - # Determine the base branch for Incrementalist based on the target branch - - name: incrementalist.baseBranch - ${{ if eq(variables['System.PullRequest.TargetBranch'], '') }}: - value: 'dev' # Default for non-PR builds - ${{ else }}: - value: $(System.PullRequest.TargetBranch) steps: - task: UseDotNet@2 displayName: 'Use .NET' inputs: packageType: 'sdk' useGlobalJson: true + + # Set the Incrementalist base branch based on PR target branch + - pwsh: | + if ('$(Build.Reason)' -eq 'PullRequest') { + # Extract branch name from refs/heads/branch format + $targetBranch = '$(System.PullRequest.TargetBranch)'.Replace('refs/heads/', '') + Write-Host "PR detected - using base branch: $targetBranch" + Write-Host "##vso[task.setvariable variable=IncrementalistBaseBranch]$targetBranch" + } else { + Write-Host "Not a PR - using default base branch: dev" + Write-Host "##vso[task.setvariable variable=IncrementalistBaseBranch]dev" + } + displayName: 'Set Incrementalist base branch' - script: dotnet tool restore displayName: 'Restore dotnet tools' diff --git a/build-system/pr-validation.yaml b/build-system/pr-validation.yaml index 817d1ceb0ae..1a49c58fd0c 100644 --- a/build-system/pr-validation.yaml +++ b/build-system/pr-validation.yaml @@ -59,7 +59,7 @@ jobs: name: "netfx_tests_windows" displayName: ".NET Framework Unit Tests (Windows)" vmImage: "windows-latest" - command: "dotnet incrementalist run --config .incrementalist/testsOnly.json --branch $(incrementalist.baseBranch) -- test -c Release --no-build --framework net48 --logger:trx --results-directory TestResults" + command: "dotnet incrementalist run --config .incrementalist/testsOnly.json --branch $(IncrementalistBaseBranch) -- test -c Release --no-build --framework net48 --logger:trx --results-directory TestResults" outputDirectory: "TestResults" artifactName: "netfx_tests_windows-$(Build.BuildId)" @@ -80,7 +80,7 @@ jobs: name: "net_tests_windows" displayName: ".NET Unit Tests (Windows)" vmImage: "windows-latest" - command: "dotnet incrementalist run --config .incrementalist/testsOnly.json --branch $(incrementalist.baseBranch) -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults" + command: "dotnet incrementalist run --config .incrementalist/testsOnly.json --branch $(IncrementalistBaseBranch) -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults" outputDirectory: "TestResults" artifactName: "net_tests_windows-$(Build.BuildId)" @@ -89,7 +89,7 @@ jobs: name: "net_tests_linux" displayName: ".NET Unit Tests (Linux)" vmImage: "ubuntu-latest" - command: "dotnet incrementalist run --config .incrementalist/testsOnly.json --branch $(incrementalist.baseBranch) -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults" + command: "dotnet incrementalist run --config .incrementalist/testsOnly.json --branch $(IncrementalistBaseBranch) -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults" outputDirectory: "TestResults" artifactName: "net_tests_linux-$(Build.BuildId)" @@ -98,7 +98,7 @@ jobs: name: "net_mntr_windows" displayName: ".NET Multi-Node Tests (Windows)" vmImage: "windows-latest" - command: "dotnet incrementalist run --config .incrementalist/mutliNodeOnly.json --branch $(incrementalist.baseBranch) -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults/multinode" + command: "dotnet incrementalist run --config .incrementalist/mutliNodeOnly.json --branch $(IncrementalistBaseBranch) -- test -c Release --no-build --framework net8.0 --logger:trx --results-directory TestResults/multinode" outputDirectory: "TestResults" artifactName: "net_mntr_windows-$(Build.BuildId)" mntrFailuresDir: 'TestResults\\multinode'