diff --git a/eng/helix/content/runtests.cmd b/eng/helix/content/runtests.cmd
index 5fe1af7eb6..f119653782 100644
--- a/eng/helix/content/runtests.cmd
+++ b/eng/helix/content/runtests.cmd
@@ -1,6 +1,6 @@
@echo off
-REM Disable "!Foo!" expansions because they break the filter syntax
-setlocal disableextensions
+REM Need delayed expansion !PATH! so parens in the path don't mess up the parens for the if statements that use parens for blocks
+setlocal enabledelayedexpansion
REM Use '$' as a variable name prefix to avoid MSBuild variable collisions with these variables
set $target=%1
@@ -9,6 +9,7 @@ set $runtimeVersion=%3
set $helixQueue=%4
set $arch=%5
set $quarantined=%6
+set $efVersion=%7
set DOTNET_HOME=%HELIX_CORRELATION_PAYLOAD%\sdk
set DOTNET_ROOT=%DOTNET_HOME%\%$arch%
@@ -16,14 +17,24 @@ set DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
set DOTNET_MULTILEVEL_LOOKUP=0
set DOTNET_CLI_HOME=%HELIX_CORRELATION_PAYLOAD%\home
-set PATH=%DOTNET_ROOT%;%PATH%;%HELIX_CORRELATION_PAYLOAD%\node\bin
-
+set PATH=%DOTNET_ROOT%;!PATH!;%HELIX_CORRELATION_PAYLOAD%\node\bin
+echo Set path to: %PATH%
+echo "Installing SDK"
powershell.exe -NoProfile -ExecutionPolicy unrestricted -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -useb 'https://dot.net/v1/dotnet-install.ps1'))) -Architecture %$arch% -Version %$sdkVersion% -InstallDir %DOTNET_ROOT%"
+echo "Installing Runtime"
powershell.exe -NoProfile -ExecutionPolicy unrestricted -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -useb 'https://dot.net/v1/dotnet-install.ps1'))) -Architecture %$arch% -Runtime dotnet -Version %$runtimeVersion% -InstallDir %DOTNET_ROOT%"
-
+echo "Checking for Microsoft.AspNetCore.App"
if EXIST ".\Microsoft.AspNetCore.App" (
echo "Found Microsoft.AspNetCore.App, copying to %DOTNET_ROOT%\shared\Microsoft.AspNetCore.App\%runtimeVersion%"
xcopy /i /y ".\Microsoft.AspNetCore.App" %DOTNET_ROOT%\shared\Microsoft.AspNetCore.App\%runtimeVersion%\
+
+ echo "Adding current directory to nuget sources: %HELIX_WORKITEM_ROOT%"
+ dotnet nuget add source %HELIX_WORKITEM_ROOT%
+ dotnet nuget add source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json
+ dotnet nuget list source
+ dotnet tool install dotnet-ef --global --version %$efVersion%
+
+ set PATH=!PATH!;%DOTNET_CLI_HOME%\.dotnet\tools
)
echo "Current Directory: %HELIX_WORKITEM_ROOT%"
@@ -31,6 +42,8 @@ set HELIX=%$helixQueue%
set HELIX_DIR=%HELIX_WORKITEM_ROOT%
set NUGET_FALLBACK_PACKAGES=%HELIX_DIR%
set NUGET_RESTORE=%HELIX_DIR%\nugetRestore
+set DotNetEfFullPath=%HELIX_DIR%\nugetRestore\dotnet-ef\%$efVersion%\tools\netcoreapp3.1\any\dotnet-ef.exe
+echo "Set DotNetEfFullPath: %DotNetEfFullPath%"
echo "Setting HELIX_DIR: %HELIX_DIR%"
echo Creating nuget restore directory: %NUGET_RESTORE%
mkdir %NUGET_RESTORE%
@@ -53,6 +66,8 @@ if %$quarantined%==True (
set %$quarantined=true
)
+REM Disable "!Foo!" expansions because they break the filter syntax
+setlocal disabledelayedexpansion
set NONQUARANTINE_FILTER="Quarantined!=true"
set QUARANTINE_FILTER="Quarantined=true"
if %$quarantined%==true (
diff --git a/eng/helix/content/runtests.sh b/eng/helix/content/runtests.sh
index 7d319e0a38..2d3b9d8ad0 100644
--- a/eng/helix/content/runtests.sh
+++ b/eng/helix/content/runtests.sh
@@ -6,6 +6,7 @@ dotnet_runtime_version="$3"
helix_queue_name="$4"
target_arch="$5"
quarantined="$6"
+efVersion="$7"
RESET="\033[0m"
RED="\033[0;31m"
@@ -33,6 +34,8 @@ export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
export helix="$helix_queue_name"
export HELIX_DIR="$DIR"
export NUGET_FALLBACK_PACKAGES="$DIR"
+export DotNetEfFullPath=$DIR\nugetRestore\dotnet-ef\$efVersion\tools\netcoreapp3.1\any\dotnet-ef.dll
+echo "Set DotNetEfFullPath: $DotNetEfFullPath"
export NUGET_RESTORE="$DIR/nugetRestore"
echo "Creating nugetRestore directory: $NUGET_RESTORE"
mkdir $NUGET_RESTORE
@@ -95,6 +98,17 @@ if [ -d "Microsoft.AspNetCore.App" ]
then
echo "Found Microsoft.AspNetCore.App directory, copying to $DOTNET_ROOT/shared/Microsoft.AspNetCore.App/$dotnet_runtime_version."
cp -r Microsoft.AspNetCore.App $DOTNET_ROOT/shared/Microsoft.AspNetCore.App/$dotnet_runtime_version
+
+ echo "Adding current directory to nuget sources: $DIR"
+ dotnet nuget add source $DIR
+ dotnet nuget add source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json
+ dotnet nuget list source
+
+ dotnet tool install dotnet-ef --global --version $efVersion
+
+ # Ensure tools are on on PATH
+ export PATH="$PATH:$DOTNET_CLI_HOME/.dotnet/tools"
+
fi
if [ -e /proc/self/coredump_filter ]; then
diff --git a/eng/targets/Helix.targets b/eng/targets/Helix.targets
index 0084984353..154ce92ee6 100644
--- a/eng/targets/Helix.targets
+++ b/eng/targets/Helix.targets
@@ -120,8 +120,8 @@ Usage: dotnet msbuild /t:Helix src/MyTestProject.csproj
$(TargetFileName)
@(HelixPreCommand)
@(HelixPostCommand)
- call runtests.cmd $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppRuntimeVersion) $(_HelixFriendlyNameTargetQueue) $(TargetArchitecture) $(RunQuarantinedTests)
- ./runtests.sh $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppRuntimeVersion) $(_HelixFriendlyNameTargetQueue) $(TargetArchitecture) $(RunQuarantinedTests)
+ call runtests.cmd $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppRuntimeVersion) $(_HelixFriendlyNameTargetQueue) $(TargetArchitecture) $(RunQuarantinedTests) $(DotnetEfPackageVersion)
+ ./runtests.sh $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppRuntimeVersion) $(_HelixFriendlyNameTargetQueue) $(TargetArchitecture) $(RunQuarantinedTests) $(DotnetEfPackageVersion)
$(HelixCommand)
$(HelixTimeout)
diff --git a/src/ProjectTemplates/test/Helpers/Project.cs b/src/ProjectTemplates/test/Helpers/Project.cs
index 28a9bdd917..3fdcdf9d0c 100644
--- a/src/ProjectTemplates/test/Helpers/Project.cs
+++ b/src/ProjectTemplates/test/Helpers/Project.cs
@@ -7,6 +7,7 @@ using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
+using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.CommandLineUtils;
@@ -28,12 +29,11 @@ namespace Templates.Test.Helpers
? GetAssemblyMetadata("ArtifactsLogDir")
: Path.Combine(Environment.GetEnvironmentVariable("HELIX_DIR"), "logs");
- // FIGURE OUT EF PATH
- public static string DotNetEfFullPath => (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("helix")))
+ public static string DotNetEfFullPath => (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DotNetEfFullPath")))
? typeof(ProjectFactoryFixture).Assembly.GetCustomAttributes()
.First(attribute => attribute.Key == "DotNetEfFullPath")
.Value
- : Path.Combine("NuGetPackageRoot", "dotnet-ef/$(DotnetEfPackageVersion)/tools/netcoreapp3.1/any/dotnet-ef.dll");
+ : Environment.GetEnvironmentVariable("DotNetEfFullPath");
public SemaphoreSlim DotNetNewLock { get; set; }
public SemaphoreSlim NodeLock { get; set; }
@@ -306,14 +306,24 @@ namespace Templates.Test.Helpers
internal async Task RunDotNetEfCreateMigrationAsync(string migrationName)
{
- var args = $"\"{DotNetEfFullPath}\" --verbose --no-build migrations add {migrationName}";
-
+ var args = $"--verbose --no-build migrations add {migrationName}";
+
// Only run one instance of 'dotnet new' at once, as a workaround for
// https://github.com/aspnet/templating/issues/63
await DotNetNewLock.WaitAsync();
try
{
- var result = ProcessEx.Run(Output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), args);
+ var command = DotNetMuxer.MuxerPathOrDefault();
+ if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DotNetEfFullPath")))
+ {
+ args = $"\"{DotNetEfFullPath}\" " + args;
+ }
+ else
+ {
+ command = "dotnet-ef";
+ }
+
+ var result = ProcessEx.Run(Output, TemplateOutputDir, command, args);
await result.Exited;
return result;
}
@@ -325,14 +335,24 @@ namespace Templates.Test.Helpers
internal async Task RunDotNetEfUpdateDatabaseAsync()
{
- var args = $"\"{DotNetEfFullPath}\" --verbose --no-build database update";
+ var args = "--verbose --no-build database update";
// Only run one instance of 'dotnet new' at once, as a workaround for
// https://github.com/aspnet/templating/issues/63
await DotNetNewLock.WaitAsync();
try
{
- var result = ProcessEx.Run(Output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), args);
+ var command = DotNetMuxer.MuxerPathOrDefault();
+ if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DotNetEfFullPath")))
+ {
+ args = $"\"{DotNetEfFullPath}\" " + args;
+ }
+ else
+ {
+ command = "dotnet-ef";
+ }
+
+ var result = ProcessEx.Run(Output, TemplateOutputDir, command, args);
await result.Exited;
return result;
}
diff --git a/src/ProjectTemplates/test/IdentityUIPackageTest.cs b/src/ProjectTemplates/test/IdentityUIPackageTest.cs
index fe794a3629..f6974eceb2 100644
--- a/src/ProjectTemplates/test/IdentityUIPackageTest.cs
+++ b/src/ProjectTemplates/test/IdentityUIPackageTest.cs
@@ -120,7 +120,7 @@ namespace Templates.Test
[ConditionalTheory]
[MemberData(nameof(MSBuildIdentityUIPackageOptions))]
- [SkipOnHelix("ef restore no worky")]
+ [SkipOnHelix("cert failure", Queues = "OSX.1014.Amd64;OSX.1014.Amd64.Open")]
public async Task IdentityUIPackage_WorksWithDifferentOptions(IDictionary packageOptions, string versionValidator, string[] expectedFiles)
{
Project = await ProjectFactory.GetOrCreateProject("identityuipackage" + string.Concat(packageOptions.Values), Output);
diff --git a/src/ProjectTemplates/test/MvcTemplateTest.cs b/src/ProjectTemplates/test/MvcTemplateTest.cs
index 271aed575b..3bcb51416a 100644
--- a/src/ProjectTemplates/test/MvcTemplateTest.cs
+++ b/src/ProjectTemplates/test/MvcTemplateTest.cs
@@ -3,12 +3,12 @@
using System.Collections.Generic;
using System.IO;
-using System.Threading.Tasks;
-using Templates.Test.Helpers;
using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing;
+using Templates.Test.Helpers;
using Xunit;
using Xunit.Abstractions;
-using Microsoft.AspNetCore.Testing;
namespace Templates.Test
{
@@ -107,7 +107,7 @@ namespace Templates.Test
[ConditionalTheory]
[InlineData(true)]
[InlineData(false)]
- [SkipOnHelix("ef restore no worky")]
+ [SkipOnHelix("cert failure", Queues = "OSX.1014.Amd64;OSX.1014.Amd64.Open")]
public async Task MvcTemplate_IndividualAuth(bool useLocalDB)
{
Project = await ProjectFactory.GetOrCreateProject("mvcindividual" + (useLocalDB ? "uld" : ""), Output);
@@ -222,8 +222,7 @@ namespace Templates.Test
}
}
- [ConditionalFact]
- [SkipOnHelix("razor compilation restore no worky")]
+ [Fact]
public async Task MvcTemplate_RazorRuntimeCompilation_BuildsAndPublishes()
{
Project = await ProjectFactory.GetOrCreateProject("mvc_rc", Output);
diff --git a/src/ProjectTemplates/test/RazorClassLibraryTemplateTest.cs b/src/ProjectTemplates/test/RazorClassLibraryTemplateTest.cs
index f8d6bd65b5..0d02a56f8f 100644
--- a/src/ProjectTemplates/test/RazorClassLibraryTemplateTest.cs
+++ b/src/ProjectTemplates/test/RazorClassLibraryTemplateTest.cs
@@ -5,7 +5,6 @@ using System.Threading.Tasks;
using Templates.Test.Helpers;
using Xunit;
using Xunit.Abstractions;
-using Microsoft.AspNetCore.Testing;
namespace Templates.Test
{
@@ -41,8 +40,7 @@ namespace Templates.Test
Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", Project, buildResult));
}
- [ConditionalFact]
- [SkipOnHelix("restore no worky")]
+ [Fact]
public async Task RazorClassLibraryTemplateAsync()
{
Project = await ProjectFactory.GetOrCreateProject("razorclasslib", Output);
diff --git a/src/ProjectTemplates/test/RazorPagesTemplateTest.cs b/src/ProjectTemplates/test/RazorPagesTemplateTest.cs
index 73e4a5da52..4e7b924492 100644
--- a/src/ProjectTemplates/test/RazorPagesTemplateTest.cs
+++ b/src/ProjectTemplates/test/RazorPagesTemplateTest.cs
@@ -97,7 +97,7 @@ namespace Templates.Test
[ConditionalTheory]
[InlineData(false)]
[InlineData(true)]
- [SkipOnHelix("ef restore no worky")]
+ [SkipOnHelix("cert failure", Queues = "OSX.1014.Amd64;OSX.1014.Amd64.Open")]
public async Task RazorPagesTemplate_IndividualAuth(bool useLocalDB)
{
Project = await ProjectFactory.GetOrCreateProject("razorpagesindividual" + (useLocalDB ? "uld" : ""), Output);
@@ -212,8 +212,7 @@ namespace Templates.Test
}
}
- [ConditionalFact]
- [SkipOnHelix("runtime compliation restore no worky")]
+ [Fact]
public async Task RazorPagesTemplate_RazorRuntimeCompilation_BuildsAndPublishes()
{
Project = await ProjectFactory.GetOrCreateProject("razorpages_rc", Output);
diff --git a/src/ProjectTemplates/test/WorkerTemplateTest.cs b/src/ProjectTemplates/test/WorkerTemplateTest.cs
index 0299f17a11..0a3bca6568 100644
--- a/src/ProjectTemplates/test/WorkerTemplateTest.cs
+++ b/src/ProjectTemplates/test/WorkerTemplateTest.cs
@@ -21,8 +21,7 @@ namespace Templates.Test
public ProjectFactoryFixture ProjectFactory { get; }
public ITestOutputHelper Output { get; }
- [ConditionalFact]
- [SkipOnHelix("restore no worky")]
+ [Fact]
public async Task WorkerTemplateAsync()
{
Project = await ProjectFactory.GetOrCreateProject("worker", Output);