diff --git a/.github/workflows/ci-suite.yml b/.github/workflows/ci-suite.yml
index 3fb626419d..f14288746c 100644
--- a/.github/workflows/ci-suite.yml
+++ b/.github/workflows/ci-suite.yml
@@ -650,9 +650,26 @@ jobs:
INCLUDE_SYMBOLS: true
NUGET_KEY: ${{ secrets.NUGET_API_KEY }}
+ ensure-release:
+ name: Ensure TGS Release is Latest GitHub Release
+ needs: [deploy-dm, deploy-http]
+ runs-on: ubuntu-latest
+ if: github.event_name == 'push' && !(github.event.ref == 'refs/heads/master' && contains(github.event.head_commit.message, '[TGSDeploy]')) && (contains(github.event.head_commit.message, '[APIDeploy]') || contains(github.event.head_commit.message, '[DMDeploy]'))
+ steps:
+ - name: Setup dotnet
+ uses: actions/setup-dotnet@v2
+ with:
+ dotnet-version: ${{ env.TGS_DOTNET_VERSION }}
+
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Run ReleaseNotes with --ensure-release
+ run: dotnet run -c Release --project tools/ReleaseNotes --ensure-release
+
deploy-tgs:
name: Deploy TGS
- needs: [upload-code-coverage, validate-openapi-spec]
+ needs: [deploy-dm, deploy-http]
runs-on: windows-latest
if: github.event_name == 'push' && github.event.ref == 'refs/heads/master' && contains(github.event.head_commit.message, '[TGSDeploy]')
steps:
diff --git a/tools/ReleaseNotes/Program.cs b/tools/ReleaseNotes/Program.cs
index 12e9dbe647..b0d5773b84 100644
--- a/tools/ReleaseNotes/Program.cs
+++ b/tools/ReleaseNotes/Program.cs
@@ -16,6 +16,9 @@ namespace ReleaseNotes
///
static class Program
{
+ const string RepoOwner = "tgstation";
+ const string RepoName = "tgstation-server";
+
///
/// The entrypoint for the
///
@@ -28,7 +31,9 @@ namespace ReleaseNotes
}
var versionString = args[0];
- if (!Version.TryParse(versionString, out var version) || version.Revision != -1)
+ var ensureRelease = versionString == "--ensure-release";
+
+ if ((!Version.TryParse(versionString, out var version) || version.Revision != -1) && !ensureRelease)
{
Console.WriteLine("Invalid version: " + versionString);
return 2;
@@ -38,22 +43,22 @@ namespace ReleaseNotes
const string ReleaseNotesEnvVar = "TGS_RELEASE_NOTES_TOKEN";
var githubToken = Environment.GetEnvironmentVariable(ReleaseNotesEnvVar);
- if (String.IsNullOrWhiteSpace(githubToken) && !doNotCloseMilestone)
+ if (String.IsNullOrWhiteSpace(githubToken) && !doNotCloseMilestone && !ensureRelease)
{
Console.WriteLine("Missing " + ReleaseNotesEnvVar + " environment variable!");
return 3;
}
+ var client = new GitHubClient(new Octokit.ProductHeaderValue("tgs_release_notes"));
+ if (!String.IsNullOrWhiteSpace(githubToken))
+ {
+ client.Credentials = new Credentials(githubToken);
+ }
+
try
{
- var client = new GitHubClient(new Octokit.ProductHeaderValue("tgs_release_notes"));
- if (!String.IsNullOrWhiteSpace(githubToken))
- {
- client.Credentials = new Credentials(githubToken);
- }
-
- const string RepoOwner = "tgstation";
- const string RepoName = "tgstation-server";
+ if (ensureRelease)
+ return await EnsureRelease(client);
var releasesTask = client.Repository.Release.GetAll(RepoOwner, RepoName);
@@ -442,5 +447,37 @@ namespace ReleaseNotes
return 4;
}
}
+
+ class ExtendedReleaseUpdate : ReleaseUpdate
+ {
+ public bool? MakeLatest { get; set; }
+ }
+
+ static async Task EnsureRelease(IGitHubClient client)
+ {
+ Console.WriteLine("Ensuring latest release is a GitHub release...");
+ var latestRelease = await client.Repository.Release.GetLatest(RepoOwner, RepoName);
+
+ const string TagPrefix = "tgstation-server-v";
+ static bool IsServerRelease(Release release) => release.TagName.StartsWith(TagPrefix);
+
+ if (!IsServerRelease(latestRelease))
+ {
+ var allReleases = await client.Repository.Release.GetAll(RepoOwner, RepoName);
+ var orderedReleases = allReleases
+ .Where(IsServerRelease)
+ .OrderByDescending(x => Version.Parse(x.TagName.Substring(TagPrefix.Length)));
+ latestRelease = orderedReleases
+ .First();
+
+ // this should set it as latest
+ await client.Repository.Release.Edit(RepoOwner, RepoName, latestRelease.Id, new ExtendedReleaseUpdate
+ {
+ MakeLatest = true
+ });
+ }
+
+ return 0;
+ }
}
}