From 719e5d91cb3c32da4612f768269904a1fcdc2095 Mon Sep 17 00:00:00 2001 From: Dominion Date: Tue, 25 Apr 2023 22:06:21 -0400 Subject: [PATCH] Adjust ReleaseNotes to ensure the latest release is a TGS release [APIDeploy][NugetDeploy][TGSDeploy] Closes #1141 --- .github/workflows/ci-suite.yml | 19 +++++++++++- tools/ReleaseNotes/Program.cs | 57 ++++++++++++++++++++++++++++------ 2 files changed, 65 insertions(+), 11 deletions(-) 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; + } } }