diff --git a/src/Runner.Common/RunnerServer.cs b/src/Runner.Common/RunnerServer.cs index 531375b94..8ba6cee1b 100644 --- a/src/Runner.Common/RunnerServer.cs +++ b/src/Runner.Common/RunnerServer.cs @@ -38,7 +38,7 @@ namespace GitHub.Runner.Common Task CreateAgentSessionAsync(Int32 poolId, TaskAgentSession session, CancellationToken cancellationToken); Task DeleteAgentMessageAsync(Int32 poolId, Int64 messageId, Guid sessionId, CancellationToken cancellationToken); Task DeleteAgentSessionAsync(Int32 poolId, Guid sessionId, CancellationToken cancellationToken); - Task GetAgentMessageAsync(Int32 poolId, Guid sessionId, Int64? lastMessageId, TaskAgentStatus status, CancellationToken cancellationToken); + Task GetAgentMessageAsync(Int32 poolId, Guid sessionId, Int64? lastMessageId, TaskAgentStatus status, string runnerVersion, CancellationToken cancellationToken); // job request Task GetAgentRequestAsync(int poolId, long requestId, CancellationToken cancellationToken); @@ -272,10 +272,10 @@ namespace GitHub.Runner.Common return _messageTaskAgentClient.DeleteAgentSessionAsync(poolId, sessionId, cancellationToken: cancellationToken); } - public Task GetAgentMessageAsync(Int32 poolId, Guid sessionId, Int64? lastMessageId, TaskAgentStatus status, CancellationToken cancellationToken) + public Task GetAgentMessageAsync(Int32 poolId, Guid sessionId, Int64? lastMessageId, TaskAgentStatus status, string runnerVersion, CancellationToken cancellationToken) { CheckConnection(RunnerConnectionType.MessageQueue); - return _messageTaskAgentClient.GetMessageAsync(poolId, sessionId, lastMessageId, status, cancellationToken: cancellationToken); + return _messageTaskAgentClient.GetMessageAsync(poolId, sessionId, lastMessageId, status, runnerVersion, cancellationToken: cancellationToken); } //----------------------------------------------------------------- diff --git a/src/Runner.Listener/MessageListener.cs b/src/Runner.Listener/MessageListener.cs index 274967ac3..59eddfbb1 100644 --- a/src/Runner.Listener/MessageListener.cs +++ b/src/Runner.Listener/MessageListener.cs @@ -211,6 +211,7 @@ namespace GitHub.Runner.Listener _session.SessionId, _lastMessageId, runnerStatus, + BuildConstants.RunnerPackage.Version, _getMessagesTokenSource.Token); // Decrypt the message body if the session is using encryption diff --git a/src/Runner.Listener/Runner.cs b/src/Runner.Listener/Runner.cs index b6f9946f7..853e07912 100644 --- a/src/Runner.Listener/Runner.cs +++ b/src/Runner.Listener/Runner.cs @@ -430,12 +430,22 @@ namespace GitHub.Runner.Listener message = await getNextMessage; //get next message HostContext.WritePerfCounter($"MessageReceived_{message.MessageType}"); - if (string.Equals(message.MessageType, AgentRefreshMessage.MessageType, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(message.MessageType, AgentRefreshMessage.MessageType, StringComparison.OrdinalIgnoreCase) || + string.Equals(message.MessageType, RunnerRefreshMessage.MessageType, StringComparison.OrdinalIgnoreCase)) { if (autoUpdateInProgress == false) { autoUpdateInProgress = true; - var runnerUpdateMessage = JsonUtility.FromString(message.Body); + AgentRefreshMessage runnerUpdateMessage = null; + if (string.Equals(message.MessageType, AgentRefreshMessage.MessageType, StringComparison.OrdinalIgnoreCase)) + { + runnerUpdateMessage = JsonUtility.FromString(message.Body); + } + else + { + var brokerRunnerUpdateMessage = JsonUtility.FromString(message.Body); + runnerUpdateMessage = new AgentRefreshMessage(brokerRunnerUpdateMessage.RunnerId, brokerRunnerUpdateMessage.TargetVersion, TimeSpan.FromSeconds(brokerRunnerUpdateMessage.TimeoutInSeconds)); + } #if DEBUG // Can mock the update for testing if (StringUtil.ConvertToBoolean(Environment.GetEnvironmentVariable("GITHUB_ACTIONS_RUNNER_IS_MOCK_UPDATE"))) diff --git a/src/Sdk/DTGenerated/Generated/TaskAgentHttpClientBase.cs b/src/Sdk/DTGenerated/Generated/TaskAgentHttpClientBase.cs index 439fd61c4..a423539f3 100644 --- a/src/Sdk/DTGenerated/Generated/TaskAgentHttpClientBase.cs +++ b/src/Sdk/DTGenerated/Generated/TaskAgentHttpClientBase.cs @@ -450,6 +450,8 @@ namespace GitHub.DistributedTask.WebApi /// /// /// + /// + /// /// /// The cancellation token to cancel operation. [EditorBrowsable(EditorBrowsableState.Never)] @@ -458,6 +460,7 @@ namespace GitHub.DistributedTask.WebApi Guid sessionId, long? lastMessageId = null, TaskAgentStatus? status = null, + string runnerVersion = null, object userState = null, CancellationToken cancellationToken = default) { @@ -475,12 +478,16 @@ namespace GitHub.DistributedTask.WebApi { queryParams.Add("status", status.Value.ToString()); } + if (runnerVersion != null) + { + queryParams.Add("runnerVersion", runnerVersion); + } return SendAsync( httpMethod, locationId, routeValues: routeValues, - version: new ApiResourceVersion(5.1, 1), + version: new ApiResourceVersion(6.0, 1), queryParameters: queryParams, userState: userState, cancellationToken: cancellationToken); diff --git a/src/Sdk/DTWebApi/WebApi/RunnerRefreshMessage.cs b/src/Sdk/DTWebApi/WebApi/RunnerRefreshMessage.cs new file mode 100644 index 000000000..93197c260 --- /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 runnerId, + String targetVersion, + int? timeoutInSeconds = null) + { + this.RunnerId = runnerId; + this.TimeoutInSeconds = timeoutInSeconds ?? TimeSpan.FromMinutes(60).Seconds; + this.TargetVersion = targetVersion; + } + + [DataMember] + public Int32 RunnerId + { + get; + private set; + } + + [DataMember] + public int TimeoutInSeconds + { + get; + private set; + } + + [DataMember] + public String TargetVersion + { + get; + private set; + } + } +} diff --git a/src/Test/L0/Listener/MessageListenerL0.cs b/src/Test/L0/Listener/MessageListenerL0.cs index 8ce1dfe0f..b2db393bf 100644 --- a/src/Test/L0/Listener/MessageListenerL0.cs +++ b/src/Test/L0/Listener/MessageListenerL0.cs @@ -192,8 +192,8 @@ namespace GitHub.Runner.Common.Tests.Listener _runnerServer .Setup(x => x.GetAgentMessageAsync( - _settings.PoolId, expectedSession.SessionId, It.IsAny(), TaskAgentStatus.Online, It.IsAny())) - .Returns(async (Int32 poolId, Guid sessionId, Int64? lastMessageId, TaskAgentStatus status, CancellationToken cancellationToken) => + _settings.PoolId, expectedSession.SessionId, It.IsAny(), TaskAgentStatus.Online, It.IsAny(), It.IsAny())) + .Returns(async (Int32 poolId, Guid sessionId, Int64? lastMessageId, TaskAgentStatus status, string runnerVersion, CancellationToken cancellationToken) => { await Task.Yield(); return messages.Dequeue(); @@ -208,7 +208,7 @@ namespace GitHub.Runner.Common.Tests.Listener //Assert _runnerServer .Verify(x => x.GetAgentMessageAsync( - _settings.PoolId, expectedSession.SessionId, It.IsAny(), TaskAgentStatus.Online, It.IsAny()), Times.Exactly(arMessages.Length)); + _settings.PoolId, expectedSession.SessionId, It.IsAny(), TaskAgentStatus.Online, It.IsAny(), It.IsAny()), Times.Exactly(arMessages.Length)); } } @@ -293,7 +293,7 @@ namespace GitHub.Runner.Common.Tests.Listener _runnerServer .Setup(x => x.GetAgentMessageAsync( - _settings.PoolId, expectedSession.SessionId, It.IsAny(), TaskAgentStatus.Online, It.IsAny())) + _settings.PoolId, expectedSession.SessionId, It.IsAny(), TaskAgentStatus.Online, It.IsAny(), It.IsAny())) .Throws(new TaskAgentAccessTokenExpiredException("test")); try { @@ -311,7 +311,7 @@ namespace GitHub.Runner.Common.Tests.Listener //Assert _runnerServer .Verify(x => x.GetAgentMessageAsync( - _settings.PoolId, expectedSession.SessionId, It.IsAny(), TaskAgentStatus.Online, It.IsAny()), Times.Once); + _settings.PoolId, expectedSession.SessionId, It.IsAny(), TaskAgentStatus.Online, It.IsAny(), It.IsAny()), Times.Once); _runnerServer .Verify(x => x.DeleteAgentSessionAsync(