diff --git a/.vscode/launch.json b/.vscode/launch.json index 3c5f5c694..887789e3b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,7 +12,10 @@ ], "cwd": "${workspaceFolder}/src", "console": "integratedTerminal", - "requireExactSource": false + "requireExactSource": false, + "env": { + "USE_BROKER_FLOW": "1" + } }, { "name": "Run", @@ -24,7 +27,10 @@ ], "cwd": "${workspaceFolder}/src", "console": "integratedTerminal", - "requireExactSource": false + "requireExactSource": false, + "env": { + "USE_BROKER_FLOW": "1" + } }, { "name": "Configure", @@ -54,5 +60,4 @@ "requireExactSource": false }, ], -} - +} \ No newline at end of file diff --git a/src/Runner.Listener/Runner.cs b/src/Runner.Listener/Runner.cs index f3a76f59d..c42967c8e 100644 --- a/src/Runner.Listener/Runner.cs +++ b/src/Runner.Listener/Runner.cs @@ -466,12 +466,20 @@ namespace GitHub.Runner.Listener Trace.Info("Refresh message received, skip autoupdate since a previous autoupdate is already running."); } } - else if (string.Equals(message.MessageType, "BrokerAgentRefresh", StringComparison.OrdinalIgnoreCase)) + else if (string.Equals(message.MessageType, RunnerRefreshMessage.MessageType, StringComparison.OrdinalIgnoreCase)) { if (autoUpdateInProgress == false) { autoUpdateInProgress = true; - var runnerUpdateMessage = JsonUtility.FromString(message.Body); + var runnerUpdateMessage = JsonUtility.FromString(message.Body); + + ////////////////////////////// + _term.WriteLine($"TargetVersion: {runnerUpdateMessage.TargetVersion}"); + _term.WriteLine($"AgentId: {runnerUpdateMessage.AgentId}"); + _term.WriteLine($"Timeout: {runnerUpdateMessage.Timeout.ToString()}"); + ////////////////////////////// + + var agentRefreshMessage = new AgentRefreshMessage(runnerUpdateMessage.AgentId, runnerUpdateMessage.TargetVersion, TimeSpan.FromMilliseconds(runnerUpdateMessage.Timeout)); #if DEBUG // Can mock the update for testing if (StringUtil.ConvertToBoolean(Environment.GetEnvironmentVariable("GITHUB_ACTIONS_RUNNER_IS_MOCK_UPDATE"))) @@ -488,17 +496,13 @@ namespace GitHub.Runner.Listener var mockTargetVersion = mockUpdateMessages[BuildConstants.RunnerPackage.Version].TargetVersion; _term.WriteLine($"Mocking update, using version {mockTargetVersion} instead of {runnerUpdateMessage.TargetVersion}"); Trace.Info($"Mocking update, using version {mockTargetVersion} instead of {runnerUpdateMessage.TargetVersion}"); - runnerUpdateMessage = new AgentRefreshMessage(runnerUpdateMessage.AgentId, mockTargetVersion, runnerUpdateMessage.Timeout); + agentRefreshMessage = new AgentRefreshMessage(agentRefreshMessage.AgentId, mockTargetVersion, agentRefreshMessage.Timeout); } } } #endif - // var selfUpdater = HostContext.GetService(); - // selfUpdateTask = selfUpdater.SelfUpdate(runnerUpdateMessage, jobDispatcher, false, HostContext.RunnerShutdownToken); - _term.WriteLine("BrokerAgentRefresh message received, kick-off selfupdate background process."); - _term.WriteLine($"TargetVersion: {runnerUpdateMessage.TargetVersion}"); - _term.WriteLine($"AgentId: {runnerUpdateMessage.AgentId}"); - _term.WriteLine($"Timeout: {runnerUpdateMessage.Timeout.ToString()}"); + var selfUpdater = HostContext.GetService(); + selfUpdateTask = selfUpdater.SelfUpdate(agentRefreshMessage, jobDispatcher, false, HostContext.RunnerShutdownToken); Trace.Info("Refresh message received, kick-off selfupdate background process."); } else diff --git a/src/Runner.Listener/SelfUpdater.cs b/src/Runner.Listener/SelfUpdater.cs index 3c8242402..7c055bf1b 100644 --- a/src/Runner.Listener/SelfUpdater.cs +++ b/src/Runner.Listener/SelfUpdater.cs @@ -73,13 +73,12 @@ namespace GitHub.Runner.Listener // we will just go with the full package. var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(token); _cloneAndCalculateContentHashTask = CloneAndCalculateAssetsHash(_dotnetRuntimeCloneDirectory, _externalsCloneDirectory, linkedTokenSource.Token); - + _terminal.WriteLine("Self-update"); if (!await UpdateNeeded(updateMessage.TargetVersion, token)) { Trace.Info($"Can't find available update package."); return false; } - Trace.Info($"An update is available."); _updateTrace.Enqueue($"RunnerPlatform: {_targetPackage.Platform}"); @@ -171,9 +170,12 @@ namespace GitHub.Runner.Listener // old server won't send target version as part of update message. if (string.IsNullOrEmpty(targetVersion)) { + _terminal.WriteLine("Debug 1"); var packages = await _runnerServer.GetPackagesAsync(_packageType, _platform, 1, true, token); + _terminal.WriteLine("Debug 2"); if (packages == null || packages.Count == 0) { + _terminal.WriteLine("Debug 3"); Trace.Info($"There is no package for {_packageType} and {_platform}."); return false; } @@ -182,14 +184,19 @@ namespace GitHub.Runner.Listener } else { - _targetPackage = await _runnerServer.GetPackageAsync(_packageType, _platform, targetVersion, true, token); + _terminal.WriteLine("Debug 4"); + _targetPackage = new PackageMetadata() { Platform = BuildConstants.RunnerPackage.PackageName, + Version = new PackageVersion(targetVersion), + DownloadUrl = $"https://github.com/actions/runner/releases/download/v{targetVersion}/actions-runner-{BuildConstants.RunnerPackage.PackageName}-{targetVersion}.tar.gz" }; + _terminal.WriteLine("Debug 5"); if (_targetPackage == null) { + _terminal.WriteLine("Debug 6"); Trace.Info($"There is no package for {_packageType} and {_platform} with version {targetVersion}."); return false; } } - + _terminal.WriteLine("Debug 7"); Trace.Info($"Version '{_targetPackage.Version}' of '{_targetPackage.Type}' package available in server."); PackageVersion serverVersion = new PackageVersion(_targetPackage.Version); Trace.Info($"Current running runner version is {BuildConstants.RunnerPackage.Version}"); diff --git a/src/Sdk/DTWebApi/WebApi/RunnerRefreshMessage.cs b/src/Sdk/DTWebApi/WebApi/RunnerRefreshMessage.cs new file mode 100644 index 000000000..06ee2393f --- /dev/null +++ b/src/Sdk/DTWebApi/WebApi/RunnerRefreshMessage.cs @@ -0,0 +1,49 @@ +using Newtonsoft.Json; +using System; +using System.Runtime.Serialization; + + +namespace GitHub.DistributedTask.WebApi +{ + [DataContract] + public sealed class RunnerRefreshMessage + { + public static readonly String MessageType = "RunnerRefresh"; + + [JsonConstructor] + internal RunnerRefreshMessage() + { + } + + public RunnerRefreshMessage( + Int32 agentId, + String targetVersion, + int? timeout = null) + { + this.AgentId = agentId; + this.Timeout = timeout ?? TimeSpan.FromMinutes(60).Milliseconds; + this.TargetVersion = targetVersion; + } + + [DataMember] + public Int32 AgentId + { + get; + private set; + } + + [DataMember] + public int Timeout + { + get; + private set; + } + + [DataMember] + public String TargetVersion + { + get; + private set; + } + } +}