Added RemoteWindowsDeployer to deploy published applications on remote windows machines
This commit is contained in:
parent
744e736c70
commit
80714a3d70
|
|
@ -0,0 +1,55 @@
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$serverName,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$accountName,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$accountPassword,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$executablePath,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$serverType,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$serverAction,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$applicationBaseUrl,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$false)]
|
||||||
|
[string]$environmentVariables
|
||||||
|
)
|
||||||
|
|
||||||
|
Write-Host "`nExecuting deployment helper script on machine '$serverName'"
|
||||||
|
Write-Host "`nStarting a powershell session to machine '$serverName'"
|
||||||
|
|
||||||
|
$securePassword = ConvertTo-SecureString $accountPassword -AsPlainText -Force
|
||||||
|
$credentials= New-Object System.Management.Automation.PSCredential ($accountName, $securePassword)
|
||||||
|
$psSession = New-PSSession -ComputerName $serverName -credential $credentials
|
||||||
|
|
||||||
|
$remoteResult="0"
|
||||||
|
if ($serverAction -eq "StartServer")
|
||||||
|
{
|
||||||
|
Write-Host "Starting the application on machine '$serverName'"
|
||||||
|
$startServerScriptPath = "$PSScriptRoot\StartServer.ps1"
|
||||||
|
$remoteResult=Invoke-Command -Session $psSession -FilePath $startServerScriptPath -ArgumentList $executablePath, $serverType, $serverName, $applicationBaseUrl, $environmentVariables
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Write-Host "Stopping the application on machine '$serverName'"
|
||||||
|
$stopServerScriptPath = "$PSScriptRoot\StopServer.ps1"
|
||||||
|
$serverProcessName = [System.IO.Path]::GetFileNameWithoutExtension($executablePath)
|
||||||
|
$remoteResult=Invoke-Command -Session $psSession -FilePath $stopServerScriptPath -ArgumentList $serverProcessName, $serverType, $serverName
|
||||||
|
}
|
||||||
|
|
||||||
|
Remove-PSSession $psSession
|
||||||
|
|
||||||
|
# NOTE: Currenty there is no straight forward way to get the exit code from a remotely executing session, so
|
||||||
|
# we print out the exit code in the remote script and capture it's output to get the exit code.
|
||||||
|
$finalExitCode=$remoteResult[$remoteResult.Length-1]
|
||||||
|
exit $finalExitCode
|
||||||
|
|
@ -0,0 +1,286 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using Microsoft.Extensions.FileProviders;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Server.Testing
|
||||||
|
{
|
||||||
|
public class RemoteWindowsDeployer : ApplicationDeployer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Example: If the share path is '\\foo\bar', then this returns the full path to the
|
||||||
|
/// deployed folder. Example: '\\foo\bar\048f6c99-de3e-488a-8020-f9eb277818d9'
|
||||||
|
/// </summary>
|
||||||
|
private string _deployedFolderPathInFileShare;
|
||||||
|
private readonly RemoteWindowsDeploymentParameters _deploymentParameters;
|
||||||
|
private bool _isDisposed;
|
||||||
|
private static readonly Lazy<Scripts> _scripts = new Lazy<Scripts>(() => CopyEmbeddedScriptFilesToDisk());
|
||||||
|
|
||||||
|
public RemoteWindowsDeployer(RemoteWindowsDeploymentParameters deploymentParameters, ILogger logger)
|
||||||
|
: base(deploymentParameters, logger)
|
||||||
|
{
|
||||||
|
_deploymentParameters = deploymentParameters;
|
||||||
|
|
||||||
|
if (_deploymentParameters.ServerType != ServerType.IIS
|
||||||
|
&& _deploymentParameters.ServerType != ServerType.Kestrel
|
||||||
|
&& _deploymentParameters.ServerType != ServerType.WebListener)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"Server type {_deploymentParameters.ServerType} is not supported for remote deployment." +
|
||||||
|
$" Supported server types are {nameof(ServerType.Kestrel)}, {nameof(ServerType.IIS)} and {nameof(ServerType.WebListener)}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(_deploymentParameters.ServerName))
|
||||||
|
{
|
||||||
|
throw new ArgumentException($"Invalid value '{_deploymentParameters.ServerName}' for {nameof(RemoteWindowsDeploymentParameters.ServerName)}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(_deploymentParameters.ServerAccountName))
|
||||||
|
{
|
||||||
|
throw new ArgumentException($"Invalid value '{_deploymentParameters.ServerAccountName}' for {nameof(RemoteWindowsDeploymentParameters.ServerAccountName)}." +
|
||||||
|
" Account credentials are required to enable creating a powershell session to the remote server.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(_deploymentParameters.ServerAccountPassword))
|
||||||
|
{
|
||||||
|
throw new ArgumentException($"Invalid value '{_deploymentParameters.ServerAccountPassword}' for {nameof(RemoteWindowsDeploymentParameters.ServerAccountPassword)}." +
|
||||||
|
" Account credentials are required to enable creating a powershell session to the remote server.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(_deploymentParameters.RemoteServerFileSharePath))
|
||||||
|
{
|
||||||
|
throw new ArgumentException($"Invalid value for {nameof(RemoteWindowsDeploymentParameters.RemoteServerFileSharePath)}." +
|
||||||
|
" . A file share is required to copy the application's published output.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(_deploymentParameters.RemoteServerRelativeExecutablePath))
|
||||||
|
{
|
||||||
|
throw new ArgumentException($"Invalid value for {nameof(RemoteWindowsDeploymentParameters.RemoteServerRelativeExecutablePath)}." +
|
||||||
|
" This is the name of the executable in the published output which needs to be executed on the remote server.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(_deploymentParameters.ApplicationBaseUriHint))
|
||||||
|
{
|
||||||
|
throw new ArgumentException($"Invalid value for {nameof(RemoteWindowsDeploymentParameters.ApplicationBaseUriHint)}.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override DeploymentResult Deploy()
|
||||||
|
{
|
||||||
|
if (_isDisposed)
|
||||||
|
{
|
||||||
|
throw new ObjectDisposedException("This instance of deployer has already been disposed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Publish the app to a local temp folder on the machine where the test is running
|
||||||
|
DotnetPublish();
|
||||||
|
|
||||||
|
var folderId = Guid.NewGuid().ToString();
|
||||||
|
_deployedFolderPathInFileShare = Path.Combine(_deploymentParameters.RemoteServerFileSharePath, folderId);
|
||||||
|
|
||||||
|
DirectoryCopy(
|
||||||
|
_deploymentParameters.PublishedApplicationRootPath,
|
||||||
|
_deployedFolderPathInFileShare,
|
||||||
|
copySubDirs: true);
|
||||||
|
Logger.LogInformation($"Copied the locally published folder to the file share path '{_deployedFolderPathInFileShare}'");
|
||||||
|
|
||||||
|
RunScript("StartServer");
|
||||||
|
|
||||||
|
return new DeploymentResult
|
||||||
|
{
|
||||||
|
ApplicationBaseUri = DeploymentParameters.ApplicationBaseUriHint,
|
||||||
|
DeploymentParameters = DeploymentParameters
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
if (_isDisposed)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_isDisposed = true;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Logger.LogInformation($"Stopping the application on the server '{_deploymentParameters.ServerName}'");
|
||||||
|
RunScript("StopServer");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogWarning(0, "Failed to stop the server.", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Logger.LogInformation($"Deleting the deployed folder '{_deployedFolderPathInFileShare}'");
|
||||||
|
Directory.Delete(_deployedFolderPathInFileShare, recursive: true);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogWarning(0, $"Failed to delete the deployed folder '{_deployedFolderPathInFileShare}'.", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Logger.LogInformation($"Deleting the locally published folder '{DeploymentParameters.PublishedApplicationRootPath}'");
|
||||||
|
Directory.Delete(DeploymentParameters.PublishedApplicationRootPath, recursive: true);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogWarning(0, $"Failed to delete the locally published folder '{DeploymentParameters.PublishedApplicationRootPath}'.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RunScript(string serverAction)
|
||||||
|
{
|
||||||
|
var remotePSSessionHelperScript = _scripts.Value.RemotePSSessionHelper;
|
||||||
|
|
||||||
|
var parameterBuilder = new StringBuilder();
|
||||||
|
parameterBuilder.Append($"\"{remotePSSessionHelperScript}\"");
|
||||||
|
parameterBuilder.Append($" -serverName {_deploymentParameters.ServerName}");
|
||||||
|
parameterBuilder.Append($" -accountName {_deploymentParameters.ServerAccountName}");
|
||||||
|
parameterBuilder.Append($" -accountPassword {_deploymentParameters.ServerAccountPassword}");
|
||||||
|
parameterBuilder.Append($" -executablePath \"{Path.Combine(_deployedFolderPathInFileShare, _deploymentParameters.RemoteServerRelativeExecutablePath)}\"");
|
||||||
|
parameterBuilder.Append($" -serverType {_deploymentParameters.ServerType}");
|
||||||
|
parameterBuilder.Append($" -serverAction {serverAction}");
|
||||||
|
parameterBuilder.Append($" -applicationBaseUrl {_deploymentParameters.ApplicationBaseUriHint}");
|
||||||
|
var environmentVariables = string.Join("`,", _deploymentParameters.EnvironmentVariables.Select(envVariable => $"{envVariable.Key}={envVariable.Value}"));
|
||||||
|
parameterBuilder.Append($" -environmentVariables \"{environmentVariables}\"");
|
||||||
|
|
||||||
|
var startInfo = new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = "powershell.exe",
|
||||||
|
Arguments = parameterBuilder.ToString(),
|
||||||
|
UseShellExecute = false,
|
||||||
|
CreateNoWindow = true,
|
||||||
|
RedirectStandardError = true,
|
||||||
|
RedirectStandardOutput = true,
|
||||||
|
RedirectStandardInput = true
|
||||||
|
};
|
||||||
|
|
||||||
|
using (var runScriptsOnRemoteServerProcess = new Process() { StartInfo = startInfo })
|
||||||
|
{
|
||||||
|
runScriptsOnRemoteServerProcess.EnableRaisingEvents = true;
|
||||||
|
runScriptsOnRemoteServerProcess.ErrorDataReceived += (sender, dataArgs) =>
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(dataArgs.Data))
|
||||||
|
{
|
||||||
|
Logger.LogWarning($"[{_deploymentParameters.ServerName}]: {dataArgs.Data}");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
runScriptsOnRemoteServerProcess.OutputDataReceived += (sender, dataArgs) =>
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(dataArgs.Data))
|
||||||
|
{
|
||||||
|
Logger.LogInformation($"[{_deploymentParameters.ServerName}]: {dataArgs.Data}");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
runScriptsOnRemoteServerProcess.Start();
|
||||||
|
runScriptsOnRemoteServerProcess.BeginErrorReadLine();
|
||||||
|
runScriptsOnRemoteServerProcess.BeginOutputReadLine();
|
||||||
|
runScriptsOnRemoteServerProcess.WaitForExit((int)TimeSpan.FromMinutes(1).TotalMilliseconds);
|
||||||
|
|
||||||
|
if (runScriptsOnRemoteServerProcess.HasExited && runScriptsOnRemoteServerProcess.ExitCode != 0)
|
||||||
|
{
|
||||||
|
throw new Exception($"Failed to execute the script on '{_deploymentParameters.ServerName}'.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
|
||||||
|
{
|
||||||
|
var dir = new DirectoryInfo(sourceDirName);
|
||||||
|
|
||||||
|
if (!dir.Exists)
|
||||||
|
{
|
||||||
|
throw new DirectoryNotFoundException(
|
||||||
|
"Source directory does not exist or could not be found: "
|
||||||
|
+ sourceDirName);
|
||||||
|
}
|
||||||
|
|
||||||
|
var dirs = dir.GetDirectories();
|
||||||
|
if (!Directory.Exists(destDirName))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(destDirName);
|
||||||
|
}
|
||||||
|
|
||||||
|
var files = dir.GetFiles();
|
||||||
|
foreach (var file in files)
|
||||||
|
{
|
||||||
|
var temppath = Path.Combine(destDirName, file.Name);
|
||||||
|
file.CopyTo(temppath, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (copySubDirs)
|
||||||
|
{
|
||||||
|
foreach (var subdir in dirs)
|
||||||
|
{
|
||||||
|
var temppath = Path.Combine(destDirName, subdir.Name);
|
||||||
|
DirectoryCopy(subdir.FullName, temppath, copySubDirs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Scripts CopyEmbeddedScriptFilesToDisk()
|
||||||
|
{
|
||||||
|
var embeddedFileNames = new[] { "RemotePSSessionHelper.ps1", "StartServer.ps1", "StopServer.ps1" };
|
||||||
|
|
||||||
|
// Copy the scripts from this assembly's embedded resources to the temp path on the machine where these
|
||||||
|
// tests are being run
|
||||||
|
var embeddedFileProvider = new EmbeddedFileProvider(
|
||||||
|
typeof(RemoteWindowsDeployer).GetTypeInfo().Assembly,
|
||||||
|
"Microsoft.AspNetCore.Server.Testing.Deployers.RemoteWindowsDeployer");
|
||||||
|
|
||||||
|
var filesOnDisk = new string[embeddedFileNames.Length];
|
||||||
|
for (var i = 0; i < embeddedFileNames.Length; i++)
|
||||||
|
{
|
||||||
|
var embeddedFileName = embeddedFileNames[i];
|
||||||
|
var physicalFilePath = Path.Combine(Path.GetTempPath(), embeddedFileName);
|
||||||
|
var sourceStream = embeddedFileProvider
|
||||||
|
.GetFileInfo(embeddedFileName)
|
||||||
|
.CreateReadStream();
|
||||||
|
|
||||||
|
using (sourceStream)
|
||||||
|
{
|
||||||
|
var destinationStream = File.Create(physicalFilePath);
|
||||||
|
using (destinationStream)
|
||||||
|
{
|
||||||
|
sourceStream.CopyTo(destinationStream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filesOnDisk[i] = physicalFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
var scripts = new Scripts(filesOnDisk[0], filesOnDisk[1], filesOnDisk[2]);
|
||||||
|
|
||||||
|
return scripts;
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Scripts
|
||||||
|
{
|
||||||
|
public Scripts(string remotePSSessionHelper, string startServer, string stopServer)
|
||||||
|
{
|
||||||
|
RemotePSSessionHelper = remotePSSessionHelper;
|
||||||
|
StartServer = startServer;
|
||||||
|
StopServer = stopServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string RemotePSSessionHelper { get; }
|
||||||
|
|
||||||
|
public string StartServer { get; }
|
||||||
|
|
||||||
|
public string StopServer { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// See License.txt in the project root for license information
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Server.Testing
|
||||||
|
{
|
||||||
|
public class RemoteWindowsDeploymentParameters : DeploymentParameters
|
||||||
|
{
|
||||||
|
public RemoteWindowsDeploymentParameters(
|
||||||
|
string applicationPath,
|
||||||
|
ServerType serverType,
|
||||||
|
RuntimeFlavor runtimeFlavor,
|
||||||
|
RuntimeArchitecture runtimeArchitecture,
|
||||||
|
string remoteServerFileSharePath,
|
||||||
|
string remoteServerName,
|
||||||
|
string remoteServerAccountName,
|
||||||
|
string remoteServerAccountPassword,
|
||||||
|
string remoteServerRelativeExecutablePath)
|
||||||
|
: base(applicationPath, serverType, runtimeFlavor, runtimeArchitecture)
|
||||||
|
{
|
||||||
|
RemoteServerFileSharePath = remoteServerFileSharePath;
|
||||||
|
ServerName = remoteServerName;
|
||||||
|
ServerAccountName = remoteServerAccountName;
|
||||||
|
ServerAccountPassword = remoteServerAccountPassword;
|
||||||
|
RemoteServerRelativeExecutablePath = remoteServerRelativeExecutablePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ServerName { get; }
|
||||||
|
|
||||||
|
public string ServerAccountName { get; }
|
||||||
|
|
||||||
|
public string ServerAccountPassword { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The full path to the remote server's file share
|
||||||
|
/// </summary>
|
||||||
|
public string RemoteServerFileSharePath { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The relative path to the executable in the published output
|
||||||
|
/// </summary>
|
||||||
|
public string RemoteServerRelativeExecutablePath { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$executablePath,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$serverType,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$serverName,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$applicationBaseUrl,
|
||||||
|
|
||||||
|
# These are of the format: key1=value1,key2=value2,key3=value3
|
||||||
|
[Parameter(Mandatory=$false)]
|
||||||
|
[string]$environmentVariables
|
||||||
|
)
|
||||||
|
|
||||||
|
Write-Host "Executing the start server script on machine '$serverName'"
|
||||||
|
|
||||||
|
IF (-Not [string]::IsNullOrWhitespace($environmentVariables))
|
||||||
|
{
|
||||||
|
Write-Host "Setting up environment variables"
|
||||||
|
foreach ($envVariablePair in $environmentVariables.Split(",")){
|
||||||
|
$pair=$envVariablePair.Split("=");
|
||||||
|
[Environment]::SetEnvironmentVariable($pair[0], $pair[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($serverType -eq "IIS")
|
||||||
|
{
|
||||||
|
throw [System.NotImplementedException] "IIS deployment scenarios not yet implemented."
|
||||||
|
}
|
||||||
|
elseif ($serverType -eq "Kestrel")
|
||||||
|
{
|
||||||
|
Write-Host "Starting the process '$executablePath'"
|
||||||
|
& $executablePath --server.urls $applicationBaseUrl
|
||||||
|
}
|
||||||
|
elseif ($serverType -eq "WebListener")
|
||||||
|
{
|
||||||
|
Write-Host "Starting the process '$executablePath'"
|
||||||
|
& $executablePath --server.urls $applicationBaseUrl --server "Microsoft.AspNetCore.Server.WebListener"
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw [System.InvalidOperationException] "Server type '$serverType' is not supported."
|
||||||
|
}
|
||||||
|
|
||||||
|
# NOTE: Make sure this is the last statement in this script as its used to get the exit code of this script
|
||||||
|
$LASTEXITCODE
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$serverProcessName,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$serverType,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$serverName
|
||||||
|
)
|
||||||
|
|
||||||
|
function DoesCommandExist($command)
|
||||||
|
{
|
||||||
|
$oldPreference = $ErrorActionPreference
|
||||||
|
$ErrorActionPreference="stop"
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (Get-Command $command)
|
||||||
|
{
|
||||||
|
return $true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Write-Host "Command '$command' does not exist"
|
||||||
|
return $false
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
$ErrorActionPreference=$oldPreference
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Executing the stop server script on machine '$serverName'"
|
||||||
|
|
||||||
|
if ($serverType -eq "IIS")
|
||||||
|
{
|
||||||
|
throw [System.NotImplementedException] "IIS deployment scenarios not yet implemented."
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Write-Host "Stopping the process '$serverProcessName'"
|
||||||
|
$serverProcess=Get-Process -Name "$serverProcessName"
|
||||||
|
|
||||||
|
if (DoesCommandExist("taskkill"))
|
||||||
|
{
|
||||||
|
# Kill the parent and child processes
|
||||||
|
& taskkill /pid $serverProcess.Id /t /f
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Stop-Process -Id $serverProcess.Id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# NOTE: Make sure this is the last statement in this script as its used to get the exit code of this script
|
||||||
|
$LASTEXITCODE
|
||||||
|
|
@ -13,9 +13,15 @@
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git://github.com/aspnet/hosting"
|
"url": "git://github.com/aspnet/hosting"
|
||||||
},
|
},
|
||||||
|
"resource": [
|
||||||
|
"Deployers/RemoteWindowsDeployer/RemotePSSessionHelper.ps1",
|
||||||
|
"Deployers/RemoteWindowsDeployer/StartServer.ps1",
|
||||||
|
"Deployers/RemoteWindowsDeployer/StopServer.ps1"
|
||||||
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.AspNetCore.Testing": "1.0.0-*",
|
"Microsoft.AspNetCore.Testing": "1.0.0-*",
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "1.0.0-*",
|
"Microsoft.Extensions.Logging.Abstractions": "1.0.0-*",
|
||||||
|
"Microsoft.Extensions.FileProviders.Embedded": "1.0.0-*",
|
||||||
"Microsoft.Extensions.PlatformAbstractions": "1.0.0-*",
|
"Microsoft.Extensions.PlatformAbstractions": "1.0.0-*",
|
||||||
"Microsoft.Extensions.Process.Sources": {
|
"Microsoft.Extensions.Process.Sources": {
|
||||||
"type": "build",
|
"type": "build",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using Microsoft.AspNetCore.Testing.xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Server.Testing
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Skip test if a given environment variable is not enabled. To enable the test, set environment variable
|
||||||
|
/// to "true" for the test process.
|
||||||
|
/// </summary>
|
||||||
|
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
|
||||||
|
public class SkipIfEnvironmentVariableNotEnabledAttribute : Attribute, ITestCondition
|
||||||
|
{
|
||||||
|
private readonly string _environmentVariableName;
|
||||||
|
|
||||||
|
public SkipIfEnvironmentVariableNotEnabledAttribute(string environmentVariableName)
|
||||||
|
{
|
||||||
|
_environmentVariableName = environmentVariableName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsMet
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return string.Compare(Environment.GetEnvironmentVariable(_environmentVariableName), "true", ignoreCase: true) == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SkipReason
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return $"To run this test, set the environment variable {_environmentVariableName}=\"true\". {AdditionalInfo}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string AdditionalInfo { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using Microsoft.AspNetCore.Testing.xunit;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.Testing
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Skip test if IIS variations are not enabled. To enable set environment variable
|
|
||||||
/// IIS_VARIATIONS_ENABLED=true for the test process.
|
|
||||||
/// </summary>
|
|
||||||
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
|
|
||||||
public class SkipIfIISVariationsNotEnabledAttribute : Attribute, ITestCondition
|
|
||||||
{
|
|
||||||
public bool IsMet
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return Environment.GetEnvironmentVariable("IIS_VARIATIONS_ENABLED") == "true";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string SkipReason
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return "Skipping IIS variation of tests. " +
|
|
||||||
"To run the IIS variations, setup IIS and set the environment variable IIS_VARIATIONS_ENABLED=true.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue