Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 1cb3704

Browse files
authored
Merge pull request #17161 from dotnetrt/testbuild
Improve Windows test build performance by building projects in groups - 4x less memory 326% faster build.
2 parents 0578152 + 916be4b commit 1cb3704

File tree

3 files changed

+259
-18
lines changed

3 files changed

+259
-18
lines changed

build-test.cmd

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ set __ZipTests=
5151
set __TargetsWindows=1
5252
set __DoCrossgen=
5353

54+
@REM CMD has a nasty habit of eating "=" on the argument list, so passing:
55+
@REM -priority=1
56+
@REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
57+
@REM and allow the "-priority=1" syntax.
58+
set __Priority=0
59+
5460
:Arg_Loop
5561
if "%1" == "" goto ArgsDone
5662

@@ -75,6 +81,7 @@ if /i "%1" == "crossgen" (set __DoCrossgen=1&set processedArgs=!pro
7581
if /i "%1" == "runtimeid" (set __RuntimeId=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
7682
if /i "%1" == "targetsNonWindows" (set __TargetsWindows=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
7783
if /i "%1" == "Exclude" (set __Exclude=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
84+
if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
7885

7986
if [!processedArgs!]==[] (
8087
set __UnprocessedBuildArgs=%__args%
@@ -87,6 +94,9 @@ if [!processedArgs!]==[] (
8794

8895
:ArgsDone
8996

97+
@REM Special handling for -priority=N argument.
98+
if %__Priority% GTR 0 (set "__UnprocessedBuildArgs=!__UnprocessedBuildArgs! -priority=%__Priority%")
99+
90100
if defined __BuildAgainstPackagesArg (
91101
if not defined __RuntimeID (
92102
echo %__MsgPrefix%Error: When building against packages, you must supply a target Runtime ID.
@@ -267,22 +277,43 @@ if not defined VSINSTALLDIR (
267277
echo %__MsgPrefix%Error: build-test.cmd should be run from a Visual Studio Command Prompt. Please see https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md for build instructions.
268278
exit /b 1
269279
)
270-
280+
set __AppendToLog=false
271281
set __BuildLogRootName=Tests_Managed
272282
set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
273283
set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
274284
set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
275-
set __msbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
276-
set __msbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
277-
set __msbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
278285

279-
call "%__ProjectDir%\run.cmd" build -Project=%__ProjectDir%\tests\build.proj -MsBuildLog=!__msbuildLog! -MsBuildWrn=!__msbuildWrn! -MsBuildErr=!__msbuildErr! %__RunArgs% %__BuildAgainstPackagesArg% %__unprocessedBuildArgs%
280-
if errorlevel 1 (
281-
echo %__MsgPrefix%Error: build failed. Refer to the build log files for details:
282-
echo %__BuildLog%
283-
echo %__BuildWrn%
284-
echo %__BuildErr%
285-
exit /b 1
286+
REM Execute msbuild test build in stages - workaround for excessive data retention in MSBuild ConfigCache
287+
REM See https://github.com/Microsoft/msbuild/issues/2993
288+
289+
set __SkipPackageRestore=false
290+
set __SkipTargetingPackBuild=false
291+
set __BuildLoopCount=2
292+
set __TestGroupToBuild=1
293+
294+
if %__Priority% GTR 0 (set __BuildLoopCount=16&set __TestGroupToBuild=2)
295+
echo %__MsgPrefix%Building tests group %__TestGroupToBuild% with %__BuildLoopCount% subgroups
296+
297+
for /l %%G in (1, 1, %__BuildLoopCount%) do (
298+
299+
set __msbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%";Append=!__AppendToLog!
300+
set __msbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%";Append=!__AppendToLog!
301+
set __msbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%";Append=!__AppendToLog!
302+
303+
set TestBuildSlice=%%G
304+
call "%__ProjectDir%\run.cmd" build -Project=%__ProjectDir%\tests\build.proj -MsBuildLog=!__msbuildLog! -MsBuildWrn=!__msbuildWrn! -MsBuildErr=!__msbuildErr! %__RunArgs% %__BuildAgainstPackagesArg% %__unprocessedBuildArgs%
305+
306+
if errorlevel 1 (
307+
echo %__MsgPrefix%Error: build failed. Refer to the build log files for details:
308+
echo %__BuildLog%
309+
echo %__BuildWrn%
310+
echo %__BuildErr%
311+
exit /b 1
312+
)
313+
314+
set __SkipPackageRestore=true
315+
set __SkipTargetingPackBuild=true
316+
set __AppendToLog=true
286317
)
287318

288319
REM Prepare the Test Drop

tests/build.proj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
</ItemGroup>
1010

1111
<Import Project="dir.targets" />
12-
12+
1313
<Import Project="dir.traversal.targets" />
14-
14+
1515
<PropertyGroup>
1616
<TraversalBuildDependsOn>
1717
BatchRestorePackages;
@@ -34,15 +34,15 @@
3434
<RestoreProjects Include="$(MSBuildThisFileDirectory)src\TestWrappersConfig\TestWrappersConfig.csproj" />
3535
</ItemGroup>
3636

37-
<Target Name="BuildTargetingPack" AfterTargets="BatchRestorePackages">
37+
<Target Name="BuildTargetingPack" AfterTargets="BatchRestorePackages" Condition="$(__SkipTargetingPackBuild) != 'true'">
3838
<Message Text="Building Targeting Pack" Importance="High" />
3939
<Error Text="BuildOS has not been specified. Please do that then run build again." Condition="'$(BuildOS)' == 'AnyOS'" />
4040
<MSBuild Projects="$(MSBuildThisFileDirectory)\src\Common\external\external.depproj" />
4141
</Target>
4242

43-
<Target Name="BatchRestorePackages">
43+
<Target Name="BatchRestorePackages" Condition="$(__SkipPackageRestore) != 'true'">
4444
<Message Importance="High" Text="[$([System.DateTime]::Now.ToString('HH:mm:ss.ff'))] Restoring all packages..." />
45-
45+
4646
<!-- restore all csproj's with PackageReferences in one pass -->
4747
<MSBuild Projects="build.proj"
4848
Properties="RestoreProj=%(RestoreProjects.Identity)"

tests/src/dirs.proj

Lines changed: 212 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,225 @@
3232
<DisabledProjects Include="Loader\classloader\generics\regressions\DD117522\Test.csproj" />
3333
<DisabledProjects Include="Loader\classloader\generics\GenericMethods\VSW491668.csproj" /> <!-- issue 5501 -->
3434
</ItemGroup>
35-
36-
<ItemGroup>
35+
36+
<!-- Unix builds do not support subgroups -->
37+
<ItemGroup Condition="$(__BuildOS) != 'Windows_NT' And $(__TestGroupToBuild) == '1' And $(TestBuildSlice) == '1'">
3738
<Project Include="*\**\*.csproj" Exclude="@(DisabledProjects)">
3839
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
3940
</Project>
4041
<Project Include="*\**\*.ilproj" Exclude="@(DisabledProjects)">
4142
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
4243
</Project>
4344
</ItemGroup>
45+
46+
<!-- Test build is divided in slices which can be created within Test Group
47+
Priority 0 tests are build using Test Group 1 with 2 subgroups or slices -->
48+
<ItemGroup Condition="$(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '1' And $(TestBuildSlice) == '1'">
49+
<Project Include="*\**\*.csproj" Exclude="@(DisabledProjects)">
50+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
51+
</Project>
52+
</ItemGroup>
53+
54+
<ItemGroup Condition="$(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '1' And $(TestBuildSlice) == '2'">
55+
<Project Include="*\**\*.ilproj" Exclude="@(DisabledProjects)">
56+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
57+
</Project>
58+
</ItemGroup>
59+
60+
<!-- Test build is divided in slices which can be created within Test Group
61+
Priority 1 or higher tests are build using Test Group 2 with 16 subgroups or slices -->
62+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '1')">
63+
<Project Include="baseservices\**\*.csproj" Exclude="@(DisabledProjects)">
64+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
65+
</Project>
66+
<Project Include="Common\**\*.csproj" Exclude="@(DisabledProjects)">
67+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
68+
</Project>
69+
<Project Include="baseservices\**\*.ilproj" Exclude="@(DisabledProjects)">
70+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
71+
</Project>
72+
<Project Include="Common\**\*.ilproj" Exclude="@(DisabledProjects)">
73+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
74+
</Project>
75+
</ItemGroup>
76+
77+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '2')">
78+
<Project Include="CoreMangLib\**\*.csproj" Exclude="@(DisabledProjects)">
79+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
80+
</Project>
81+
<Project Include="CoreMangLib\**\*.ilproj" Exclude="@(DisabledProjects)">
82+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
83+
</Project>
84+
</ItemGroup>
85+
86+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '3')">
87+
<Project Include="E*\**\*.csproj" Exclude="@(DisabledProjects)">
88+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
89+
</Project>
90+
<Project Include="GC\**\*.csproj" Exclude="@(DisabledProjects)">
91+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
92+
</Project>
93+
<Project Include="Interop\**\*.csproj" Exclude="@(DisabledProjects)">
94+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
95+
</Project>
96+
<Project Include="E*\**\*.ilproj" Exclude="@(DisabledProjects)">
97+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
98+
</Project>
99+
<Project Include="GC\**\*.ilproj" Exclude="@(DisabledProjects)">
100+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
101+
</Project>
102+
<Project Include="Interop\**\*.ilproj" Exclude="@(DisabledProjects)">
103+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
104+
</Project>
105+
</ItemGroup>
106+
107+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '4')">
108+
<Project Include="JIT\B*\**\*.csproj" Exclude="@(DisabledProjects)">
109+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
110+
</Project>
111+
<Project Include="JIT\C*\**\*.csproj" Exclude="@(DisabledProjects)">
112+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
113+
</Project>
114+
<Project Include="JIT\Directed\**\*.csproj" Exclude="@(DisabledProjects)">
115+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
116+
</Project>
117+
</ItemGroup>
118+
119+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '5')">
120+
<Project Include="JIT\B*\**\*.ilproj" Exclude="@(DisabledProjects)">
121+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
122+
</Project>
123+
<Project Include="JIT\C*\**\*.ilproj" Exclude="@(DisabledProjects)">
124+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
125+
</Project>
126+
<Project Include="JIT\Directed\**\*.ilproj" Exclude="@(DisabledProjects)">
127+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
128+
</Project>
129+
</ItemGroup>
130+
131+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '6')">
132+
<Project Include="JIT\Generics\**\*.csproj" Exclude="@(DisabledProjects)">
133+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
134+
</Project>
135+
<Project Include="JIT\*Intrinsics\**\*.csproj" Exclude="@(DisabledProjects)">
136+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
137+
</Project>
138+
<Project Include="JIT\Generics\**\*.ilproj" Exclude="@(DisabledProjects)">
139+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
140+
</Project>
141+
<Project Include="JIT\*Intrinsics\**\*.ilproj" Exclude="@(DisabledProjects)">
142+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
143+
</Project>
144+
</ItemGroup>
145+
146+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '7')">
147+
<Project Include="JIT\IL_Conformance\**\*.csproj" Exclude="@(DisabledProjects)">
148+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
149+
</Project>
150+
<Project Include="JIT\IL_Conformance\**\*.ilproj" Exclude="@(DisabledProjects)">
151+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
152+
</Project>
153+
</ItemGroup>
154+
155+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '8')">
156+
<Project Include="JIT\jit64\**\*.csproj" Exclude="@(DisabledProjects)">
157+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
158+
</Project>
159+
<Project Include="JIT\jit64\**\*.ilproj" Exclude="@(DisabledProjects)">
160+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
161+
</Project>
162+
</ItemGroup>
163+
164+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '9')">
165+
<Project Include="JIT\Methodical\**\*.csproj" Exclude="@(DisabledProjects)">
166+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
167+
</Project>
168+
</ItemGroup>
169+
170+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '10')">
171+
<Project Include="JIT\Methodical\**\*.ilproj" Exclude="@(DisabledProjects)">
172+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
173+
</Project>
174+
</ItemGroup>
175+
176+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '11')">
177+
<Project Include="JIT\opt\**\*.csproj" Exclude="@(DisabledProjects)">
178+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
179+
</Project>
180+
<Project Include="JIT\Performance\**\*.csproj" Exclude="@(DisabledProjects)">
181+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
182+
</Project>
183+
<Project Include="JIT\S*\**\*.csproj" Exclude="@(DisabledProjects)">
184+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
185+
</Project>
186+
<Project Include="JIT\opt\**\*.ilproj" Exclude="@(DisabledProjects)">
187+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
188+
</Project>
189+
<Project Include="JIT\Performance\**\*.ilproj" Exclude="@(DisabledProjects)">
190+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
191+
</Project>
192+
<Project Include="JIT\S*\**\*.ilproj" Exclude="@(DisabledProjects)">
193+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
194+
</Project>
195+
</ItemGroup>
196+
197+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '12')">
198+
<Project Include="JIT\R*\**\*.csproj" Exclude="@(DisabledProjects)">
199+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
200+
</Project>
201+
</ItemGroup>
202+
203+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '13')">
204+
<Project Include="JIT\R*\**\*.ilproj" Exclude="@(DisabledProjects)">
205+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
206+
</Project>
207+
</ItemGroup>
208+
209+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '14')">
210+
<Project Include="Loader\**\*.csproj" Exclude="@(DisabledProjects)">
211+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
212+
</Project>
213+
</ItemGroup>
214+
215+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '15')">
216+
<Project Include="Loader\**\*.ilproj" Exclude="@(DisabledProjects)">
217+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
218+
</Project>
219+
</ItemGroup>
220+
221+
<ItemGroup Condition="($(__BuildOS) == 'Windows_NT' And $(__TestGroupToBuild) == '2' And $(TestBuildSlice) == '16')">
222+
<Project Include="m*\**\*.csproj" Exclude="@(DisabledProjects)">
223+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
224+
</Project>
225+
<Project Include="p*\**\*.csproj" Exclude="@(DisabledProjects)">
226+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
227+
</Project>
228+
<Project Include="r*\**\*.csproj" Exclude="@(DisabledProjects)">
229+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
230+
</Project>
231+
<Project Include="s*\**\*.csproj" Exclude="@(DisabledProjects)">
232+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
233+
</Project>
234+
<Project Include="t*\**\*.csproj" Exclude="@(DisabledProjects)">
235+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
236+
</Project>
237+
<Project Include="m*\**\*.ilproj" Exclude="@(DisabledProjects)">
238+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
239+
</Project>
240+
<Project Include="p*\**\*.ilproj" Exclude="@(DisabledProjects)">
241+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
242+
</Project>
243+
<Project Include="r*\**\*.ilproj" Exclude="@(DisabledProjects)">
244+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
245+
</Project>
246+
<Project Include="s*\**\*.ilproj" Exclude="@(DisabledProjects)">
247+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
248+
</Project>
249+
<Project Include="t*\**\*.ilproj" Exclude="@(DisabledProjects)">
250+
<AdditionalProperties>OSGroup=$(OSGroup)</AdditionalProperties>
251+
</Project>
252+
</ItemGroup>
253+
44254
</Target>
45255

46256
<Import Project="..\dir.traversal.targets" />

0 commit comments

Comments
 (0)