Skip to content

Commit a6f9ce3

Browse files
authored
Improve build times - Split X86, Parallelize Code Coverage generation (#2992)
1 parent 5744b51 commit a6f9ce3

File tree

4 files changed

+149
-21
lines changed

4 files changed

+149
-21
lines changed

eng/pipelines/common/templates/jobs/ci-code-coverage-job.yml

Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -60,25 +60,51 @@ jobs:
6060
Get-ChildItem $(Build.SourcesDirectory)\coverageNetCore\ -Recurse -File -Filter *.coverage
6161
displayName: 'List coverageNetCore files [debug]'
6262
63-
- powershell: |
63+
- pwsh: |
6464
dotnet tool install --global dotnet-coverage
6565
66-
$files = Get-ChildItem $(Build.SourcesDirectory)\coverageNetFx\ -Recurse -File -Filter *.coverage
67-
# echo $files
68-
mkdir coverageNetFxXml
69-
$counter=0
70-
foreach ($file in $files) {
71-
& dotnet-coverage merge $file.FullName --output coverageNetFxXml\$((++$counter)).coveragexml --output-format xml
72-
}
66+
function MergeFiles {
67+
param(
68+
[string]$InputDirectoryPath,
69+
[string]$OutputDirectoryName
70+
)
71+
72+
$files = Get-ChildItem $InputDirectoryPath -Recurse -File -Filter *.coverage
73+
74+
# echo $files
75+
mkdir $OutputDirectoryName
76+
$counter=0
77+
78+
$toProcess = @()
79+
80+
foreach ($file in $files) {
81+
$toProcess += @{
82+
File = $file.FullName
83+
OutputFile = "$OutputDirectoryName\$counter.coveragexml"
84+
}
85+
86+
$counter++
87+
}
88+
89+
$jobs = @()
90+
foreach ($file in $toProcess){
91+
$jobs += Start-ThreadJob -ScriptBlock {
92+
$params = $using:file
93+
& dotnet-coverage merge $($params.File) --output $($params.OutputFile) --output-format xml
94+
}
95+
}
7396
74-
$files = Get-ChildItem $(Build.SourcesDirectory)\coverageNetCore\ -Recurse -File -Filter *.coverage
75-
# echo $files
76-
mkdir coverageNetCoreXml
77-
$counter=0
78-
foreach ($file in $files) {
79-
& dotnet-coverage merge $file.FullName --output coverageNetCoreXml\$((++$counter)).coveragexml --output-format xml
97+
Write-Host "Merging started..."
98+
Wait-Job -Job $jobs
99+
100+
foreach ($job in $jobs) {
101+
Receive-Job -Job $job -Wait -AutoRemoveJob
102+
}
80103
}
81104
105+
MergeFiles -InputDirectoryPath "$(Build.SourcesDirectory)\coverageNetFx\" -OutputDirectoryName "coverageNetFxXml"
106+
MergeFiles -InputDirectoryPath "$(Build.SourcesDirectory)\coverageNetCore\" -OutputDirectoryName "coverageNetCoreXml"
107+
82108
# dir coverageNetFxXml\
83109
# dir coverageNetCoreXml\
84110
@@ -95,14 +121,28 @@ jobs:
95121
dir coverageNetCoreXml\
96122
displayName: 'List converted files [debug]'
97123
98-
- script: |
124+
- pwsh: |
99125
dotnet tool install dotnet-reportgenerator-globaltool --tool-path tools
100126
101-
tools\reportgenerator "-reports:coverageNetFxXml\*.coveragexml" "-targetdir:coveragereportNetFx" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\netfx\src;$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\src" "-classfilters:+Microsoft.Data.*"
127+
$jobs = @()
128+
$jobs += Start-ThreadJob -ScriptBlock {
129+
& tools\reportgenerator "-reports:coverageNetFxXml\*.coveragexml" "-targetdir:coveragereportNetFx" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\netfx\src;$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\src" "-classfilters:+Microsoft.Data.*"
130+
}
131+
132+
$jobs += Start-ThreadJob -ScriptBlock {
133+
& tools\reportgenerator "-reports:coverageNetCoreXml\*.coveragexml" "-targetdir:coveragereportAddOns" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.alwaysencrypted.azurekeyvaultprovider.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\add-ons\AzureKeyVaultProvider" "-classfilters:+Microsoft.Data.*"
134+
}
135+
136+
$jobs += Start-ThreadJob -ScriptBlock {
137+
& tools\reportgenerator "-reports:coverageNetCoreXml\*.coveragexml" "-targetdir:coveragereportNetCore" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\netcore\src;$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\src" "-classfilters:+Microsoft.Data.*"
138+
}
102139
103-
tools\reportgenerator "-reports:coverageNetCoreXml\*.coveragexml" "-targetdir:coveragereportAddOns" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.alwaysencrypted.azurekeyvaultprovider.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\add-ons\AzureKeyVaultProvider" "-classfilters:+Microsoft.Data.*"
140+
Write-Host "Running ReportGenerator..."
141+
Wait-Job -Job $jobs
104142
105-
tools\reportgenerator "-reports:coverageNetCoreXml\*.coveragexml" "-targetdir:coveragereportNetCore" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\netcore\src;$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\src" "-classfilters:+Microsoft.Data.*"
143+
foreach ($job in $jobs) {
144+
Receive-Job -Job $job -Wait -AutoRemoveJob
145+
}
106146
displayName: 'Run ReportGenerator'
107147
108148
- task: PublishCodeCoverageResults@2

eng/pipelines/common/templates/jobs/ci-run-tests-job.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ parameters:
4747
type: boolean
4848
default: false
4949

50+
- name: enableX64Test
51+
type: boolean
52+
default: true
53+
5054
- name: testSet
5155
type: string
5256

@@ -205,6 +209,7 @@ jobs:
205209
${{ if ne(parameters.operatingSystem, 'Windows') }}:
206210
OSGroup: Unix
207211

212+
- ${{ if eq(parameters.enableX64Test, true) }}: # run native tests
208213
- template: ../steps/run-all-tests-step.yml@self # run tests
209214
parameters:
210215
debug: ${{ parameters.debug }}

eng/pipelines/common/templates/stages/ci-run-tests-stage.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ stages:
6565
${{ each x86TF in config.value.configProperties.x86TestTargetFrameworks }}:
6666
${{ if eq(x86TF, targetFramework) }}:
6767
enableX86Test: true
68+
enableX64Test: false
6869
- ${{ else }}: # .NET
6970
- ${{ each useManagedSNI in config.value.useManagedSNI }}:
7071
- template: ../jobs/ci-run-tests-job.yml@self
@@ -93,6 +94,7 @@ stages:
9394
${{ each x86TF in config.value.configProperties.x86TestTargetFrameworks }}:
9495
${{ if eq(x86TF, targetFramework) }}:
9596
enableX86Test: true
97+
enableX64Test: false
9698

9799
- ${{ if ne(length(parameters.postTestJobs), 0) }}:
98100
- stage: Post_Test

eng/pipelines/dotnet-sqlclient-ci-core.yml

Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ stages:
107107
# test stages configurations
108108
# self hosted SQL Server on Windows
109109
testConfigurations:
110-
windows_sql_19: # configuration name
110+
windows_sql_19_x64: # configuration name
111111
pool: ${{parameters.defaultPoolName }} # pool name
112112
hostedPool: false # whether the pool is hosted or not
113113
images: # list of images to run tests on
@@ -137,7 +137,6 @@ stages:
137137
LocalDbSharedInstanceName: $(LocalDbSharedInstanceName)
138138
AliasName: $(SQLAliasName)
139139
# extra config properties
140-
x86TestTargetFrameworks: [net8.0] # target frameworks should run tests on x86 as well
141140
SQLRootPath: $(SQL19RootPath)
142141
enableLocalDB: true
143142
# instanceName: default: MSSQLSERVER
@@ -154,7 +153,56 @@ stages:
154153
# localDbSharedInstanceName: default: $(LocalDbSharedInstanceName)
155154
# skipSqlConfiguration: # skips the SQL configuration step
156155

157-
windows_sql_22:
156+
157+
windows_sql_19_x86: # configuration name
158+
pool: ${{parameters.defaultPoolName }} # pool name
159+
hostedPool: false # whether the pool is hosted or not
160+
images: # list of images to run tests on
161+
Win22_Sql19_x86: ADO-MMS22-SQL19 # stage display name: image name from the pool
162+
TargetFrameworks: [net8.0] #[net462, net8.0] # list of target frameworks to run
163+
netcoreVersionTestUtils: ${{parameters.netcoreVersionTestUtils }}
164+
buildPlatforms: ${{parameters.buildPlatforms }}
165+
testSets: ${{parameters.testSets }} # [1, 2, 3] # list of test sets to run
166+
useManagedSNI: [false] # can be used for .NET Core only tests on Windows: [false, true], [false] or [true] values are allowed
167+
codeCovTargetFrameworks: ${{parameters.codeCovTargetFrameworks }} # targeted frameworks that is going to participate in test result report generation
168+
configSqlFor: local # setup Sql Server (local | azure | enclave)
169+
operatingSystem: Windows # operating system to run tests on (Windows | Linux | Mac)
170+
configProperties:
171+
# config.json properties
172+
TCPConnectionString: $(SQL_TCP_CONN_STRING)
173+
NPConnectionString: $(SQL_NP_CONN_STRING)
174+
AADAuthorityURL: $(AADAuthorityURL)
175+
AADPasswordConnectionString: $(AAD_PASSWORD_CONN_STR)
176+
AADServicePrincipalId: $(AADServicePrincipalId)
177+
AADServicePrincipalSecret: $(AADServicePrincipalSecret)
178+
AzureKeyVaultUrl: $(AzureKeyVaultUrl)
179+
AzureKeyVaultTenantId: $(AzureKeyVaultTenantId)
180+
SupportsIntegratedSecurity: $(SupportsIntegratedSecurity)
181+
UserManagedIdentityClientId: $(UserManagedIdentityClientId)
182+
FileStreamDirectory: $(FileStreamDirectory)
183+
LocalDbAppName: $(LocalDbAppName)
184+
LocalDbSharedInstanceName: $(LocalDbSharedInstanceName)
185+
AliasName: $(SQLAliasName)
186+
# extra config properties
187+
x86TestTargetFrameworks: [net8.0] # target frameworks should run tests on x86
188+
SQLRootPath: $(SQL19RootPath)
189+
enableLocalDB: true
190+
# instanceName: default: MSSQLSERVER
191+
# user: default: $(user)
192+
# saUser: default: $(saUser)
193+
# password: default: $(password)
194+
# fileStreamDirectory: default: ''
195+
# x64AliasRegistryPath: default: $(x64AliasRegistryPath)
196+
# x86AliasRegistryPath: default: $(x86AliasRegistryPath)
197+
# SQLAliasName: default: $(SQLAliasName)
198+
# SQLAliasPort: default: $(SQLAliasPort)
199+
# databaseName: default: Northwind
200+
# localDbAppName: default: $(LocalDbAppName)
201+
# localDbSharedInstanceName: default: $(LocalDbSharedInstanceName)
202+
# skipSqlConfiguration: # skips the SQL configuration step
203+
204+
205+
windows_sql_22_x64:
158206
pool: ${{parameters.defaultPoolName }}
159207
images:
160208
Win22_Sql22: ADO-MMS22-SQL22
@@ -166,6 +214,39 @@ stages:
166214
codeCovTargetFrameworks: ${{parameters.codeCovTargetFrameworks }}
167215
configSqlFor: local
168216
operatingSystem: Windows
217+
configProperties:
218+
# config.json properties
219+
TCPConnectionString: $(SQL_TCP_CONN_STRING)
220+
NPConnectionString: $(SQL_NP_CONN_STRING)
221+
AADAuthorityURL: $(AADAuthorityURL)
222+
AADPasswordConnectionString: $(AAD_PASSWORD_CONN_STR)
223+
AADServicePrincipalId: $(AADServicePrincipalId)
224+
AADServicePrincipalSecret: $(AADServicePrincipalSecret)
225+
AzureKeyVaultUrl: $(AzureKeyVaultUrl)
226+
AzureKeyVaultTenantId: $(AzureKeyVaultTenantId)
227+
SupportsIntegratedSecurity: $(SupportsIntegratedSecurity)
228+
UserManagedIdentityClientId: $(UserManagedIdentityClientId)
229+
FileStreamDirectory: $(FileStreamDirectory)
230+
LocalDbAppName: $(LocalDbAppName)
231+
LocalDbSharedInstanceName: $(LocalDbSharedInstanceName)
232+
AliasName: $(SQLAliasName)
233+
# extra config properties
234+
SQLRootPath: $(SQL22RootPath)
235+
enableLocalDB: true
236+
237+
238+
windows_sql_22_x86:
239+
pool: ${{parameters.defaultPoolName }}
240+
images:
241+
Win22_Sql22_x86: ADO-MMS22-SQL22
242+
TargetFrameworks: [net462]
243+
netcoreVersionTestUtils: ${{parameters.netcoreVersionTestUtils }}
244+
buildPlatforms: ${{parameters.buildPlatforms }}
245+
testSets: ${{parameters.testSets }}
246+
useManagedSNI: [false]
247+
codeCovTargetFrameworks: ${{parameters.codeCovTargetFrameworks }}
248+
configSqlFor: local
249+
operatingSystem: Windows
169250
configProperties:
170251
# config.json properties
171252
TCPConnectionString: $(SQL_TCP_CONN_STRING)

0 commit comments

Comments
 (0)