You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2020/04/02 12:08:37 UTC

[lucenenet] branch master updated: Changed build to always use 1 target framework per VM and refactored test binaries so they will be smaller to download per VM.

This is an automated email from the ASF dual-hosted git repository.

nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git


The following commit(s) were added to refs/heads/master by this push:
     new db53430  Changed build to always use 1 target framework per VM and refactored test binaries so they will be smaller to download per VM.
db53430 is described below

commit db5343012ff9cbf0936c4a61abc3412decb9b7a0
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Thu Apr 2 06:32:38 2020 +0700

    Changed build to always use 1 target framework per VM and refactored test binaries so they will be smaller to download per VM.
    
    * Increased maximum parallel jobs
    
    * Eliminated publish-test-results-for-target-frameworks.yml
    
    * Setup publish-test-results-for-target-frameworks.yml to accept a framework parameter
    
    * run-tests-on-os.yml: Changed template to only support a single target framework
    
    * Changed pipeline to zip each target framework's test binaries individually, so downloads don't take so long
---
 Lucene.Net.sln                                     |  23 +++-
 azure-pipelines.yml                                |  34 ++++--
 .../publish-test-results-for-target-frameworks.yml |  67 ------------
 .../publish-test-results-for-test-projects.yml     | 116 +++++++++++++--------
 build/azure-templates/run-tests-on-os.yml          |  23 ++--
 5 files changed, 131 insertions(+), 132 deletions(-)

diff --git a/Lucene.Net.sln b/Lucene.Net.sln
index b19c811..3e222f8 100644
--- a/Lucene.Net.sln
+++ b/Lucene.Net.sln
@@ -1,11 +1,28 @@
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29728.190
+# Visual Studio 15
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+#   http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+VisualStudioVersion = 15.0.26730.8
 MinimumVisualStudioVersion = 15.0.26730.8
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "azure-templates", "azure-templates", "{05CE3A39-40D4-452D-AFE0-E57E536A08C6}"
 	ProjectSection(SolutionItems) = preProject
 		build\azure-templates\publish-nuget-packages.yml = build\azure-templates\publish-nuget-packages.yml
-		build\azure-templates\publish-test-results-for-target-frameworks.yml = build\azure-templates\publish-test-results-for-target-frameworks.yml
 		build\azure-templates\publish-test-results-for-test-projects.yml = build\azure-templates\publish-test-results-for-test-projects.yml
 		build\azure-templates\publish-test-results.yml = build\azure-templates\publish-test-results.yml
 		build\azure-templates\run-tests-on-os.yml = build\azure-templates\run-tests-on-os.yml
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index d3d2b30..5712013 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -117,11 +117,27 @@ stages:
     - template: 'build/azure-templates/show-all-environment-variables.yml'
 
     - task: ArchiveFiles@2
-      displayName: 'Zip $(PublishTempDirectory)'
+      displayName: 'Zip $(PublishTempDirectory)/netcoreapp3.1'
       inputs:
-        rootFolderOrFile: '$(PublishTempDirectory)'
+        rootFolderOrFile: '$(PublishTempDirectory)/netcoreapp3.1'
         includeRootFolder: false
-        archiveFile: '$(PublishDirectory)/$(PublishedArtifactZipFileName)'
+        archiveFile: '$(PublishDirectory)/netcoreapp3.1/$(PublishedArtifactZipFileName)'
+      condition: and(succeeded(), ne(variables['RunTests'], 'false'))
+
+    - task: ArchiveFiles@2
+      displayName: 'Zip $(PublishTempDirectory)/netcoreapp2.2'
+      inputs:
+        rootFolderOrFile: '$(PublishTempDirectory)/netcoreapp2.2'
+        includeRootFolder: false
+        archiveFile: '$(PublishDirectory)/netcoreapp2.2/$(PublishedArtifactZipFileName)'
+      condition: and(succeeded(), ne(variables['RunTests'], 'false'))
+
+    - task: ArchiveFiles@2
+      displayName: 'Zip $(PublishTempDirectory)/net48'
+      inputs:
+        rootFolderOrFile: '$(PublishTempDirectory)/net48'
+        includeRootFolder: false
+        archiveFile: '$(PublishDirectory)/net48/$(PublishedArtifactZipFileName)'
       condition: and(succeeded(), ne(variables['RunTests'], 'false'))
 
     - powershell: |
@@ -257,10 +273,10 @@ stages:
     - template: 'build/azure-templates/run-tests-on-os.yml'
       parameters:
         osName: $(osName)
-        testTargetFrameworks: 'netcoreapp3.1'
+        framework: 'netcoreapp3.1'
         testResultsArtifactName: '$(TestResultsArtifactName)'
         publishedArtifactZipFileName: '$(PublishedArtifactZipFileName)'
-        maximumParallelJobs: 7
+        maximumParallelJobs: 8
         maximumAllowedFailures: $(maximumAllowedFailures)
 
   - job: Test_netcoreapp2_2
@@ -286,10 +302,10 @@ stages:
     - template: 'build/azure-templates/run-tests-on-os.yml'
       parameters:
         osName: $(osName)
-        testTargetFrameworks: 'netcoreapp2.2'
+        framework: 'netcoreapp2.2'
         testResultsArtifactName: '$(TestResultsArtifactName)'
         publishedArtifactZipFileName: '$(PublishedArtifactZipFileName)'
-        maximumParallelJobs: 7
+        maximumParallelJobs: 8
         maximumAllowedFailures: $(maximumAllowedFailures)
 
   - job: Test_net48_Windows
@@ -301,10 +317,10 @@ stages:
     - template: 'build/azure-templates/run-tests-on-os.yml'
       parameters:
         osName: 'Windows'
-        testTargetFrameworks: 'net48'
+        framework: 'net48'
         testResultsArtifactName: '$(TestResultsArtifactName)'
         publishedArtifactZipFileName: '$(PublishedArtifactZipFileName)'
-        maximumParallelJobs: 8
+        maximumParallelJobs: 9
         maximumAllowedFailures: 4 # Maximum allowed failures for a successful build
 
 
diff --git a/build/azure-templates/publish-test-results-for-target-frameworks.yml b/build/azure-templates/publish-test-results-for-target-frameworks.yml
deleted file mode 100644
index 6c0c982..0000000
--- a/build/azure-templates/publish-test-results-for-target-frameworks.yml
+++ /dev/null
@@ -1,67 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-# 
-#   http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# Runs Publish Test Results task for a specific framework
-
-parameters:
-  testProjectName: '' # The name of the test project
-  osName: '' # The name of the operating system for display purposes.
-  testResultsFormat: VSTest # Specify the format of the results files you want to publish. The following formats are supported: JUnit, NUnit, VSTest, XUnit, CTest
-  testResultsArtifactName: 'testresults' # The name of the Azure DevOps build artifact where the test results will be published. Default 'testresults'.
-  testResultsFileName: 'TestResults.trx' # The name of the file (not path) of the test results. Default 'TestResults.trx'.
-
-steps:
-#- powershell: |
-#    function EnsureNotNullOrEmpty([string]$param, [string]$nameOfParam) {
-#        if ([string]::IsNullOrEmpty($param)) {
-#            Write-Host "##vso[task.logissue type=error;]Missing template parameter \"$nameOfParam\""
-#            Write-Host "##vso[task.complete result=Failed;]"
-#        }
-#    }
-#    EnsureNotNullOrEmpty('${{ parameters.testProjectName }}', 'testProjectName')
-#    EnsureNotNullOrEmpty('${{ parameters.osName }}', 'osName')
-#    EnsureNotNullOrEmpty('${{ parameters.testResultsFormat }}', 'testResultsFormat')
-#    EnsureNotNullOrEmpty('${{ parameters.testResultsArtifactName }}', 'testResultsArtifactName')
-#    EnsureNotNullOrEmpty('${{ parameters.testResultsFileName }}', 'testResultsFileName')
-#  displayName: 'Validate Template Parameters'
-
-- template: publish-test-results.yml
-  parameters:
-    framework: 'netcoreapp3.1'
-    testProjectName: '${{ parameters.testProjectName }}'
-    osName: '${{ parameters.osName }}'
-    testResultsFormat: '${{ parameters.testResultsFormat }}'
-    testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
-    testResultsFileName: '${{ parameters.testResultsFileName }}'
-
-- template: publish-test-results.yml
-  parameters:
-    framework: 'netcoreapp2.2'
-    testProjectName: '${{ parameters.testProjectName }}'
-    osName: '${{ parameters.osName }}'
-    testResultsFormat: '${{ parameters.testResultsFormat }}'
-    testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
-    testResultsFileName: '${{ parameters.testResultsFileName }}'
-
-- template: publish-test-results.yml
-  parameters:
-    framework: 'net48'
-    testProjectName: '${{ parameters.testProjectName }}'
-    osName: '${{ parameters.osName }}'
-    testResultsFormat: '${{ parameters.testResultsFormat }}'
-    testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
-    testResultsFileName: '${{ parameters.testResultsFileName }}'
\ No newline at end of file
diff --git a/build/azure-templates/publish-test-results-for-test-projects.yml b/build/azure-templates/publish-test-results-for-test-projects.yml
index 1f1f3ef..3cc61d1 100644
--- a/build/azure-templates/publish-test-results-for-test-projects.yml
+++ b/build/azure-templates/publish-test-results-for-test-projects.yml
@@ -29,10 +29,11 @@
 #    $projectName = [System.IO.Path]::GetFileNameWithoutExtension($testProject)
 #
 #    $block = `
-#        "- template: publish-test-results-for-target-frameworks.yml`n" + `
+#        "- template: publish-test-results.yml`n" + `
 #        "  parameters:`n" + `
 #        "    testProjectName: '$projectName'`n" + `
 #        "    osName: '$`{`{ parameters.osName `}`}'`n" + `
+#        "    framework: '$`{`{ parameters.framework `}`}'`n" + `
 #        "    testResultsFormat: '$`{`{ parameters.testResultsFormat `}`}'`n" + `
 #        "    testResultsArtifactName: '$`{`{ parameters.testResultsArtifactName `}`}'`n" + `
 #        "    testResultsFileName: '$`{`{ parameters.testResultsFileName `}`}'`n" + `
@@ -45,6 +46,7 @@
 
 parameters:
   osName: '' # The name of the operating system for display purposes.
+  framework: '' # The target framework to publish.
   testResultsFormat: VSTest # Specify the format of the results files you want to publish. The following formats are supported: JUnit, NUnit, VSTest, XUnit, CTest
   testResultsArtifactName: 'testresults' # The name of the Azure DevOps build artifact where the test results will be published. Default 'testresults'.
   testResultsFileName: 'TestResults.trx' # The name of the file (not path) of the test results. Default 'TestResults.trx'.
@@ -63,18 +65,11 @@ steps:
 #    EnsureNotNullOrEmpty('${{ parameters.testResultsFileName }}', 'testResultsFileName')
 #  displayName: 'Validate Template Parameters'
 
-- template: publish-test-results-for-target-frameworks.yml
-  parameters:
-    testProjectName: 'Lucene.Net.Tests.ICU'
-    osName: '${{ parameters.osName }}'
-    testResultsFormat: '${{ parameters.testResultsFormat }}'
-    testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
-    testResultsFileName: '${{ parameters.testResultsFileName }}'
 
 # Special case: Only supports .NET Standard 2.0
 - template: publish-test-results.yml
   parameters:
-    framework: 'netcoreapp2.2'
+    framework: 'netcoreapp2.2' # Since condtions are not supported for templates, we check for the file existence within publish-test-results.yml
     testProjectName: 'Lucene.Net.Tests.CodeAnalysis'
     osName: '${{ parameters.osName }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
@@ -84,7 +79,7 @@ steps:
 # Special case: Only supports .netcoreapp3.1
 - template: publish-test-results.yml
   parameters:
-    framework: 'netcoreapp3.1'
+    framework: 'netcoreapp3.1' # Since condtions are not supported for templates, we check for the file existence within publish-test-results.yml
     testProjectName: 'Lucene.Net.Tests.Cli'
     osName: '${{ parameters.osName }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
@@ -94,7 +89,7 @@ steps:
 # Special case: Only supports .net48
 - template: publish-test-results.yml
   parameters:
-    framework: 'net48'
+    framework: 'net48' # Since condtions are not supported for templates, we check for the file existence within publish-test-results.yml
     testProjectName: 'Lucene.Net.Tests.Analysis.OpenNLP'
     osName: '${{ parameters.osName }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
@@ -102,234 +97,273 @@ steps:
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
+  parameters:
+    testProjectName: 'Lucene.Net.Tests.ICU'
+    osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
+    testResultsFormat: '${{ parameters.testResultsFormat }}'
+    testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
+    testResultsFileName: '${{ parameters.testResultsFileName }}'
+
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests._A-D'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests._E-I'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests._J-S'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests._T-U'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests._U-Z'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Analysis.Common'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Analysis.Kuromoji'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Analysis.Morfologik'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Analysis.Phonetic'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Analysis.SmartCn'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Analysis.Stempel'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Benchmark'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Classification'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Codecs'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Demo'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Expressions'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Facet'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Grouping'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Highlighter'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Join'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Memory'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Misc'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Queries'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.QueryParser'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Replicator'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Sandbox'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Spatial'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.Suggest'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
     testResultsFileName: '${{ parameters.testResultsFileName }}'
 
-- template: publish-test-results-for-target-frameworks.yml
+- template: publish-test-results.yml
   parameters:
     testProjectName: 'Lucene.Net.Tests.TestFramework'
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
     testResultsFormat: '${{ parameters.testResultsFormat }}'
     testResultsArtifactName: '${{ parameters.testResultsArtifactName }}'
-    testResultsFileName: '${{ parameters.testResultsFileName }}'
\ No newline at end of file
+    testResultsFileName: '${{ parameters.testResultsFileName }}'
+
diff --git a/build/azure-templates/run-tests-on-os.yml b/build/azure-templates/run-tests-on-os.yml
index 480bb9e..8000748 100644
--- a/build/azure-templates/run-tests-on-os.yml
+++ b/build/azure-templates/run-tests-on-os.yml
@@ -21,7 +21,7 @@
 
 parameters:
   osName: 'Windows' # The name of the operating system for display purposes.
-  testTargetFrameworks: '' # A semicolon separated list of target frameworks indicating which frameworks tests will be run on. See: https://docs.microsoft.com/en-us/dotnet/standard/frameworks.
+  framework: '' # The target framework indicating which framework tests will be run on. See: https://docs.microsoft.com/en-us/dotnet/standard/frameworks.
   binaryArtifactName: 'testbinaries' # The name of the Azure DevOps build artifact where the test assemblies will be downloaded from. Default 'testbinaries'.
   testResultsArtifactName: 'testresults' # The name of the Azure DevOps build artifact where the test results will be published. Default 'testresults'.
   vsTestPlatform: 'x64' # Target platform architecture used for test execution. Valid values are x86, x64, and ARM.
@@ -41,7 +41,7 @@ steps:
         }
     }
     EnsureNotNullOrEmpty('${{ parameters.osName }}', 'osName')
-    EnsureNotNullOrEmpty('${{ parameters.testTargetFrameworks }}', 'testTargetFrameworks')
+    EnsureNotNullOrEmpty('${{ parameters.framework }}', 'framework')
     EnsureNotNullOrEmpty('${{ parameters.binaryArtifactName }}', 'binaryArtifactName')
     EnsureNotNullOrEmpty('${{ parameters.testResultsArtifactName }}', 'testResultsArtifactName')
     EnsureNotNullOrEmpty('${{ parameters.vsTestPlatform }}', 'vsTestPlatform')
@@ -56,25 +56,26 @@ steps:
   displayName: 'Use .NET Core sdk 3.1.100'
   inputs:
     version: 3.1.100
-  condition: and(succeeded(), contains('${{ parameters.testTargetFrameworks }}', 'netcoreapp3.'))
+  condition: and(succeeded(), contains('${{ parameters.framework }}', 'netcoreapp3.'))
 
 - task: DownloadBuildArtifacts@0
   displayName: 'Download Build Artifacts: ${{ parameters.binaryArtifactName }}'
   inputs:
     artifactName: ${{ parameters.binaryArtifactName }}
     downloadPath: '$(System.DefaultWorkingDirectory)'
+    itemPattern: '**/${{ parameters.framework }}/*.*'
 
 #- template: 'show-all-files.yml' # Uncomment for debugging
 
 - task: ExtractFiles@1
   displayName: 'Extract files from ${{ parameters.publishedArtifactZipFileName }}'
   inputs:
-    archiveFilePatterns: '${{ parameters.binaryArtifactName }}/${{ parameters.publishedArtifactZipFileName }}'
-    destinationFolder: '$(System.DefaultWorkingDirectory)/${{ parameters.binaryArtifactName }}'
+    archiveFilePatterns: '${{ parameters.binaryArtifactName }}/${{ parameters.framework }}/${{ parameters.publishedArtifactZipFileName }}'
+    destinationFolder: '$(System.DefaultWorkingDirectory)/${{ parameters.binaryArtifactName }}/${{ parameters.framework }}/'
     cleanDestinationFolder: false
 
 - powershell: |
-    $testTargetFrameworksString = '${{ parameters.testTargetFrameworks }}'
+    $framework = '${{ parameters.framework }}'
     $testBinaryRootDirectory = "$(System.DefaultWorkingDirectory)"
     $testResultsArtifactDirectory = "${{ format('$(Build.ArtifactStagingDirectory)/{0}',parameters.testResultsArtifactName) }}"
     $testPlatform = '${{ parameters.vsTestPlatform }}'
@@ -83,7 +84,6 @@ steps:
     $testResultsFileName = '${{ parameters.testResultsFileName }}'
     $maximumParalellJobs = '${{ parameters.maximumParallelJobs }}'
     $where = '${{ parameters.where }}'
-    $testTargetFrameworks = $testTargetFrameworksString.Split([char]',',[char]';')
     
     function SeparateVersionDigits([string]$digits) {
         return (&{ for ($i = 0;$i -lt $digits.Length;$i++) { $digits.Substring($i,1) }}) -join '.'
@@ -144,7 +144,7 @@ steps:
             }
     
             $fwork = ConvertFrameworkName($framework)
-            $testResultDirectory = "$testResultsArtifactDirectory/$testOSName/$framework/$testName"                
+            $testResultDirectory = "$testResultsArtifactDirectory/$testOSName/$framework/$testName"
             if (!(Test-Path "$testResultDirectory")) {
                 New-Item "$testResultDirectory" -ItemType Directory -Force
             }
@@ -178,9 +178,7 @@ steps:
         }
     }
     
-    foreach ($framework in $testTargetFrameworks) {
-        RunTests -Framework "$framework" -FileRegexPattern "$testBinaryFilesPattern"
-    }
+    RunTests -Framework "$framework" -FileRegexPattern "$testBinaryFilesPattern"
     
     if ($maximumParalellJobs -gt 1) {
         # Wait for it all to complete
@@ -201,7 +199,7 @@ steps:
     }
     
     $global:LASTEXITCODE = 0 # Force the script to continue on error
-  displayName: 'dotnet vstest ${{ parameters.testTargetFrameworks }}'
+  displayName: 'dotnet vstest ${{ parameters.framework }}'
   ignoreLASTEXITCODE: true
 
 #- template: 'show-all-files.yml' # Uncomment for debugging
@@ -223,6 +221,7 @@ steps:
 - template: 'publish-test-results-for-test-projects.yml'
   parameters:
     osName: '${{ parameters.osName }}'
+    framework: '${{ parameters.framework }}'
 
 - pwsh: |
     $maximumAllowedFailures = '${{ parameters.maximumAllowedFailures }}'