From b3f4a814e3e323e25de8e36a8cf128ae25620565 Mon Sep 17 00:00:00 2001 From: NathanFlurry Date: Mon, 26 Aug 2024 17:53:44 +0000 Subject: [PATCH] chore: re-impl deploys (#45) --- .dockerignore | 2 + Assets/Backend/Client/ApiClient.cs | 3 + Assets/Examples/LobbiesServers/Scripts/UI.cs | 7 +- Assets/Rivet/Editor/BuildPipeline.cs | 13 ++- Assets/Rivet/Editor/PluginSettings.cs | 8 +- Assets/Rivet/Editor/Task.cs | 12 ++- Assets/Rivet/Editor/UI/RivetPlugin.cs | 14 ++++ .../Editor/UI/Screens/LoginController.cs | 3 + .../Rivet/Editor/UI/Screens/MainController.cs | 19 +++-- .../Rivet/Editor/UI/Tabs/DeployController.cs | 60 +++++++++---- Assets/Rivet/Editor/UI/Tabs/Develop.uxml | 4 +- .../Rivet/Editor/UI/Tabs/DevelopController.cs | 12 ++- Assets/Rivet/Editor/UI/Tabs/Settings.uxml | 4 +- .../Editor/UI/Tabs/SettingsController.cs | 40 ++++++++- Assets/Rivet/Editor/UI/Tabs/Setup.uxml | 3 +- .../Editor/UI/TaskPopup/TaskPopupWindow.cs | 13 +-- Assets/Rivet/Editor/Util/Builder.cs | 84 +++++++++---------- Dockerfile | 20 +++++ backend.json | 22 ++++- 19 files changed, 246 insertions(+), 97 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1e27ddd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +* +!Builds/Release/DedicatedServer/ diff --git a/Assets/Backend/Client/ApiClient.cs b/Assets/Backend/Client/ApiClient.cs index 188b3c9..c18eeab 100644 --- a/Assets/Backend/Client/ApiClient.cs +++ b/Assets/Backend/Client/ApiClient.cs @@ -423,6 +423,9 @@ private async Task> ExecAsync( await tsc.Task; } + // Log the path and response + Debug.Log($"Backend request {request.method} {path} ({request.responseCode}): {request.downloadHandler.text}"); + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.DataProcessingError) { diff --git a/Assets/Examples/LobbiesServers/Scripts/UI.cs b/Assets/Examples/LobbiesServers/Scripts/UI.cs index 42b39a7..eb18978 100644 --- a/Assets/Examples/LobbiesServers/Scripts/UI.cs +++ b/Assets/Examples/LobbiesServers/Scripts/UI.cs @@ -33,6 +33,11 @@ private BackendClient TEMPBackendClient() return new BackendClient(config.BackendEndpoint); } + private string TEMPGameVersion() { + var config = new Configuration(); + return config.GameVersion; + } + private void Start() { _networkManager = FindObjectOfType(); @@ -61,7 +66,7 @@ public async void OnClick_Find() joinMenuPanel.SetActive(false); var response = await TEMPBackendClient().Lobbies.FindOrCreate(new Backend.Model.Lobbies.FindOrCreateRequest( - varVersion: "default", + varVersion: TEMPGameVersion(), regions: new List { "local" }, tags: new Dictionary { diff --git a/Assets/Rivet/Editor/BuildPipeline.cs b/Assets/Rivet/Editor/BuildPipeline.cs index d73090a..61be1a7 100644 --- a/Assets/Rivet/Editor/BuildPipeline.cs +++ b/Assets/Rivet/Editor/BuildPipeline.cs @@ -35,11 +35,16 @@ public void OnPreprocessBuild(BuildReport report) public void OnPostprocessBuild(BuildReport report) { - // Delete asset file - string filePath = Path.Combine(Application.streamingAssetsPath, "rivet_config.json"); - if (File.Exists(filePath)) + string jsonFilePath = Path.Combine(Application.streamingAssetsPath, "rivet_config.json"); + if (File.Exists(jsonFilePath)) + { + File.Delete(jsonFilePath); + } + + string metaFilePath = jsonFilePath + ".meta"; + if (File.Exists(metaFilePath)) { - File.Delete(filePath); + File.Delete(metaFilePath); } } } diff --git a/Assets/Rivet/Editor/PluginSettings.cs b/Assets/Rivet/Editor/PluginSettings.cs index 60a4042..af0ce09 100644 --- a/Assets/Rivet/Editor/PluginSettings.cs +++ b/Assets/Rivet/Editor/PluginSettings.cs @@ -119,7 +119,8 @@ public static string GameVersion set => SetAndSave(ref gameVersion, value, "GameVersion"); } - public static void LoadSettings() { + public static void LoadSettings() + { backendEndpoint = PlayerPrefs.GetString("BackendEndpoint"); gameVersion = PlayerPrefs.GetString("GameVersion"); } @@ -144,10 +145,9 @@ public static void UpdateFromPlugin() _ => throw new System.NotImplementedException(), }; - // TODO: - GameVersion = "TODO"; + GameVersion = plugin.GameVersion ?? "unknown"; - RivetLogger.Log($"Update Shared Settings: BackendEndpoint={BackendEndpoint} GameVersion={GameVersion}"); + RivetLogger.Log($"Update Shared Settings [BackendEndpoint={BackendEndpoint} GameVersion={GameVersion}]"); } } } diff --git a/Assets/Rivet/Editor/Task.cs b/Assets/Rivet/Editor/Task.cs index a09ae3f..0f515f4 100644 --- a/Assets/Rivet/Editor/Task.cs +++ b/Assets/Rivet/Editor/Task.cs @@ -23,6 +23,7 @@ public enum LogType { STDOUT, STDERR } // State public bool IsRunning { get; private set; } = false; + public bool IsFinished { get; private set; } = false; private StateFiles _stateFiles; private CancellationTokenSource _cts; private FileStream _logFileStream; @@ -74,6 +75,7 @@ public async Task> RunAsync(CancellationToken cancellationToken var logPollingTask = StartLogPolling(_cts.Token); var result = await Task.Run(() => RunTask(_name, _input, runConfig), _cts.Token); IsRunning = false; + IsFinished = true; // Read end of logs immediately. Log polling task will cancel // itself. @@ -84,6 +86,7 @@ public async Task> RunAsync(CancellationToken cancellationToken finally { IsRunning = false; + IsFinished = true; FinishLogs(); Dispose(); // Self-dispose after the task is complete } @@ -244,6 +247,11 @@ private StateFiles GenerateStateFilesDir() } } + private string StripAnsiCodes(string input) + { + return System.Text.RegularExpressions.Regex.Replace(input, @"\x1b\[[0-9;]*m", string.Empty); + } + private void ReadLogTail() { if (_logFileStream == null) @@ -269,11 +277,11 @@ private void ReadLogTail() var parsed = JsonConvert.DeserializeObject>(line); if (parsed.ContainsKey("Stdout")) { - OnLog?.Invoke(parsed["Stdout"], LogType.STDOUT); + OnLog?.Invoke(StripAnsiCodes(parsed["Stdout"]), LogType.STDOUT); } else if (parsed.ContainsKey("Stderr")) { - OnLog?.Invoke(parsed["Stderr"], LogType.STDERR); + OnLog?.Invoke(StripAnsiCodes(parsed["Stderr"]), LogType.STDERR); } } catch (JsonException) diff --git a/Assets/Rivet/Editor/UI/RivetPlugin.cs b/Assets/Rivet/Editor/UI/RivetPlugin.cs index 8150007..b3d4af2 100644 --- a/Assets/Rivet/Editor/UI/RivetPlugin.cs +++ b/Assets/Rivet/Editor/UI/RivetPlugin.cs @@ -48,6 +48,9 @@ public int LocalBackendPort { } } + // MARK: Deployed + public string? GameVersion; + // MARK: Tasks public TaskManager LocalGameServerManager; public TaskManager BackendManager; @@ -94,6 +97,17 @@ public void SetScreen(Screen screen) _screen = screen; _screenLogin.style.display = screen == Screen.Login ? DisplayStyle.Flex : DisplayStyle.None; _screenMain.style.display = screen == Screen.Main ? DisplayStyle.Flex : DisplayStyle.None; + + // Notify the appropriate controller + switch (screen) + { + case Screen.Login: + LoginController.OnShow(); + break; + case Screen.Main: + MainController.OnShow(); + break; + } } public void OnEnable() diff --git a/Assets/Rivet/Editor/UI/Screens/LoginController.cs b/Assets/Rivet/Editor/UI/Screens/LoginController.cs index 3e76ebd..e739582 100644 --- a/Assets/Rivet/Editor/UI/Screens/LoginController.cs +++ b/Assets/Rivet/Editor/UI/Screens/LoginController.cs @@ -22,7 +22,10 @@ public LoginController(RivetPlugin window, VisualElement root) _root = root; InitUI(); + } + public void OnShow() + { _ = CheckLoginState(); } diff --git a/Assets/Rivet/Editor/UI/Screens/MainController.cs b/Assets/Rivet/Editor/UI/Screens/MainController.cs index 3fe2d03..c3d6fc1 100644 --- a/Assets/Rivet/Editor/UI/Screens/MainController.cs +++ b/Assets/Rivet/Editor/UI/Screens/MainController.cs @@ -75,10 +75,10 @@ public RivetEnvironment? RemoteEnvironment { get { - return BootstrapData?.Environments[RemoteEnvironmentIndex]; + return RemoteEnvironmentIndex != null ? BootstrapData?.Environments[RemoteEnvironmentIndex.Value] : null; } } - public int RemoteEnvironmentIndex + public int? RemoteEnvironmentIndex { get { @@ -94,9 +94,9 @@ public int RemoteEnvironmentIndex } set { - if (value >= 0 && value < BootstrapData?.Environments.Count) + if (value != null && value >= 0 && value < BootstrapData?.Environments.Count) { - RemoteEnvironmentId = BootstrapData?.Environments[value].Id; + RemoteEnvironmentId = BootstrapData?.Environments[value.Value].EnvironmentId; } } } @@ -109,7 +109,9 @@ public MainController(RivetPlugin window, VisualElement root) // UI InitUI(); SetTab(MainTab.Setup); + } + public void OnShow() { // Fetch data _ = GetBootstrapData(); } @@ -157,7 +159,7 @@ void SetTab(MainTab tab) _settingsTabBody.style.display = tab == MainTab.Settings ? DisplayStyle.Flex : DisplayStyle.None; } - private async Task GetBootstrapData() + public async Task GetBootstrapData() { var result = await new RivetTask("get_bootstrap_data", new JObject()).RunAsync(); if (result is ResultErr err) @@ -168,6 +170,7 @@ private async Task GetBootstrapData() var data = result.Data.ToObject(); ; BootstrapData = data; +<<<<<<< HEAD try { var data = result.Data.ToObject(); @@ -182,6 +185,12 @@ private async Task GetBootstrapData() RivetLogger.Error($"Exception in GetBootstrapData: {ex.Message}"); RivetLogger.Error($"Stack trace: {ex.StackTrace}"); } +======= + _developController.OnBootstrap(data); + _deployController.OnBootstrap(data); + + SharedSettings.UpdateFromPlugin(); +>>>>>>> 3ace6b6 (chore: re-impl deploys) } /// diff --git a/Assets/Rivet/Editor/UI/Tabs/DeployController.cs b/Assets/Rivet/Editor/UI/Tabs/DeployController.cs index 0944911..be0a768 100644 --- a/Assets/Rivet/Editor/UI/Tabs/DeployController.cs +++ b/Assets/Rivet/Editor/UI/Tabs/DeployController.cs @@ -12,6 +12,7 @@ using UnityEditor; using UnityEngine; using UnityEngine.UIElements; +using Rivet.Editor.UI.TaskPopup; namespace Rivet.UI.Tabs { @@ -21,6 +22,7 @@ public class DeployController private MainController _mainController; private readonly VisualElement _root; + private VisualElement _refreshButton; private DropdownField _environmentDropdown; private Button _buildDeployButton; private DropdownField _stepsDropdown; @@ -37,11 +39,14 @@ public DeployController(RivetPlugin window, MainController mainController, Visua void InitUI() { // Query + _refreshButton = _root.Q("DeployHeader").Q("Header").Q("Action"); _environmentDropdown = _root.Q("EnvironmentDropdown"); _buildDeployButton = _root.Q("BuildDeployButton").Q