Migrate ServerUpdater to use GitHubService

This commit is contained in:
Dominion
2023-06-04 00:40:14 -04:00
parent 95cd4b9015
commit 083667d04d
4 changed files with 33 additions and 69 deletions
@@ -39,11 +39,5 @@
/// Asset package containing the new <see cref="Host"/> assembly in zip form.
/// </summary>
public string UpdatePackageAssetName { get; set; } = DefaultUpdatePackageAssetName;
/// <summary>
/// Dump all retrieved releases from the GitHub API when a requested release is not found.
/// </summary>
/// <remarks>This is an internal config and may be adjusted or removed without a version change.</remarks>
public bool DumpReleasesOnNotFound { get; set; }
}
}
+31 -58
View File
@@ -8,7 +8,6 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Tgstation.Server.Host.Configuration;
using Tgstation.Server.Host.Extensions;
using Tgstation.Server.Host.IO;
using Tgstation.Server.Host.Swarm;
using Tgstation.Server.Host.Utils;
@@ -19,9 +18,9 @@ namespace Tgstation.Server.Host.Core
sealed class ServerUpdater : IServerUpdater, IServerUpdateExecutor
{
/// <summary>
/// The <see cref="IGitHubClientFactory"/> for the <see cref="ServerUpdater"/>.
/// The <see cref="IGitHubService"/> for the <see cref="ServerUpdater"/>.
/// </summary>
readonly IGitHubClientFactory gitHubClientFactory;
readonly IGitHubService gitHubService;
/// <summary>
/// The <see cref="IIOManager"/> for the <see cref="ServerUpdater"/>.
@@ -61,7 +60,7 @@ namespace Tgstation.Server.Host.Core
/// <summary>
/// Initializes a new instance of the <see cref="ServerUpdater"/> class.
/// </summary>
/// <param name="gitHubClientFactory">The value of <see cref="gitHubClientFactory"/>.</param>
/// <param name="gitHubService">The value of <see cref="gitHubService"/>.</param>
/// <param name="ioManager">The value of <see cref="ioManager"/>.</param>
/// <param name="fileDownloader">The value of <see cref="fileDownloader"/>.</param>
/// <param name="serverControl">The value of <see cref="serverControl"/>.</param>
@@ -69,7 +68,7 @@ namespace Tgstation.Server.Host.Core
/// <param name="generalConfigurationOptions">The <see cref="IOptions{TOptions}"/> containing the value of <see cref="generalConfiguration"/>.</param>
/// <param name="updatesConfigurationOptions">The <see cref="IOptions{TOptions}"/> containing the value of <see cref="updatesConfiguration"/>.</param>
public ServerUpdater(
IGitHubClientFactory gitHubClientFactory,
IGitHubService gitHubService,
IIOManager ioManager,
IFileDownloader fileDownloader,
IServerControl serverControl,
@@ -77,7 +76,7 @@ namespace Tgstation.Server.Host.Core
IOptions<GeneralConfiguration> generalConfigurationOptions,
IOptions<UpdatesConfiguration> updatesConfigurationOptions)
{
this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
this.gitHubService = gitHubService ?? throw new ArgumentNullException(nameof(gitHubService));
this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
this.fileDownloader = fileDownloader ?? throw new ArgumentNullException(nameof(fileDownloader));
this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl));
@@ -224,64 +223,38 @@ namespace Tgstation.Server.Host.Core
async Task<ServerUpdateResult> BeginUpdateImpl(ISwarmService swarmService, Version newVersion, bool recursed, CancellationToken cancellationToken)
{
logger.LogDebug("Looking for GitHub releases version {version}...", newVersion);
var gitHubClient = gitHubClientFactory.CreateClient();
var releases = await gitHubClient
.Repository
.Release
.GetAll(updatesConfiguration.GitHubRepositoryId)
.WithToken(cancellationToken);
logger.LogTrace("Received {releaseCount} total releases from GitHub", releases.Count);
var filteredReleases = releases
.Where(x => x.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture))
.ToList();
logger.LogTrace(
"Filtered to {releaseCount} releases matching the configured tag prefix of \"{tagPrefix}\"",
filteredReleases.Count,
updatesConfiguration.GitTagPrefix);
foreach (var release in filteredReleases)
if (Version.TryParse(
release.TagName.Replace(
updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal),
out var version))
var releases = await gitHubService.GetTgsReleases(cancellationToken);
foreach (var kvp in releases)
{
var version = kvp.Key;
var release = kvp.Value;
if (version == newVersion)
{
if (version == newVersion)
var asset = release.Assets.Where(x => x.Name.Equals(updatesConfiguration.UpdatePackageAssetName, StringComparison.Ordinal)).FirstOrDefault();
if (asset == default)
continue;
serverUpdateOperation = new ServerUpdateOperation
{
var asset = release.Assets.Where(x => x.Name.Equals(updatesConfiguration.UpdatePackageAssetName, StringComparison.Ordinal)).FirstOrDefault();
if (asset == default)
continue;
TargetVersion = version,
UpdateZipUrl = new Uri(asset.BrowserDownloadUrl),
SwarmService = swarmService,
};
serverUpdateOperation = new ServerUpdateOperation
{
TargetVersion = version,
UpdateZipUrl = new Uri(asset.BrowserDownloadUrl),
SwarmService = swarmService,
};
try
{
if (!serverControl.TryStartUpdate(this, version))
return ServerUpdateResult.UpdateInProgress;
}
finally
{
serverUpdateOperation = null;
}
return ServerUpdateResult.Started;
try
{
if (!serverControl.TryStartUpdate(this, version))
return ServerUpdateResult.UpdateInProgress;
}
finally
{
serverUpdateOperation = null;
}
}
else
logger.LogDebug("Unparsable release tag: {releaseTag}", release.TagName);
if (updatesConfiguration.DumpReleasesOnNotFound)
logger.LogInformation(
"Found releases:{newline}\t{releases}",
Environment.NewLine,
String.Join($"{Environment.NewLine}\t", releases.Select(x => x.TagName).OrderBy(x => x)));
return ServerUpdateResult.Started;
}
}
if (!recursed)
{
@@ -49,7 +49,7 @@ namespace Tgstation.Server.Tests.Live
SerilogContextHelper.AddSwarmNodeIdentifierToTemplate();
}
public LiveTestingServer(SwarmConfiguration swarmConfiguration, bool enableOAuth, ushort port = 5010, bool dumpOnMissingUpdate = true)
public LiveTestingServer(SwarmConfiguration swarmConfiguration, bool enableOAuth, ushort port = 5010)
{
Directory = Environment.GetEnvironmentVariable("TGS_TEST_TEMP_DIRECTORY");
if (string.IsNullOrWhiteSpace(Directory))
@@ -116,9 +116,6 @@ namespace Tgstation.Server.Tests.Live
$"Session:LowPriorityDeploymentProcesses={LowPriorityDeployments}",
};
if (dumpOnMissingUpdate)
args.Add("Updates:DumpReleasesOnNotFound=true");
swarmArgs = new List<string>();
if (swarmConfiguration != null)
{
@@ -218,7 +218,7 @@ namespace Tgstation.Server.Tests.Live
[TestMethod]
public async Task TestUpdateBadVersion()
{
using var server = new LiveTestingServer(null, false, dumpOnMissingUpdate: false);
using var server = new LiveTestingServer(null, false);
using var serverCts = new CancellationTokenSource();
var cancellationToken = serverCts.Token;
var serverTask = server.Run(cancellationToken);