Skip to content

Commit 03fd89e

Browse files
authored
Add Helix project and supporting targets (dotnet#4847)
1 parent eca7fc9 commit 03fd89e

11 files changed

+300
-2
lines changed

eng/Helix.CrossTarget.targets

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<Project>
2+
<Target Name="CollectHelixWorkItems"
3+
Outputs="@(HelixWorkItem)">
4+
<ItemGroup>
5+
<_TargetFrameworks Remove="@(_TargetFrameworks)" />
6+
<_TargetFrameworks Include="$(TargetFrameworks)" />
7+
</ItemGroup>
8+
<MSBuild Projects="$(MSBuildProjectFullPath)"
9+
Targets="CollectHelixWorkItems"
10+
Properties="TargetFramework=%(_TargetFrameworks.Identity)"
11+
RemoveProperties="TargetFrameworks">
12+
<Output TaskParameter="TargetOutputs"
13+
ItemName="HelixWorkItem" />
14+
</MSBuild>
15+
</Target>
16+
</Project>

eng/Helix.SingleTarget.targets

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<Project>
2+
<ItemGroup>
3+
<!-- Set TEST_DOTNET_ROOT to same as DOTNET_ROOT (which is provided by the dotnet cli correlation payload) -->
4+
<HelixWorkItemPreCommand Include="export TEST_DOTNET_ROOT=${DOTNET_ROOT}"
5+
Condition="'$(IsHelixPosixShell)' == 'true'" />
6+
<HelixWorkItemPreCommand Include="SET TEST_DOTNET_ROOT=%DOTNET_ROOT%"
7+
Condition="'$(IsHelixPosixShell)' != 'true'" />
8+
</ItemGroup>
9+
10+
<!-- TODO: Add Helix work item PreCommands to install Node and Azurite -->
11+
12+
<Target Name="CollectHelixWorkItems"
13+
Outputs="@(HelixWorkItem)" />
14+
</Project>

eng/Helix.props

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<Project>
2+
<PropertyGroup>
3+
<IsHelixPosixShell>true</IsHelixPosixShell>
4+
<IsHelixPosixShell Condition="$(HelixTargetQueue.Contains('windows'))">false</IsHelixPosixShell>
5+
</PropertyGroup>
6+
</Project>

eng/Helix.targets

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<Project>
2+
<!--
3+
MSBuild uses the IsCrossTargetingBuild property (which checks
4+
that TargetFrameworks is non-empty and that TargetFramework is empty).
5+
-->
6+
<Import Project="$(MSBuildThisFileDirectory)Helix.CrossTarget.targets" Condition="'$(IsCrossTargetingBuild)' == 'true'" />
7+
<Import Project="$(MSBuildThisFileDirectory)Helix.SingleTarget.targets" Condition="'$(IsCrossTargetingBuild)' != 'true'" />
8+
</Project>

eng/helix/Helix.proj

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
<Project Sdk="Microsoft.DotNet.Helix.Sdk"
2+
DefaultTargets="Test">
3+
4+
<PropertyGroup>
5+
<HelixConfiguration>$(Configuration)</HelixConfiguration>
6+
<HelixArchitecture>$(BuildArch)</HelixArchitecture>
7+
<UseOpenQueues>true</UseOpenQueues>
8+
<UseOpenQueues Condition="'$(HelixAccessToken)' != ''">false</UseOpenQueues>
9+
<!-- Ensure dotnet correlation payloads match the tested RID -->
10+
<DotNetCliRuntime>$(PackageRid)</DotNetCliRuntime>
11+
</PropertyGroup>
12+
13+
<PropertyGroup Condition="'$(UseOpenQueues)' == 'true'">
14+
<QueueSuffix>.open</QueueSuffix>
15+
<!-- Open queues require a creator to be set. -->
16+
<Creator Condition=" '$(USERNAME)' != '' ">$(USERNAME)</Creator>
17+
<Creator Condition=" '$(USER)' != '' ">$(USER)</Creator>
18+
</PropertyGroup>
19+
20+
<PropertyGroup Condition="'$(SYSTEM_COLLECTIONURI)' == 'https://dev.azure.com/dnceng/'">
21+
<HelixSourcePrefix Condition="'$(BUILD_REASON)' == 'Manual'">pr</HelixSourcePrefix>
22+
<HelixSourcePrefix Condition="'$(BUILD_REASON)' == 'PullRequest'">pr</HelixSourcePrefix>
23+
<HelixSourcePrefix Condition="'$(HelixSourcePrefix)' == ''">official</HelixSourcePrefix>
24+
</PropertyGroup>
25+
26+
<PropertyGroup>
27+
<HelixSourcePrefix Condition="'$(HelixSourcePrefix)' == ''">pr</HelixSourcePrefix>
28+
<HelixSource>$(HelixSourcePrefix)/dotnet/dotnet-monitor</HelixSource>
29+
<HelixSource Condition="'$(BUILD_SOURCEBRANCH)' != ''">$(HelixSource)/$(BUILD_SOURCEBRANCH)</HelixSource>
30+
<HelixType>test/binaries/</HelixType>
31+
</PropertyGroup>
32+
33+
<ItemDefinitionGroup>
34+
<HelixAvailableTargetQueue>
35+
<AdditionalProperties>Platform=$(HelixArchitecture)</AdditionalProperties>
36+
</HelixAvailableTargetQueue>
37+
</ItemDefinitionGroup>
38+
39+
<!-- List of all available Helix machines: https://helix.dot.net/ -->
40+
41+
<!-- Windows queues -->
42+
<ItemGroup Condition="$([MSBuild]::IsOSPlatform(Windows))">
43+
<!-- win-arm64 -->
44+
<HelixAvailableTargetQueue Include="windows.11.arm64$(QueueSuffix)"
45+
Condition="'$(HelixArchitecture)' == 'arm64'">
46+
<TestRunName>Windows 11 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
47+
</HelixAvailableTargetQueue>
48+
<!-- win-x64 -->
49+
<HelixAvailableTargetQueue Include="windows.10.amd64.client$(QueueSuffix)"
50+
Condition="'$(HelixArchitecture)' == 'x64'">
51+
<TestRunName>Windows 10 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
52+
</HelixAvailableTargetQueue>
53+
<!-- win-x86 -->
54+
<!-- Windows x64 clients can run dotnet x86 natively -->
55+
<HelixAvailableTargetQueue Include="windows.10.amd64.client$(QueueSuffix)"
56+
Condition="'$(HelixArchitecture)' == 'x86'">
57+
<TestRunName>Windows 10 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
58+
</HelixAvailableTargetQueue>
59+
</ItemGroup>
60+
61+
<!-- Linux gnu libc queues -->
62+
<ItemGroup Condition="$([MSBuild]::IsOSPlatform(Linux)) and !$(PackageRid.Contains(musl))">
63+
<!-- linux-arm64 -->
64+
<HelixAvailableTargetQueue Include="ubuntu.1804.armarch$(QueueSuffix)@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-arm64v8"
65+
Condition="'$(HelixArchitecture)' == 'arm64'">
66+
<TestRunName>Debian 11 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
67+
</HelixAvailableTargetQueue>
68+
<HelixAvailableTargetQueue Include="ubuntu.1804.armarch$(QueueSuffix)@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm64v8"
69+
Condition="'$(HelixArchitecture)' == 'arm64'">
70+
<TestRunName>Ubuntu 18.04 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
71+
</HelixAvailableTargetQueue>
72+
<!-- linux-x64 -->
73+
<HelixAvailableTargetQueue Include="ubuntu.1804.amd64$(QueueSuffix)@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-amd64"
74+
Condition="'$(HelixArchitecture)' == 'x64'">
75+
<TestRunName>Debian 11 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
76+
</HelixAvailableTargetQueue>
77+
<HelixAvailableTargetQueue Include="ubuntu.1804.amd64$(QueueSuffix)@mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-helix-amd64"
78+
Condition="'$(HelixArchitecture)' == 'x64'">
79+
<TestRunName>Mariner 2.0 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
80+
</HelixAvailableTargetQueue>
81+
<HelixAvailableTargetQueue Include="ubuntu.1804.amd64$(QueueSuffix)@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-amd64"
82+
Condition="'$(HelixArchitecture)' == 'x64'">
83+
<TestRunName>Ubuntu 18.04 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
84+
</HelixAvailableTargetQueue>
85+
</ItemGroup>
86+
87+
<!-- Linux musl libc queues -->
88+
<ItemGroup Condition="$([MSBuild]::IsOSPlatform(Linux)) and $(PackageRid.Contains(musl))">
89+
<!-- linux-musl-arm64 -->
90+
<HelixAvailableTargetQueue Include="ubuntu.1804.armarch$(QueueSuffix)@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.15-helix-arm64v8"
91+
Condition="'$(HelixArchitecture)' == 'arm64'">
92+
<TestRunName>Alpine 3.15 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
93+
</HelixAvailableTargetQueue>
94+
<!-- linux-musl-x64 -->
95+
<HelixAvailableTargetQueue Include="ubuntu.1804.amd64$(QueueSuffix)@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.15-helix-amd64"
96+
Condition="'$(HelixArchitecture)' == 'x64'">
97+
<TestRunName>Alpine 3.15 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
98+
</HelixAvailableTargetQueue>
99+
</ItemGroup>
100+
101+
<!-- OSX queues -->
102+
<ItemGroup Condition="$([MSBuild]::IsOSPlatform(OSX))">
103+
<!-- osx-arm64 -->
104+
<HelixAvailableTargetQueue Include="osx.13.arm64$(QueueSuffix)"
105+
Condition="'$(HelixArchitecture)' == 'arm64'">
106+
<TestRunName>OSX 13 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
107+
</HelixAvailableTargetQueue>
108+
<!-- osx-x64 -->
109+
<HelixAvailableTargetQueue Include="osx.13.amd64$(QueueSuffix)"
110+
Condition="'$(HelixArchitecture)' == 'x64'">
111+
<TestRunName>OSX 13 $(HelixArchitecture) $(HelixConfiguration)</TestRunName>
112+
</HelixAvailableTargetQueue>
113+
</ItemGroup>
114+
115+
<ItemGroup>
116+
<HelixTargetQueue Include="@(HelixAvailableTargetQueue)">
117+
<AdditionalProperties>%(AdditionalProperties);Configuration=$(HelixConfiguration)</AdditionalProperties>
118+
</HelixTargetQueue>
119+
</ItemGroup>
120+
121+
<!-- Correlation Payload: SDK (to use "dotnet test") -->
122+
<PropertyGroup>
123+
<IncludeDotNetCli>true</IncludeDotNetCli>
124+
<DotNetCliPackageType>sdk</DotNetCliPackageType>
125+
<DotNetCliVersion>$(MicrosoftDotnetSdkInternalVersion)</DotNetCliVersion>
126+
</PropertyGroup>
127+
128+
<!-- Correlation Payload: AspNetCore (these packages also contain corresponding NetCoreApp version) -->
129+
<ItemGroup>
130+
<AdditionalDotNetPackage Include="$(MicrosoftAspNetCoreApp60Version)">
131+
<PackageType>aspnetcore-runtime</PackageType>
132+
</AdditionalDotNetPackage>
133+
<AdditionalDotNetPackage Include="$(MicrosoftAspNetCoreApp70Version)">
134+
<PackageType>aspnetcore-runtime</PackageType>
135+
</AdditionalDotNetPackage>
136+
<AdditionalDotNetPackage Include="$(MicrosoftAspNetCoreApp80Version)">
137+
<PackageType>aspnetcore-runtime</PackageType>
138+
</AdditionalDotNetPackage>
139+
</ItemGroup>
140+
141+
<!-- Correlation Payload: Common Helix payload -->
142+
<ItemGroup>
143+
<HelixCorrelationPayload Include="$(RepoRoot)eng\helix\payload" />
144+
</ItemGroup>
145+
146+
<!-- Correlation Payload: Built binaries -->
147+
<ItemGroup>
148+
<HelixCorrelationPayload Include="$(ArtifactsBinDir)" />
149+
</ItemGroup>
150+
151+
<!-- Collect HelixWorkItems from each project that participates in testing. -->
152+
<Target Name="CollectHelixWorkItems"
153+
BeforeTargets="BeforeTest">
154+
<ItemGroup>
155+
<ProjectWithHelixWorkItems Include="$(RepoRoot)src\Tests\**\*.*proj" />
156+
</ItemGroup>
157+
<MSBuild Projects="@(ProjectWithHelixWorkItems)"
158+
Targets="CollectHelixWorkItems"
159+
SkipNonexistentTargets="true">
160+
<Output TaskParameter="TargetOutputs"
161+
ItemName="HelixWorkItem" />
162+
</MSBuild>
163+
</Target>
164+
</Project>

eng/helix/payload/dotnettest.cmd

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
@echo off
2+
setlocal
3+
4+
set testAssembly=%1
5+
set configuration=%2
6+
set targetFramework=%3
7+
set architecture=%~4
8+
set timeoutMinutes=%~5
9+
10+
set filterArgs=
11+
if not "%~6" == "" (
12+
set filterArgs=--filter ^"%~6^"
13+
)
14+
15+
set exit_code=0
16+
17+
echo "Start tests..."
18+
19+
dotnet.exe test ^
20+
"%HELIX_CORRELATION_PAYLOAD%\%testAssembly%\%configuration%\%targetFramework%\%testAssembly%.dll" ^
21+
--logger:"console;verbosity=normal" ^
22+
--logger:"trx;LogFileName=%testAssembly%_%targetFramework%_%architecture%.trx" ^
23+
--logger:"html;LogFileName=%testAssembly%_%targetFramework%_%architecture%.html" ^
24+
--ResultsDirectory:%HELIX_WORKITEM_UPLOAD_ROOT% ^
25+
--blame "CollectHangDump;TestTimeout=%timeoutMinutes%m" ^
26+
%filterArgs%
27+
28+
if not errorlevel 0 (
29+
set exit_code=%errorlevel%
30+
)
31+
32+
echo "Finished tests; exit code: %exit_code%"
33+
34+
exit /b %exit_code%

eng/helix/payload/dotnettest.sh

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/usr/bin/env bash
2+
3+
testAssembly="$1"
4+
configuration="$2"
5+
targetFramework="$3"
6+
architecture="$4"
7+
timeoutMinutes="$5"
8+
9+
filterArgs=""
10+
if [[ ! -z "$6" ]]; then
11+
filterArgs="--filter \"$6\""
12+
fi
13+
14+
exit_code=0
15+
16+
echo "Start tests..."
17+
18+
dotnet test \
19+
"$HELIX_CORRELATION_PAYLOAD/$testAssembly/$configuration/$targetFramework/$testAssembly.dll" \
20+
--logger:"console;verbosity=normal" \
21+
--logger:"trx;LogFileName=${testAssembly}_${targetFramework}_${architecture}.trx" \
22+
--logger:"html;LogFileName=${testAssembly}_${targetFramework}_${architecture}.html" \
23+
--ResultsDirectory:$HELIX_WORKITEM_UPLOAD_ROOT \
24+
--blame "CollectHangDump;TestTimeout=${timeoutMinutes}m" \
25+
$filterArgs
26+
27+
exit_code=$?
28+
29+
echo "Finished tests; exit code: $exit_code"
30+
31+
exit $exit_code

src/Directory.Build.props

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@
2626
</PropertyGroup>
2727

2828
<PropertyGroup Condition="'$(ContinuousIntegrationBuild)' == 'true'">
29-
<TestRunnerAdditionalArguments>--blame "CollectHangDump;TestTimeout=15m"</TestRunnerAdditionalArguments>
29+
<TestRunnerTestTimeoutMinutes>15</TestRunnerTestTimeoutMinutes>
30+
<TestRunnerAdditionalArguments>--blame "CollectHangDump;TestTimeout=$(TestRunnerTestTimeoutMinutes)m"</TestRunnerAdditionalArguments>
3031
</PropertyGroup>
3132

3233
<!-- Filter tests based on specified TestGroup -->
3334
<PropertyGroup Condition="'$(TestGroup)' == 'PR'">
3435
<!-- Only run tests for .NET 8 -->
35-
<TestRunnerAdditionalArguments>$(TestRunnerAdditionalArguments) --filter "TargetFrameworkMoniker=Net80"</TestRunnerAdditionalArguments>
36+
<TestRunnerFilterArguments>TargetFrameworkMoniker=Net80</TestRunnerFilterArguments>
37+
<TestRunnerAdditionalArguments>$(TestRunnerAdditionalArguments) --filter "$(TestRunnerFilterArguments)"</TestRunnerAdditionalArguments>
3638
</PropertyGroup>
3739

3840
<ItemGroup>
@@ -62,5 +64,6 @@
6264
</ItemGroup>
6365

6466
<Import Project="$(RepositoryEngineeringDir)Analyzers.props" />
67+
<Import Project="$(RepositoryEngineeringDir)Helix.props" />
6568
<Import Project="$(RepositoryEngineeringDir)native\naming.props" />
6669
</Project>

src/Directory.Build.targets

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
<Project>
33
<Import Project="Sdk.targets" Sdk="Microsoft.DotNet.Arcade.Sdk" />
44

5+
<Import Project="$(RepositoryEngineeringDir)Helix.targets" />
6+
57
<!-- Work around https://github.com/dotnet/sourcelink/issues/572
68
Remove once we build using an SDK that contains https://github.com/dotnet/sdk/pull/10613 -->
79
<PropertyGroup>

src/Tests/Directory.Build.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@
1616
<Target Name="IntegrationTest" DependsOnTargets="$(_GetTestsToRunTarget);RunTests" Condition="'$(IsIntegrationTestProject)' == 'true'" />
1717

1818
<Import Project="$(MSBuildThisFileDirectory)CrossTargeting.targets" Condition="'$(IsCrossTargetingBuild)' == 'true'" />
19+
<Import Project="$(MSBuildThisFileDirectory)Helix.targets" Condition="'$(IsTestProject)' == 'true'" />
1920
</Project>

0 commit comments

Comments
 (0)