Add retries to selfhost deployer (#13063)

This commit is contained in:
Justin Kotalik 2019-09-20 06:41:56 +09:00 committed by GitHub
parent 28b66b1dbd
commit d19093ecbb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 18 deletions

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// 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;

View File

@ -22,6 +22,7 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
private static readonly Regex NowListeningRegex = new Regex(@"^\s*Now listening on: (?<url>.*)$");
private const string ApplicationStartedMessage = "Application started. Press Ctrl+C to shut down.";
private const int RetryCount = 5;
public Process HostProcess { get; private set; }
public SelfHostDeployer(DeploymentParameters deploymentParameters, ILoggerFactory loggerFactory)
@ -55,23 +56,33 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
DotnetPublish();
}
var hintUrl = TestUriHelper.BuildTestUri(
DeploymentParameters.ServerType,
DeploymentParameters.Scheme,
DeploymentParameters.ApplicationBaseUriHint,
DeploymentParameters.StatusMessagesEnabled);
// Launch the host process.
var (actualUrl, hostExitToken) = await StartSelfHostAsync(hintUrl);
for (var i = 0; i < RetryCount; i++)
{
var hintUrl = TestUriHelper.BuildTestUri(
DeploymentParameters.ServerType,
DeploymentParameters.Scheme,
DeploymentParameters.ApplicationBaseUriHint,
DeploymentParameters.StatusMessagesEnabled);
var (actualUrl, hostExitToken) = await StartSelfHostAsync(hintUrl);
Logger.LogInformation("Application ready at URL: {appUrl}", actualUrl);
if (DeploymentParameters.ServerType == ServerType.HttpSys && hostExitToken.IsCancellationRequested)
{
// Retry HttpSys deployments due to port conflicts.
continue;
}
return new DeploymentResult(
LoggerFactory,
DeploymentParameters,
applicationBaseUri: actualUrl.ToString(),
contentRoot: DeploymentParameters.PublishApplicationBeforeDeployment ? DeploymentParameters.PublishedApplicationRootPath : DeploymentParameters.ApplicationPath,
hostShutdownToken: hostExitToken);
Logger.LogInformation("Application ready at URL: {appUrl}", actualUrl);
return new DeploymentResult(
LoggerFactory,
DeploymentParameters,
applicationBaseUri: actualUrl.ToString(),
contentRoot: DeploymentParameters.PublishApplicationBeforeDeployment ? DeploymentParameters.PublishedApplicationRootPath : DeploymentParameters.ApplicationPath,
hostShutdownToken: hostExitToken);
}
throw new Exception($"Failed to start Self hosted application after {RetryCount} retries.");
}
}
@ -165,8 +176,6 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
Logger.LogInformation("host process ID {pid} shut down", HostProcess.Id);
// If TrySetResult was called above, this will just silently fail to set the new state, which is what we want
started.TrySetException(new Exception($"Command exited unexpectedly with exit code: {HostProcess.ExitCode}"));
TriggerHostShutdown(hostExitTokenSource);
};
@ -178,7 +187,6 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
{
Logger.LogError("Error occurred while starting the process. Exception: {exception}", ex.ToString());
}
if (HostProcess.HasExited)
{
Logger.LogError("Host process {processName} {pid} exited with code {exitCode} or failed to start.", startInfo.FileName, HostProcess.Id, HostProcess.ExitCode);

3
src/Hosting/build.cmd Normal file
View File

@ -0,0 +1,3 @@
@ECHO OFF
SET RepoRoot=%~dp0..\..
%RepoRoot%\build.cmd -projects %~dp0**\*.*proj %*