From f5a691339f4a87106d958ebee077d758bf0c60c2 Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Fri, 18 Sep 2026 19:32:27 +0200 Subject: [PATCH 1/2] CI: stop merging per-assembly XUnit results into one test run Publishing multiple disjoint per-assembly XUnit result files into a single ADO test run (mergeTestResults: true) makes the Publish Test Results task emit a 'TestResultConverter.ConvertResults : No matching test case result found on server' warning for every test in every file after the first -- tens of thousands of warnings per build (63k+ observed) -- and can abort with 'TestCaseTitle must be specified', silently dropping a whole assembly's results. Publish each assembly's XUnit file as its own run instead. Applied to the shared batched-test-steps template and the three explicit PublishTestResults tasks in azure-pipelines-PR.yml. The official azure-pipelines.yml already omits mergeTestResults (defaults to false). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ee9b5f2a-94a7-4b63-ad52-6602d2a0bda6 --- azure-pipelines-PR.yml | 15 ++++++++++++--- eng/templates/batched-test-steps.yml | 7 ++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/azure-pipelines-PR.yml b/azure-pipelines-PR.yml index 8de979f4031..3ef0a1b09ab 100644 --- a/azure-pipelines-PR.yml +++ b/azure-pipelines-PR.yml @@ -269,7 +269,10 @@ stages: inputs: testResultsFormat: 'XUnit' testRunTitle: WindowsNoRealsig_testCoreclr - mergeTestResults: true + # See eng/templates/batched-test-steps.yml: merging disjoint per-assembly XUnit + # files produces tens of thousands of "No matching test case result" warnings and + # can abort the publish, dropping results. Publish each file as its own run. + mergeTestResults: false testResultsFiles: '*.xml' searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/Release' condition: succeededOrFailed() @@ -375,7 +378,10 @@ stages: inputs: testResultsFormat: 'XUnit' testRunTitle: WindowsCompressedMetadata $(_testKind) $(transparentCompiler) - mergeTestResults: true + # See eng/templates/batched-test-steps.yml: publish each assembly file as its own + # run to avoid the merge-time "No matching test case result" warning flood and the + # "TestCaseTitle must be specified" abort that silently drops results. + mergeTestResults: false testResultsFiles: '*.xml' searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_configuration)' continueOnError: true @@ -485,7 +491,10 @@ stages: testResultsFormat: 'XUnit' testRunTitle: Linux testResultsFiles: '*.xml' - mergeTestResults: true + # See eng/templates/batched-test-steps.yml: publish each assembly file as its own + # run to avoid the merge-time "No matching test case result" warning flood and the + # "TestCaseTitle must be specified" abort that silently drops results. + mergeTestResults: false searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)' continueOnError: true condition: succeededOrFailed() diff --git a/eng/templates/batched-test-steps.yml b/eng/templates/batched-test-steps.yml index 712d5e3219f..4b660f5ddf3 100644 --- a/eng/templates/batched-test-steps.yml +++ b/eng/templates/batched-test-steps.yml @@ -38,7 +38,12 @@ steps: inputs: testResultsFormat: 'XUnit' testRunTitle: ${{ parameters.testRunTitlePrefix }} Batch$(batchNumber) - mergeTestResults: true + # Publish each assembly's result file as its own run. Merging disjoint per-assembly + # XUnit files into one run makes the ADO publisher emit a "No matching test case result + # found on server" warning for every test in every file after the first (tens of thousands + # of warnings per build), and can abort with "TestCaseTitle must be specified", silently + # dropping a whole assembly's results. + mergeTestResults: false testResultsFiles: '*.xml' searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/${{ parameters.configuration }}' continueOnError: true From c67a85812154759b374b40ee0ca8289f264e6db8 Mon Sep 17 00:00:00 2001 From: Copilot Date: Mon, 21 Sep 2026 12:06:59 +0200 Subject: [PATCH 2/2] Fix CI failures Split Linux CoreCLR tests into the existing two batches to reduce test-process memory pressure after the exit-137 termination. Keep complete coverage and give each batch distinct test-run and artifact names. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- azure-pipelines-PR.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/azure-pipelines-PR.yml b/azure-pipelines-PR.yml index 3ef0a1b09ab..159bdb29277 100644 --- a/azure-pipelines-PR.yml +++ b/azure-pipelines-PR.yml @@ -471,8 +471,14 @@ stages: - pwsh: .\eng\MockBuild.ps1 displayName: Build with OfficialBuildId - # Linux + # Linux (split into 2 batches to limit test-process memory; batch 3 is desktop-only) - job: Linux + strategy: + matrix: + Batch1: + batchNumber: 1 + Batch2: + batchNumber: 2 pool: name: $(DncEngPublicBuildPool) demands: ImageOverride -equals $(LinuxMachineQueueName) @@ -483,13 +489,13 @@ stages: steps: - checkout: self clean: true - - script: ./eng/cibuild.sh --configuration $(_BuildConfig) --testcoreclr + - script: ./eng/cibuild.sh --configuration $(_BuildConfig) --testcoreclrbatch $(batchNumber) displayName: Build / Test - task: PublishTestResults@2 displayName: Publish Test Results inputs: testResultsFormat: 'XUnit' - testRunTitle: Linux + testRunTitle: Linux Batch$(batchNumber) testResultsFiles: '*.xml' # See eng/templates/batched-test-steps.yml: publish each assembly file as its own # run to avoid the merge-time "No matching test case result" warning flood and the @@ -502,7 +508,7 @@ stages: displayName: Publish Test Logs inputs: PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)' - ArtifactName: 'Linux $(_BuildConfig) test logs' + ArtifactName: 'Linux $(_BuildConfig) Batch$(batchNumber) test logs' publishLocation: Container continueOnError: true condition: failed() @@ -513,7 +519,7 @@ stages: displayName: Publish NuGet cache contents inputs: PathtoPublish: '$(Build.SourcesDirectory)/artifacts/NugetPackageRootContents' - ArtifactName: 'NuGetPackageContents Linux' + ArtifactName: 'NuGetPackageContents Linux Batch$(batchNumber)' publishLocation: Container continueOnError: true condition: failed()