Add downloading and testing the latest master runtime. (#69)
authorMike McLaughlin <mikem@microsoft.com>
Mon, 10 Sep 2018 21:54:26 +0000 (14:54 -0700)
committerGitHub <noreply@github.com>
Mon, 10 Sep 2018 21:54:26 +0000 (14:54 -0700)
Add "daily-test" option to scripts/config.

README.md
eng/Build-Native.cmd
eng/Build.cmd
eng/build-native.sh
eng/build.sh
eng/install-test-runtimes.ps1 [new file with mode: 0644]
eng/install-test-runtimes.sh [new file with mode: 0755]
src/Microsoft.Diagnostic.TestHelpers/TestConfiguration.cs
src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt
src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt

index 8ee703de1493c82d215ee615934cc8946c8bd3c2..ee5f263f22c0b2439f73c6f477294228774f0c58 100644 (file)
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
 
 **Currently under construction**
 
-This repository contains the source code for various .NET Core runtime diagnostic tools. It currently contains SOS, the managed portion of SOS and the lldb SOS plugin. One of goals of this repo is to build SOS and the lldb SOS plugin for the portable Linux platform (Centos 7) and the platforms not supported by the portable build (Centos 6, Alpine, eventually macOS) and to test across various indexes in a very large matrix: OSs/distros (Centos 6/7, Ubuntu, Alpine, Fedora, Debian, RHEL 7.2), architectures (x64, x86, arm, arm64), lldb versions (3.9, 4.0, 5.0, 6.0) and even .NET Core versions (1.1, 2.0.x, 2.1). 
+This repository contains the source code for various .NET Core runtime diagnostic tools. It currently contains SOS, the managed portion of SOS and the lldb SOS plugin. The goals of this repo is to build SOS and the lldb SOS plugin for the portable (glibc based) Linux platform (Centos 7) and the platforms not supported by the portable (musl based) build (Centos 6, Alpine, and macOS) and to test across various indexes in a very large matrix: OSs/distros (Centos 6/7, Ubuntu, Alpine, Fedora, Debian, RHEL 7.2), architectures (x64, x86, arm, arm64), lldb versions (3.9, 4.0, 5.0, 6.0) and .NET Core versions (1.1, 2.0.x, 2.1). 
 
 Another goal to make it easier to obtain a version of lldb (currently 3.9) with scripts and documentation for platforms/distros like Centos, Alpine, Fedora, etc. that by default provide really old versions. 
 
@@ -39,6 +39,12 @@ BUILD: Repo sucessfully built.
 BUILD: Product binaries are available at c:\git\diagnostics\artifacts\Debug\bin\Windows_NT.x64
 ```
 
+To build for x86:
+
+```bat
+> build.cmd -architecture x86
+```
+
 To test the resulting SOS:
 
 ```bat
index 499f24b4f1c71e80bf6ad53841b49821d4511bb9..e9ecd61d8faff404c602d2ca49ccde5e5581870c 100644 (file)
@@ -49,6 +49,7 @@ set __BuildType=Debug
 set __BuildOS=Windows_NT
 set __Build=0
 set __Test=0
+set __DailyTest=
 set __Verbosity=minimal
 set __TestArgs=
 
@@ -74,6 +75,7 @@ if /i "%1" == "--help" goto Usage
 
 if /i "%1" == "-build-native"        (set __Build=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
 if /i "%1" == "-test"                (set __Test=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
+if /i "%1" == "-daily-test"          (set __DailyTest=-DailyTest&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
 if /i "%1" == "-configuration"       (set __BuildType=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
 if /i "%1" == "-architecture"        (set __BuildArch=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
 if /i "%1" == "-verbosity"           (set __Verbosity=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
@@ -327,9 +329,8 @@ echo %__MsgPrefix%Product binaries are available at !__BinDir!
 
 :: Test components
 if %__Test% EQU 1 (
-    :: Install the other versions of .NET Core runtime we are going to test on (2.0.9 and 1.1.9)
-    powershell -ExecutionPolicy ByPass -NoProfile -command "& """%__ProjectDir%\.dotnet\dotnet-install.ps1""" -Version 2.0.9 -Architecture %__BuildArch% -SkipNonVersionedFiles -Runtime dotnet -InstallDir %__ProjectDir%\.dotnet"
-    powershell -ExecutionPolicy ByPass -NoProfile -command "& """%__ProjectDir%\.dotnet\dotnet-install.ps1""" -Version 1.1.9 -Architecture %__BuildArch% -SkipNonVersionedFiles -Runtime dotnet -InstallDir %__ProjectDir%\.dotnet"
+    :: Install the other versions of .NET Core runtime we are going to test on
+    powershell -ExecutionPolicy ByPass -NoProfile -command "& """%__ProjectDir%\eng\install-test-runtimes.ps1""" -DotNetDir %__ProjectDir%\.dotnet -TempDir %__IntermediatesDir% -BuildArch %__BuildArch%" %__DailyTest%
 
     :: Run the xunit tests
     powershell -ExecutionPolicy ByPass -NoProfile -command "& """%__ProjectDir%\eng\common\Build.ps1""" -test -configuration %__BuildType% -verbosity %__Verbosity% %__TestArgs%"
@@ -355,6 +356,7 @@ echo.
 echo.-? -h -help --help: view this message.
 echo -build-native - build native components
 echo -test - test components
+echo -daily-test - test components for daily build job
 echo -architecture <x64|x86|arm|arm64>
 echo -configuration <debug|release>
 echo -verbosity <q[uiet]|m[inimal]|n[ormal]|d[etailed]|diag[nostic]>
index 8ef13939cfa831b1884a59a41497f99778f2c75a..ae3e464daa3e62b57cd24f2443e03773b312c7d9 100644 (file)
@@ -3,8 +3,9 @@ setlocal
 
 :: remove the -test and -build-native options and pass it to build-native.cmd
 set __args="%*"
-set __args=%__args:-test=%
 set __args=%__args:-build-native=%
+set __args=%__args:-daily-test=%
+set __args=%__args:-test=%
 if %__args% == "" set __args=
 
 :: build managed components
index c556b47c02b4e43fb7d2dec08dead164cd01adb1..c4e9d4c3265663a399db3683d00fd41caff45a64 100755 (executable)
@@ -28,6 +28,7 @@ __CrossBuild=0
 __NumProc=1
 __Build=0
 __Test=0
+__DailyTest=
 __CI=0
 __TestArgs=
 __UnprocessedBuildArgs=
@@ -37,6 +38,7 @@ usage()
     echo "Usage: $0 [options]"
     echo "--build-native - build native components"
     echo "--test - test native components"
+    echo "--daily-test - test native components for daily build job"
     echo "--architecture <x64|x86|arm|armel|arm64>"
     echo "--configuration <debug|release>"
     echo "--clangx.y - optional argument to build using clang version x.y"
@@ -161,6 +163,10 @@ while :; do
             __Test=1
             ;;
 
+        --daily-test)
+            __DailyTest="--daily-test"
+            ;;
+
         --ci)
             __CI=1
             __TestArgs="$__TestArgs $1"
@@ -463,9 +469,8 @@ fi
 
 # Run SOS/lldbplugin tests
 if [ $__Test == 1 ]; then
-    # Install the other versions of .NET Core runtime we are going to test on (2.0.9 and 1.1.9)
-    bash "$__ProjectRoot/.dotnet/dotnet-install.sh" --version 2.0.9 --architecture "$__BuildArch" --skip-non-versioned-files --runtime dotnet --install-dir "$__ProjectRoot/.dotnet"
-    bash "$__ProjectRoot/.dotnet/dotnet-install.sh" --version 1.1.9 --architecture "$__BuildArch" --skip-non-versioned-files --runtime dotnet --install-dir "$__ProjectRoot/.dotnet"
+    # Install the other versions of .NET Core runtime we are going to test on
+    "$__ProjectRoot/eng/install-test-runtimes.sh" --dotnet-directory "$__ProjectRoot/.dotnet" --temp-directory "$__IntermediatesDir" --architecture "$__BuildArch" $__DailyTest
 
     if [ "$LLDB_PATH" = "" ]; then
         export LLDB_PATH="$(which lldb-3.9.1 2> /dev/null)"
index ed8e0e9851b93bba1cf700005e61a98411f78f4d..013dd3d88febff8d4027801776454f0be77c894c 100755 (executable)
@@ -17,7 +17,7 @@ done
 scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
 
 # remove the options that build.sh can't handle and pass it to build-native.sh
-__args="$(echo $@ | sed 's/--test//g;s/--build-native//g;s/--clang[0-9]\.[0-9]//g')"
+__args="$(echo $@ | sed 's/--build-native//g;s/--daily-test//g;s/--test//g;s/--clang[0-9]\.[0-9]//g')"
 
 # build managed components
 "$scriptroot/common/build.sh" $__args
diff --git a/eng/install-test-runtimes.ps1 b/eng/install-test-runtimes.ps1
new file mode 100644 (file)
index 0000000..04d84ae
--- /dev/null
@@ -0,0 +1,54 @@
+[cmdletbinding()]
+param(
+   [string]$DotNetDir,
+   [string]$TempDir,
+   [string]$BuildArch,
+   [switch]$DailyTest,
+   [string]$Branch="master",
+   [string]$UncachedFeed="https://dotnetcli.blob.core.windows.net/dotnet"
+)
+
+Set-StrictMode -Version Latest
+$ErrorActionPreference="Stop"
+
+$RuntimeVersion11="1.1.9"
+$RuntimeVersion20="2.0.9"
+$RuntimeVersion21="2.1.0"
+$DailyTestText="true"
+
+# Install the other versions of .NET Core runtime we are going to test. 1.1.x, 2.0.x, 2.1.x (installed with the CLI)
+# and latest. Only install the latest master for daily jobs and leave the RuntimeVersion* config properties blank.
+if (!$DailyTest) {
+    $DailyTestText="false"
+    . $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion11 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir
+    . $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion20 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir
+}
+
+. $DotNetDir\dotnet-install.ps1 -Channel $Branch -Version latest -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir
+
+# Now download the latest runtime version and create a config file containing it
+$VersionFileUrl = "$UncachedFeed/Runtime/$Branch/latest.version"
+$VersionFile = Join-Path -Path $TempDir latest.version
+$ConfigFile = Join-Path -Path $DotNetDir Debugger.Tests.Versions.txt
+
+Invoke-WebRequest $VersionFileUrl -OutFile $VersionFile
+
+if (Test-Path $VersionFile) {
+    $VersionText = cat $VersionFile
+    $Data = @($VersionText.Split([char[]]@(), [StringSplitOptions]::RemoveEmptyEntries));
+    $RuntimeVersionLatest = $Data[1].Trim()
+
+    Write-Host "Latest version: $RuntimeVersionLatest"
+
+    '<Configuration>
+<DailyTest>' + $DailyTestText  +'</DailyTest>
+<RuntimeVersion11>' + $RuntimeVersion11 + '</RuntimeVersion11>
+<RuntimeVersion20>' + $RuntimeVersion20 + '</RuntimeVersion20>
+<RuntimeVersion21>' + $RuntimeVersion21 + '</RuntimeVersion21>
+<RuntimeVersionLatest>' + $RuntimeVersionLatest + '</RuntimeVersionLatest>
+</Configuration>' | Set-Content $ConfigFile
+
+}
+else {
+    Write-Host "Could not download latest runtime version file"
+}
diff --git a/eng/install-test-runtimes.sh b/eng/install-test-runtimes.sh
new file mode 100755 (executable)
index 0000000..f4fc0ce
--- /dev/null
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+# Copyright (c) .NET Foundation and contributors. All rights reserved.
+# Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+dotnet_dir=
+temp_dir=
+build_arch=
+daily_test=0
+branch="master"
+uncached_feed="https://dotnetcli.blob.core.windows.net/dotnet"
+
+while [ $# -ne 0 ]; do
+    name=$1
+    case $name in
+        --dotnet-directory)
+            shift
+            dotnet_dir=$1
+            ;;
+        --temp-directory)
+            shift
+            temp_dir=$1
+            ;;
+        --architecture)
+            shift
+            build_arch=$1
+            ;;
+        --branch)
+            shift
+            branch=$1
+            ;;
+        --daily-test)
+            daily_test=1
+            ;;
+        *)
+            args="$args $1"
+            ;;
+    esac
+    shift
+done
+
+runtime_version_11="1.1.9"
+runtime_version_20="2.0.9"
+runtime_version_21="2.1.0"
+daily_test_text="true"
+
+# Install the other versions of .NET Core runtime we are going to test. 1.1.x, 2.0.x, 2.1.x (installed with the CLI)
+# and latest. Only install the latest master for daily jobs and leave the RuntimeVersion* config properties blank.
+if [ $daily_test == 0 ]; then
+    daily_test_text="false"
+    bash "$dotnet_dir/dotnet-install.sh" --version "$runtime_version_11" --architecture "$build_arch" --skip-non-versioned-files --runtime dotnet --install-dir "$dotnet_dir"
+    bash "$dotnet_dir/dotnet-install.sh" --version "$runtime_version_20" --architecture "$build_arch" --skip-non-versioned-files --runtime dotnet --install-dir "$dotnet_dir"
+fi
+
+bash "$dotnet_dir/dotnet-install.sh" --channel $branch --version latest --architecture "$build_arch" --skip-non-versioned-files --runtime dotnet --install-dir "$dotnet_dir"
+
+# Now download the latest runtime version and create a config file containing it
+version_file_url="$uncached_feed/Runtime/$branch/latest.version"
+version_file="$temp_dir/latest.version"
+config_file="$dotnet_dir/Debugger.Tests.Versions.txt"
+
+# Use curl if available, otherwise use wget
+if command -v curl > /dev/null; then
+    curl "$version_file_url" -sSL --retry 10 --create-dirs -o "$version_file"
+else
+    wget -q -O "$version_file" "$version_file_url"
+fi
+
+if [ -f "$version_file" ]; then
+    runtime_version_latest=$(cat $version_file | tail -n 1 | sed 's/\r$//')
+
+    echo "Latest version: $runtime_version_latest"
+
+    echo "<Configuration>
+<DailyTest>$daily_test_text</DailyTest>
+<RuntimeVersion11>$runtime_version_11</RuntimeVersion11>
+<RuntimeVersion20>$runtime_version_20</RuntimeVersion20>
+<RuntimeVersion21>$runtime_version_21</RuntimeVersion21>
+<RuntimeVersionLatest>$runtime_version_latest</RuntimeVersionLatest>
+</Configuration>" > $config_file
+
+else
+    echo "Could not download latest runtime version file"
+fi
index a8d41b0baeb412c0936e3f089e8042b71420bce4..68bfca4138b6303dfdbb06dba5adf1f5eceecae5 100644 (file)
@@ -145,7 +145,11 @@ namespace Microsoft.Diagnostic.TestHelpers
                     {
                         foreach (XAttribute attr in node.Attributes("ConfigFile"))
                         {
-                            string file = Path.Combine(TestConfiguration.BaseDir, attr.Value);
+                            string file = ResolveProperties(currentTemplate, attr.Value).Trim();
+                            if (!Path.IsPathRooted(file))
+                            {
+                                file = Path.Combine(TestConfiguration.BaseDir, file);
+                            }
                             templates = ParseConfigFile(file, templates);
                         }
                     }
index 95b3a6d7c20814e3d7644e0ec9971692b08ff854..80ac42af4684efd52c837b604e8f165a98319641 100644 (file)
@@ -8,10 +8,11 @@
 -->
 
 <Configuration>
+  <RepoRootDir>../../../../..</RepoRootDir>
   <Import ConfigFile="Debugger.Tests.Common.txt" />
+  <Import ConfigFile="$(RepoRootDir)/.dotnet/Debugger.Tests.Versions.txt" />
 
   <TestProduct>ProjectK</TestProduct>
-  <RepoRootDir>../../../../..</RepoRootDir>
   <ScriptRootDir>$(RepoRootDir)/src/SOS/SOS.UnitTests/Scripts</ScriptRootDir>
   <RootBinDir>$(RepoRootDir)/artifacts</RootBinDir>
   <InstallDir>$(RootBinDir)/$(TargetConfiguration)/bin/$(OS).$(TargetArchitecture)</InstallDir>
 
   <Options>
     <Option>
-      <BuildProjectMicrosoftNetCoreAppVersion>2.1.0</BuildProjectMicrosoftNetCoreAppVersion>
+      <!-- Build the debuggee for 2.1 but run it on latest -->
+      <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
       <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
-      <RuntimeFrameworkVersion>2.1.0</RuntimeFrameworkVersion>
+      <RuntimeFrameworkVersion>$(RuntimeVersionLatest)</RuntimeFrameworkVersion>
     </Option>
-    <Option>
-      <BuildProjectMicrosoftNetCoreAppVersion>2.0.9</BuildProjectMicrosoftNetCoreAppVersion>
+    <Option Condition="'$(DailyTest)' != 'true'">
+      <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
+      <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
+      <RuntimeFrameworkVersion>$(RuntimeVersion21)</RuntimeFrameworkVersion>
+    </Option>
+    <Option Condition="'$(DailyTest)' != 'true'">
+      <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion20)</BuildProjectMicrosoftNetCoreAppVersion>
       <BuildProjectFramework>netcoreapp2.0</BuildProjectFramework>
-      <RuntimeFrameworkVersion>2.0.9</RuntimeFrameworkVersion>
+      <RuntimeFrameworkVersion>$(RuntimeVersion20)</RuntimeFrameworkVersion>
     </Option>
-    <Option Condition="Exists('$(RepoRootDir)/.dotnet/shared/Microsoft.NETCore.App/1.1.9')">
-      <BuildProjectMicrosoftNetCoreAppVersion>1.1.9</BuildProjectMicrosoftNetCoreAppVersion>
+    <Option Condition="Exists('$(RepoRootDir)/.dotnet/shared/Microsoft.NETCore.App/$(RuntimeVersion11)')">
+      <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion11)</BuildProjectMicrosoftNetCoreAppVersion>
       <BuildProjectFramework>netcoreapp1.1</BuildProjectFramework>
-      <RuntimeFrameworkVersion>1.1.9</RuntimeFrameworkVersion>
+      <RuntimeFrameworkVersion>$(RuntimeVersion11)</RuntimeFrameworkVersion>
       <!-- createdump doesn't exists in 1.1 -->
       <GenerateDumpWithGDB>true</GenerateDumpWithGDB>
       <!-- SOS needs at least 2.0 to run. The default without this is to use the runtime being debuggged to host SOS.NETCore -->
-      <SOSHostRuntime>$(RepoRootDir)/.dotnet/shared/Microsoft.NETCore.App/2.0.9</SOSHostRuntime>
+      <SOSHostRuntime>$(RepoRootDir)/.dotnet/shared/Microsoft.NETCore.App/$(RuntimeVersion20)</SOSHostRuntime>
     </Option>
   </Options>
 
index 13027fde963ef0e08b30b37661e2b47ad73bc68b..ea70a5bf2841985e2f79621a5d9dc26ea237db51 100644 (file)
@@ -8,12 +8,12 @@
 -->
 
 <Configuration>
+  <RepoRootDir>..\..\..\..\..</RepoRootDir>
   <Import ConfigFile="Debugger.Tests.Common.txt" />
+  <Import ConfigFile="$(RepoRootDir)\.dotnet\Debugger.Tests.Versions.txt" />
 
-  <RepoRootDir>..\..\..\..\..</RepoRootDir>
   <ScriptRootDir>$(RepoRootDir)\src\SOS\SOS.UnitTests\Scripts</ScriptRootDir>
   <RootBinDir>$(RepoRootDir)\artifacts</RootBinDir>
-
   <InstallDir>$(RootBinDir)\$(TargetConfiguration)\bin\Windows_NT.$(TargetArchitecture)</InstallDir>
   <LogDir>$(RootBinDir)\$(TargetConfiguration)\TestResults\sos.unittests_$(Timestamp)</LogDir>
   <DumpDir>$(RootBinDir)\$(TargetConfiguration)\tmp\dumps</DumpDir>
       <TestProduct>ProjectK</TestProduct>
       <Options>
         <Option>
-          <BuildProjectMicrosoftNetCoreAppVersion>2.1.0</BuildProjectMicrosoftNetCoreAppVersion>
+          <!-- Build the debuggee for 2.1 but run it on latest -->
+          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
           <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
-          <RuntimeFrameworkVersion>2.1.0</RuntimeFrameworkVersion>
+          <RuntimeFrameworkVersion>$(RuntimeVersionLatest)</RuntimeFrameworkVersion>
         </Option>
-        <Option>
-          <BuildProjectMicrosoftNetCoreAppVersion>2.0.9</BuildProjectMicrosoftNetCoreAppVersion>
+        <Option Condition="'$(DailyTest)' != 'true'">
+          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
+          <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
+          <RuntimeFrameworkVersion>$(RuntimeVersion21)</RuntimeFrameworkVersion>
+        </Option>
+        <Option Condition="'$(DailyTest)' != 'true'">
+          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion20)</BuildProjectMicrosoftNetCoreAppVersion>
           <BuildProjectFramework>netcoreapp2.0</BuildProjectFramework>
-          <RuntimeFrameworkVersion>2.0.9</RuntimeFrameworkVersion>
+          <RuntimeFrameworkVersion>$(RuntimeVersion20)</RuntimeFrameworkVersion>
         </Option>
-        <Option>
-          <BuildProjectMicrosoftNetCoreAppVersion>1.1.9</BuildProjectMicrosoftNetCoreAppVersion>
+        <Option Condition="'$(DailyTest)' != 'true'">
+          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion11)</BuildProjectMicrosoftNetCoreAppVersion>
           <BuildProjectFramework>netcoreapp1.1</BuildProjectFramework>
-          <RuntimeFrameworkVersion>1.1.9</RuntimeFrameworkVersion>
+          <RuntimeFrameworkVersion>$(RuntimeVersion11)</RuntimeFrameworkVersion>
           <!-- SOS needs at least 2.0 to run. The default without this is to use the runtime being debuggged to host SOS.NETCore -->
-          <SOSHostRuntime>$(RepoRootDir)\.dotnet\shared\Microsoft.NETCore.App\2.0.9</SOSHostRuntime>
+          <SOSHostRuntime>$(RepoRootDir)\.dotnet\shared\Microsoft.NETCore.App\$(RuntimeVersion20)</SOSHostRuntime>
         </Option>
       </Options>
       <HostExe>$(RepoRootDir)\.dotnet\dotnet.exe</HostExe>