From 6822f4aba2a85274dc956d206d24c47376544684 Mon Sep 17 00:00:00 2001 From: Tingluo Huang Date: Tue, 27 Jan 2026 16:52:25 -0500 Subject: [PATCH] Report job level annotations (#4216) --- src/Runner.Common/Constants.cs | 1 + src/Runner.Worker/ExecutionContext.cs | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Runner.Common/Constants.cs b/src/Runner.Common/Constants.cs index 045e90663..f2d5dd26e 100644 --- a/src/Runner.Common/Constants.cs +++ b/src/Runner.Common/Constants.cs @@ -173,6 +173,7 @@ namespace GitHub.Runner.Common public static readonly string SnapshotPreflightImageGenPoolCheck = "actions_snapshot_preflight_image_gen_pool_check"; public static readonly string CompareWorkflowParser = "actions_runner_compare_workflow_parser"; public static readonly string SetOrchestrationIdEnvForActions = "actions_set_orchestration_id_env_for_actions"; + public static readonly string SendJobLevelAnnotations = "actions_send_job_level_annotations"; } // Node version migration related constants diff --git a/src/Runner.Worker/ExecutionContext.cs b/src/Runner.Worker/ExecutionContext.cs index 5646d46aa..2a7cd11fb 100644 --- a/src/Runner.Worker/ExecutionContext.cs +++ b/src/Runner.Worker/ExecutionContext.cs @@ -499,7 +499,7 @@ namespace GitHub.Runner.Worker PublishStepTelemetry(); - if (_record.RecordType == "Task") + if (_record.RecordType == ExecutionContextType.Task) { var stepResult = new StepResult { @@ -532,6 +532,25 @@ namespace GitHub.Runner.Worker Global.StepsResult.Add(stepResult); } + if (Global.Variables.GetBoolean(Constants.Runner.Features.SendJobLevelAnnotations) ?? false) + { + if (_record.RecordType == ExecutionContextType.Job) + { + _record.Issues?.ForEach(issue => + { + var annotation = issue.ToAnnotation(); + if (annotation != null) + { + Global.JobAnnotations.Add(annotation.Value); + if (annotation.Value.IsInfrastructureIssue && string.IsNullOrEmpty(Global.InfrastructureFailureCategory)) + { + Global.InfrastructureFailureCategory = issue.Category; + } + } + }); + } + } + if (Root != this) { // only dispose TokenSource for step level ExecutionContext