From 464e649a95ce61a60d1c8b922e0d9e3071ba5895 Mon Sep 17 00:00:00 2001 From: Fildrance Date: Sun, 12 Jul 2026 14:46:33 +0300 Subject: [PATCH 1/3] feat: publishing new version now can contain info about sources that were used for version build --- .gitignore | 1 + .../ForkPublishController.Multi.cs | 48 +++++-- .../ForkPublishController.OneShot.cs | 9 +- .../Controllers/ForkPublishController.cs | 122 +++++++++++++++++- ...AlterPublishInProgress_AddCommitColumns.cs | 21 +++ 5 files changed, 183 insertions(+), 18 deletions(-) create mode 100644 Robust.Cdn/Migrations/Script0004_AlterPublishInProgress_AddCommitColumns.cs diff --git a/.gitignore b/.gitignore index 03b6e2d..1ecb8e3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ Robust.Cdn/content.db* Robust.Cdn/manifest.db* *.user testData/ +/.vs/** diff --git a/Robust.Cdn/Controllers/ForkPublishController.Multi.cs b/Robust.Cdn/Controllers/ForkPublishController.Multi.cs index 935a9dc..945ea94 100644 --- a/Robust.Cdn/Controllers/ForkPublishController.Multi.cs +++ b/Robust.Cdn/Controllers/ForkPublishController.Multi.cs @@ -46,15 +46,43 @@ public async Task MultiPublishStart( } await dbCon.ExecuteAsync(""" - INSERT INTO PublishInProgress (Version, ForkId, StartTime, EngineVersion) - VALUES (@Version, @ForkId, @StartTime, @EngineVersion) + INSERT INTO PublishInProgress ( + Version, + ForkId, + StartTime, + EngineVersion, + ForkUrl, + CommitId, + BranchName, + RobustToolboxUrl, + RobustToolboxCommitId + RobustToolboxBranchName + ) + VALUES ( + @Version, + @ForkId, + @StartTime, + @EngineVersion, + @ForkUrl, + @CommitId, + @BranchName, + @RobustToolboxUrl, + @RobustToolboxCommitId + @RobustToolboxBranchName + ) """, new { request.Version, request.EngineVersion, ForkId = forkId, - StartTime = DateTime.UtcNow + StartTime = DateTime.UtcNow, + request.ForkUrl, + request.CommitId, + request.BranchName, + RobustToolboxUrl = request.EngineUrl, + RobustToolboxCommitId = request.EngineCommitId, + RobustToolboxBranchName = request.EngineBranchName, }); var versionDir = buildDirectoryManager.GetBuildVersionPath(fork, request.Version); @@ -127,8 +155,9 @@ public async Task MultiPublishFinish( await using var tx = await dbCon.BeginTransactionAsync(cancel); var forkId = dbCon.QuerySingle("SELECT Id FROM Fork WHERE Name = @Name", new { Name = fork }); - var versionMetadata = dbCon.QuerySingleOrDefault(""" - SELECT Version, EngineVersion + var versionMetadata = dbCon.QuerySingleOrDefault( + """ + SELECT Version, EngineVersion, ForkUrl, CommitId, BranchName, EngineUrl, EngineCommitId, EngineBranchName FROM PublishInProgress WHERE Version = @Name AND ForkId = @Fork """, @@ -175,11 +204,10 @@ FROM PublishInProgress return NoContent(); } - public sealed class PublishMultiRequest - { - public required string Version { get; set; } - public required string EngineVersion { get; set; } - } + /// + /// Request for start of multi-step publishing process of a new version. + /// + public sealed class PublishMultiRequest : PublishStartRequestBase; public sealed class PublishFinishRequest { diff --git a/Robust.Cdn/Controllers/ForkPublishController.OneShot.cs b/Robust.Cdn/Controllers/ForkPublishController.OneShot.cs index 75bcf74..85570a6 100644 --- a/Robust.Cdn/Controllers/ForkPublishController.OneShot.cs +++ b/Robust.Cdn/Controllers/ForkPublishController.OneShot.cs @@ -1,4 +1,4 @@ -using System.IO.Compression; +using System.IO.Compression; using Microsoft.AspNetCore.Mvc; using Robust.Cdn.Helpers; @@ -51,7 +51,12 @@ public async Task PostPublish( var versionDir = buildDirectoryManager.GetBuildVersionPath(fork, request.Version); - var metadata = new VersionMetadata { Version = request.Version, EngineVersion = request.EngineVersion }; + var metadata = new VersionMetadata( + request.Version, + request.EngineVersion, + new(request.ForkUrl, request.CommitId, request.BranchName), + new(request.EngineUrl, request.EngineBranchName, request.EngineCommitId) + ); try { diff --git a/Robust.Cdn/Controllers/ForkPublishController.cs b/Robust.Cdn/Controllers/ForkPublishController.cs index 17bd747..9336d69 100644 --- a/Robust.Cdn/Controllers/ForkPublishController.cs +++ b/Robust.Cdn/Controllers/ForkPublishController.cs @@ -1,4 +1,4 @@ -using System.IO.Compression; +using System.IO.Compression; using System.Security.Cryptography; using System.Text; using System.Text.Json; @@ -132,7 +132,7 @@ private MemoryStream GenerateBuildJson( logger.LogDebug("Client zip hash is {ZipHash}, manifest hash is {ManifestHash}", hash, manifestHash); - var data = new Dictionary + var data = new Dictionary { { "download", baseUrlManager.MakeBuildInfoUrl($"fork/{{FORK_ID}}/version/{{FORK_VERSION}}/file/{diskFileName}") }, { "version", metadata.Version }, @@ -141,7 +141,13 @@ private MemoryStream GenerateBuildJson( { "engine_version", metadata.EngineVersion }, { "manifest_url", baseUrlManager.MakeBuildInfoUrl("fork/{FORK_ID}/version/{FORK_VERSION}/manifest") }, { "manifest_download_url", baseUrlManager.MakeBuildInfoUrl("fork/{FORK_ID}/version/{FORK_VERSION}/download") }, - { "manifest_hash", manifestHash } + { "manifest_hash", manifestHash }, + { "fork_url", metadata.BuildVersionInfo.SourceUrl }, + { "built_on_commit_id", metadata.BuildVersionInfo.CommitId }, + { "built_on_branch_name", metadata.BuildVersionInfo.BranchName}, + { "engine_url", metadata.EngineSourceVersionInfo.SourceUrl }, + { "engine_built_on_commit_id", metadata.EngineSourceVersionInfo.CommitId }, + { "engine_built_on_branch_name", metadata.EngineSourceVersionInfo.BranchName }, }; var stream = new MemoryStream(); @@ -290,19 +296,123 @@ private static FileStream CreateTempFile() FileOptions.DeleteOnClose); } - public sealed class PublishRequest + /// + /// Base type with publish start info. + /// + public abstract class PublishStartRequestBase { + /// + /// Human-readable version of the build. This is used to identify the build in the CDN and in the game client. + /// public required string Version { get; set; } + + /// + /// Human-readable version of the engine used to build this version. + /// public required string EngineVersion { get; set; } + + /// + /// URL of the fork repository. Optional, but useful for debugging. + /// + public string? ForkUrl { get; set; } + + /// + /// Branch on which version was built. Optional, but useful for debugging. + /// + public string? BranchName { get; set; } + + /// + /// Commit ID on which version was built. Optional, but useful for debugging. + /// + public string? CommitId { get; set; } + + /// + /// Url for RobustToolbox repository (or its fork), used for this version. Optional, but useful for debugging. + /// + public string? EngineUrl { get; set; } + + /// + /// Commit ID of RobustToolbox, used for this version. Optional, but useful for debugging. + /// + public string? EngineCommitId { get; set; } + + /// + /// Branch on which RobustToolbox for this version was built. Optional, but useful for debugging. + /// + public string? EngineBranchName { get; set; } + } + + /// + /// Request for one-shot publishing of a new version. + /// + /// + public sealed class PublishRequest : PublishStartRequestBase + { + /// + /// Uri for new build artifact. + /// public required string Archive { get; set; } } + /// + /// Build version metadata. + /// private sealed class VersionMetadata { - public required string Version { get; init; } - public required string EngineVersion { get; set; } + public VersionMetadata(string version, string engineVersion, SourceVersionInfo buildVersionInfo, SourceVersionInfo engineSourceVersionInfo) + { + Version = version; + EngineVersion = engineVersion; + BuildVersionInfo = buildVersionInfo; + EngineSourceVersionInfo = engineSourceVersionInfo; + } + + public VersionMetadata( + string version, + string engineVersion, + string sourceUrl, + string sourceCommitId, + string sourceBranch, + string engineSourceUrl, + string engineSourceCommitId, + string engineSourceBranch + ) + { + Version = version; + EngineVersion = engineVersion; + BuildVersionInfo = new SourceVersionInfo(sourceUrl, sourceCommitId, sourceBranch); + EngineSourceVersionInfo = new SourceVersionInfo(engineSourceUrl, engineSourceCommitId, engineSourceBranch); + } + + /// + /// Human-readable version of the build. This is used to identify the build in the CDN and in the game client. + /// + public string Version { get; } + + /// + /// Human-readable version of the engine used to build this version. + /// + public string EngineVersion { get; } + + /// + /// Version info for sources, used for build. + /// + public SourceVersionInfo BuildVersionInfo { get; } + + /// + /// Version info for sources of engine, used for build. + /// + public SourceVersionInfo EngineSourceVersionInfo { get; } } + /// + /// Detailed info on sources used for building version. + /// + /// URL for repository that holds sources. + /// Commit ID used for building sources. + /// Branch name or tag, used for building sources. + public record SourceVersionInfo(string? SourceUrl, string? CommitId, string? BranchName); + // File cannot start with a dot but otherwise most shit is fair game. [GeneratedRegex(@"[a-zA-Z0-9\-_][a-zA-Z0-9\-_.]*")] private static partial Regex ValidVersionRegexBuilder(); diff --git a/Robust.Cdn/Migrations/Script0004_AlterPublishInProgress_AddCommitColumns.cs b/Robust.Cdn/Migrations/Script0004_AlterPublishInProgress_AddCommitColumns.cs new file mode 100644 index 0000000..cf3178d --- /dev/null +++ b/Robust.Cdn/Migrations/Script0004_AlterPublishInProgress_AddCommitColumns.cs @@ -0,0 +1,21 @@ +using Dapper; +using Microsoft.Data.Sqlite; + +namespace Robust.Cdn.Migrations; + +public sealed class Script0004_AlterPublishInProgress_AddCommitColumns : Migrator.IMigrationScript +{ + public string Up(IServiceProvider services, SqliteConnection connection) + { + connection.Execute(""" + ALTER TABLE PublishInProgress ADD COLUMN ForkUrl text null, + ADD COLUMN CommitId text null, + ADD COLUMN BranchName text null, + ADD COLUMN EngineUrl text null, + ADD COLUMN EngineCommitId text null, + ADD COLUMN EngineBranchName text null; + """); + + return string.Empty; + } +} From 0583f51d5cbcaf12b3029be816b978bba7950ec2 Mon Sep 17 00:00:00 2001 From: Fildrance Date: Sun, 12 Jul 2026 16:41:28 +0300 Subject: [PATCH 2/3] refactor: fix migration, fix source related fields naming --- .../ForkPublishController.Multi.cs | 41 ++++++++++--------- .../ForkPublishController.OneShot.cs | 4 +- .../Controllers/ForkPublishController.cs | 36 ++++++++-------- ...lterPublishInProgress_AddCommitColumns.sql | 7 ++++ ...AlterPublishInProgress_AddCommitColumns.cs | 21 ---------- 5 files changed, 48 insertions(+), 61 deletions(-) create mode 100644 Robust.Cdn/ManifestMigrations/Script0004_AlterPublishInProgress_AddCommitColumns.sql delete mode 100644 Robust.Cdn/Migrations/Script0004_AlterPublishInProgress_AddCommitColumns.cs diff --git a/Robust.Cdn/Controllers/ForkPublishController.Multi.cs b/Robust.Cdn/Controllers/ForkPublishController.Multi.cs index 945ea94..dd49360 100644 --- a/Robust.Cdn/Controllers/ForkPublishController.Multi.cs +++ b/Robust.Cdn/Controllers/ForkPublishController.Multi.cs @@ -45,30 +45,31 @@ public async Task MultiPublishStart( publishManager.AbortMultiPublish(fork, request.Version, tx, commit: false); } - await dbCon.ExecuteAsync(""" + await dbCon.ExecuteAsync( + """ INSERT INTO PublishInProgress ( Version, ForkId, StartTime, EngineVersion, - ForkUrl, - CommitId, - BranchName, - RobustToolboxUrl, - RobustToolboxCommitId - RobustToolboxBranchName + SourceUrl, + SourceCommitId, + SourceBranchName, + EngineSourceUrl, + EngineSourceCommitId, + EngineSourceBranchName ) VALUES ( @Version, @ForkId, @StartTime, @EngineVersion, - @ForkUrl, - @CommitId, - @BranchName, - @RobustToolboxUrl, - @RobustToolboxCommitId - @RobustToolboxBranchName + @SourceUrl, + @SourceCommitId, + @SourceBranchName, + @EngineSourceUrl, + @EngineSourceCommitId, + @EngineSourceBranchName ) """, new @@ -77,12 +78,12 @@ INSERT INTO PublishInProgress ( request.EngineVersion, ForkId = forkId, StartTime = DateTime.UtcNow, - request.ForkUrl, - request.CommitId, - request.BranchName, - RobustToolboxUrl = request.EngineUrl, - RobustToolboxCommitId = request.EngineCommitId, - RobustToolboxBranchName = request.EngineBranchName, + request.SourceUrl, + request.SourceCommitId, + request.SourceBranchName, + request.EngineSourceUrl, + request.EngineSourceCommitId, + request.EngineSourceBranchName, }); var versionDir = buildDirectoryManager.GetBuildVersionPath(fork, request.Version); @@ -157,7 +158,7 @@ public async Task MultiPublishFinish( var forkId = dbCon.QuerySingle("SELECT Id FROM Fork WHERE Name = @Name", new { Name = fork }); var versionMetadata = dbCon.QuerySingleOrDefault( """ - SELECT Version, EngineVersion, ForkUrl, CommitId, BranchName, EngineUrl, EngineCommitId, EngineBranchName + SELECT Version, EngineVersion, SourceUrl, SourceCommitId, SourceBranchName, EngineSourceUrl, EngineSourceCommitId, EngineSourceBranchName FROM PublishInProgress WHERE Version = @Name AND ForkId = @Fork """, diff --git a/Robust.Cdn/Controllers/ForkPublishController.OneShot.cs b/Robust.Cdn/Controllers/ForkPublishController.OneShot.cs index 85570a6..dcf61cc 100644 --- a/Robust.Cdn/Controllers/ForkPublishController.OneShot.cs +++ b/Robust.Cdn/Controllers/ForkPublishController.OneShot.cs @@ -54,8 +54,8 @@ public async Task PostPublish( var metadata = new VersionMetadata( request.Version, request.EngineVersion, - new(request.ForkUrl, request.CommitId, request.BranchName), - new(request.EngineUrl, request.EngineBranchName, request.EngineCommitId) + new(request.SourceUrl, request.SourceCommitId, request.SourceBranchName), + new(request.EngineSourceUrl, request.EngineSourceCommitId, request.EngineSourceBranchName) ); try diff --git a/Robust.Cdn/Controllers/ForkPublishController.cs b/Robust.Cdn/Controllers/ForkPublishController.cs index 9336d69..07934fc 100644 --- a/Robust.Cdn/Controllers/ForkPublishController.cs +++ b/Robust.Cdn/Controllers/ForkPublishController.cs @@ -314,32 +314,32 @@ public abstract class PublishStartRequestBase /// /// URL of the fork repository. Optional, but useful for debugging. /// - public string? ForkUrl { get; set; } + public string? SourceUrl { get; set; } /// - /// Branch on which version was built. Optional, but useful for debugging. + /// Commit ID on which version was built. Optional, but useful for debugging. /// - public string? BranchName { get; set; } + public string? SourceCommitId { get; set; } /// - /// Commit ID on which version was built. Optional, but useful for debugging. + /// Branch on which version was built. Optional, but useful for debugging. /// - public string? CommitId { get; set; } + public string? SourceBranchName { get; set; } /// /// Url for RobustToolbox repository (or its fork), used for this version. Optional, but useful for debugging. /// - public string? EngineUrl { get; set; } + public string? EngineSourceUrl { get; set; } /// - /// Commit ID of RobustToolbox, used for this version. Optional, but useful for debugging. + /// Branch on which RobustToolbox for this version was built. Optional, but useful for debugging. /// - public string? EngineCommitId { get; set; } + public string? EngineSourceBranchName { get; set; } /// - /// Branch on which RobustToolbox for this version was built. Optional, but useful for debugging. + /// Commit ID of RobustToolbox, used for this version. Optional, but useful for debugging. /// - public string? EngineBranchName { get; set; } + public string? EngineSourceCommitId { get; set; } } /// @@ -370,18 +370,18 @@ public VersionMetadata(string version, string engineVersion, SourceVersionInfo b public VersionMetadata( string version, string engineVersion, - string sourceUrl, - string sourceCommitId, - string sourceBranch, - string engineSourceUrl, - string engineSourceCommitId, - string engineSourceBranch + string? sourceUrl, + string? sourceCommitId, + string? sourceBranchName, + string? engineSourceUrl, + string? engineSourceCommitId, + string? engineSourceBranchName ) { Version = version; EngineVersion = engineVersion; - BuildVersionInfo = new SourceVersionInfo(sourceUrl, sourceCommitId, sourceBranch); - EngineSourceVersionInfo = new SourceVersionInfo(engineSourceUrl, engineSourceCommitId, engineSourceBranch); + BuildVersionInfo = new SourceVersionInfo(sourceUrl, sourceCommitId, sourceBranchName); + EngineSourceVersionInfo = new SourceVersionInfo(engineSourceUrl, engineSourceCommitId, engineSourceBranchName); } /// diff --git a/Robust.Cdn/ManifestMigrations/Script0004_AlterPublishInProgress_AddCommitColumns.sql b/Robust.Cdn/ManifestMigrations/Script0004_AlterPublishInProgress_AddCommitColumns.sql new file mode 100644 index 0000000..e5a573c --- /dev/null +++ b/Robust.Cdn/ManifestMigrations/Script0004_AlterPublishInProgress_AddCommitColumns.sql @@ -0,0 +1,7 @@ +-- Add columns that can represent sources used to build version that should be published +ALTER TABLE PublishInProgress ADD COLUMN SourceUrl TEXT NULL; +ALTER TABLE PublishInProgress ADD COLUMN SourceCommitId TEXT NULL; +ALTER TABLE PublishInProgress ADD COLUMN SourceBranchName TEXT NULL; +ALTER TABLE PublishInProgress ADD COLUMN EngineSourceUrl TEXT NULL; +ALTER TABLE PublishInProgress ADD COLUMN EngineSourceCommitId TEXT NULL; +ALTER TABLE PublishInProgress ADD COLUMN EngineSourceBranchName TEXT NULL; diff --git a/Robust.Cdn/Migrations/Script0004_AlterPublishInProgress_AddCommitColumns.cs b/Robust.Cdn/Migrations/Script0004_AlterPublishInProgress_AddCommitColumns.cs deleted file mode 100644 index cf3178d..0000000 --- a/Robust.Cdn/Migrations/Script0004_AlterPublishInProgress_AddCommitColumns.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Dapper; -using Microsoft.Data.Sqlite; - -namespace Robust.Cdn.Migrations; - -public sealed class Script0004_AlterPublishInProgress_AddCommitColumns : Migrator.IMigrationScript -{ - public string Up(IServiceProvider services, SqliteConnection connection) - { - connection.Execute(""" - ALTER TABLE PublishInProgress ADD COLUMN ForkUrl text null, - ADD COLUMN CommitId text null, - ADD COLUMN BranchName text null, - ADD COLUMN EngineUrl text null, - ADD COLUMN EngineCommitId text null, - ADD COLUMN EngineBranchName text null; - """); - - return string.Empty; - } -} From f29d1c87e7b8b56d93166f705a161033fc3851d4 Mon Sep 17 00:00:00 2001 From: Fildrance Date: Sun, 12 Jul 2026 16:48:10 +0300 Subject: [PATCH 3/3] refactor: clean up naming in new build.json fields --- Robust.Cdn/Controllers/ForkPublishController.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Robust.Cdn/Controllers/ForkPublishController.cs b/Robust.Cdn/Controllers/ForkPublishController.cs index 07934fc..8ec5ce9 100644 --- a/Robust.Cdn/Controllers/ForkPublishController.cs +++ b/Robust.Cdn/Controllers/ForkPublishController.cs @@ -142,12 +142,12 @@ private MemoryStream GenerateBuildJson( { "manifest_url", baseUrlManager.MakeBuildInfoUrl("fork/{FORK_ID}/version/{FORK_VERSION}/manifest") }, { "manifest_download_url", baseUrlManager.MakeBuildInfoUrl("fork/{FORK_ID}/version/{FORK_VERSION}/download") }, { "manifest_hash", manifestHash }, - { "fork_url", metadata.BuildVersionInfo.SourceUrl }, + { "built_on_source_url", metadata.BuildVersionInfo.SourceUrl }, { "built_on_commit_id", metadata.BuildVersionInfo.CommitId }, { "built_on_branch_name", metadata.BuildVersionInfo.BranchName}, - { "engine_url", metadata.EngineSourceVersionInfo.SourceUrl }, - { "engine_built_on_commit_id", metadata.EngineSourceVersionInfo.CommitId }, - { "engine_built_on_branch_name", metadata.EngineSourceVersionInfo.BranchName }, + { "built_on_engine_url", metadata.EngineSourceVersionInfo.SourceUrl }, + { "built_on_engine_commit_id", metadata.EngineSourceVersionInfo.CommitId }, + { "built_on_engine_branch_name", metadata.EngineSourceVersionInfo.BranchName }, }; var stream = new MemoryStream();