diff --git a/src/Runner.Listener/JobDispatcher.cs b/src/Runner.Listener/JobDispatcher.cs index 10076441eff..f4c5df7ad07 100644 --- a/src/Runner.Listener/JobDispatcher.cs +++ b/src/Runner.Listener/JobDispatcher.cs @@ -8,6 +8,7 @@ using System.Threading; using System.Threading.Tasks; using GitHub.DistributedTask.Pipelines; +using GitHub.DistributedTask.Pipelines.ContextData; using GitHub.DistributedTask.WebApi; using GitHub.Runner.Common; using GitHub.Runner.Common.Util; @@ -373,7 +374,8 @@ private async Task RunAsync(Pipelines.AgentJobRequestMessage message } var term = HostContext.GetService(); - term.WriteLine($"{DateTime.UtcNow:u}: Running job: {message.JobDisplayName}"); + var workflowRunId = GetGitHubContextValue(message, "run_id"); + term.WriteLine($"{DateTime.UtcNow:u}: Running job: {message.JobDisplayName} (Workflow run ID: {workflowRunId})"); // first job request renew succeed. TaskCompletionSource firstJobRequestRenewed = new(); @@ -729,6 +731,20 @@ await processChannel.SendAsync( } } + internal static string GetGitHubContextValue(Pipelines.AgentJobRequestMessage message, string key) + { + if (message.ContextData != null && + message.ContextData.TryGetValue("github", out var githubContext) && + githubContext is DictionaryContextData githubContextData && + githubContextData.TryGetValue(key, out var value) && + value is StringContextData stringValue) + { + return stringValue.Value; + } + + return "unknown"; + } + internal async Task RenewJobRequestAsync(Pipelines.AgentJobRequestMessage message, ServiceEndpoint systemConnection, int poolId, long requestId, Guid lockToken, string orchestrationId, TaskCompletionSource firstJobRequestRenewed, CancellationToken token) { if (this._isRunServiceJob) diff --git a/src/Test/L0/Listener/JobDispatcherL0.cs b/src/Test/L0/Listener/JobDispatcherL0.cs index a160ffba2c0..09a64d15529 100644 --- a/src/Test/L0/Listener/JobDispatcherL0.cs +++ b/src/Test/L0/Listener/JobDispatcherL0.cs @@ -47,6 +47,38 @@ private Pipelines.AgentJobRequestMessage CreateJobRequestMessage(string billingO return result; } + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Runner")] + public void GetGitHubContextValue_ReturnsValue_WhenPresent() + { + var message = CreateJobRequestMessage(); + ((DictionaryContextData)message.ContextData["github"])["run_id"] = new StringContextData("123456"); + + Assert.Equal("123456", JobDispatcher.GetGitHubContextValue(message, "run_id")); + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Runner")] + public void GetGitHubContextValue_ReturnsUnknown_WhenKeyMissing() + { + var message = CreateJobRequestMessage(); + + Assert.Equal("unknown", JobDispatcher.GetGitHubContextValue(message, "run_id")); + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Runner")] + public void GetGitHubContextValue_ReturnsUnknown_WhenGitHubContextMissing() + { + var message = CreateJobRequestMessage(); + message.ContextData.Remove("github"); + + Assert.Equal("unknown", JobDispatcher.GetGitHubContextValue(message, "run_id")); + } + [Theory] [Trait("Level", "L0")] [Trait("Category", "Runner")]