From 9180f758620f19d1e24e3dddcc8c2146396dabb1 Mon Sep 17 00:00:00 2001 From: konradpabjan Date: Thu, 10 Mar 2022 13:57:08 -0500 Subject: [PATCH 1/3] Save record order for annotation links when creating issues --- src/Runner.Worker/ExecutionContext.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/Runner.Worker/ExecutionContext.cs b/src/Runner.Worker/ExecutionContext.cs index 48366b3104d..7bf73a23918 100644 --- a/src/Runner.Worker/ExecutionContext.cs +++ b/src/Runner.Worker/ExecutionContext.cs @@ -550,10 +550,12 @@ public void AddIssue(Issue issue, string logMessage = null) issue.Message = issue.Message[.._maxIssueMessageLength]; } + // Tracking the line number (logFileLineNumber) and step number (stepNumber) for each issue that gets created + // Actions UI from the run summary page use both values to easily link to an exact locations in logs where annotations originate from + issue.Data["stepNumber"] = _record.Order != null ? _record.Order.ToString() : "0"; + if (issue.Type == IssueType.Error) { - // tracking line number for each issue in log file - // log UI use this to navigate from issue to log if (!string.IsNullOrEmpty(logMessage)) { long logLineNumber = Write(WellKnownTags.Error, logMessage); @@ -569,8 +571,6 @@ public void AddIssue(Issue issue, string logMessage = null) } else if (issue.Type == IssueType.Warning) { - // tracking line number for each issue in log file - // log UI use this to navigate from issue to log if (!string.IsNullOrEmpty(logMessage)) { long logLineNumber = Write(WellKnownTags.Warning, logMessage); @@ -586,9 +586,6 @@ public void AddIssue(Issue issue, string logMessage = null) } else if (issue.Type == IssueType.Notice) { - - // tracking line number for each issue in log file - // log UI use this to navigate from issue to log if (!string.IsNullOrEmpty(logMessage)) { long logLineNumber = Write(WellKnownTags.Notice, logMessage); From 57fef30170b3129024131911465b482ba9eac067 Mon Sep 17 00:00:00 2001 From: konradpabjan Date: Fri, 11 Mar 2022 09:25:36 -0500 Subject: [PATCH 2/3] PR feedback --- src/Runner.Worker/ExecutionContext.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Runner.Worker/ExecutionContext.cs b/src/Runner.Worker/ExecutionContext.cs index 7bf73a23918..ace20cc773d 100644 --- a/src/Runner.Worker/ExecutionContext.cs +++ b/src/Runner.Worker/ExecutionContext.cs @@ -552,7 +552,10 @@ public void AddIssue(Issue issue, string logMessage = null) // Tracking the line number (logFileLineNumber) and step number (stepNumber) for each issue that gets created // Actions UI from the run summary page use both values to easily link to an exact locations in logs where annotations originate from - issue.Data["stepNumber"] = _record.Order != null ? _record.Order.ToString() : "0"; + if (_record.Order != null) + { + issue.Data["stepNumber"] = _record.Order.ToString(); + } if (issue.Type == IssueType.Error) { From 0ebeac3d8f06919721888f4577606fa2daa6a73d Mon Sep 17 00:00:00 2001 From: konradpabjan Date: Mon, 14 Mar 2022 10:43:49 -0400 Subject: [PATCH 3/3] Add tests for step and line numbers --- src/Test/L0/Worker/ExecutionContextL0.cs | 49 ++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/Test/L0/Worker/ExecutionContextL0.cs b/src/Test/L0/Worker/ExecutionContextL0.cs index e6351edb099..aa50c71fa27 100644 --- a/src/Test/L0/Worker/ExecutionContextL0.cs +++ b/src/Test/L0/Worker/ExecutionContextL0.cs @@ -144,6 +144,55 @@ public void AddIssue_TrimMessageSize() } } + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void AddIssue_AddStepAndLineNumberInformation() + { + using (TestHostContext hc = CreateTestContext()) + { + + TaskOrchestrationPlanReference plan = new TaskOrchestrationPlanReference(); + TimelineReference timeline = new TimelineReference(); + Guid jobId = Guid.NewGuid(); + string jobName = "some job name"; + var jobRequest = new Pipelines.AgentJobRequestMessage(plan, timeline, jobId, jobName, jobName, null, null, null, new Dictionary(), new List(), new Pipelines.JobResources(), new Pipelines.ContextData.DictionaryContextData(), new Pipelines.WorkspaceOptions(), new List(), null, null, null, null); + jobRequest.Resources.Repositories.Add(new Pipelines.RepositoryResource() + { + Alias = Pipelines.PipelineConstants.SelfAlias, + Id = "github", + Version = "sha1" + }); + jobRequest.ContextData["github"] = new Pipelines.ContextData.DictionaryContextData(); + + // Arrange: Setup the paging logger. + var pagingLogger = new Mock(); + var pagingLogger2 = new Mock(); + var jobServerQueue = new Mock(); + jobServerQueue.Setup(x => x.QueueTimelineRecordUpdate(It.IsAny(), It.IsAny())); + + hc.EnqueueInstance(pagingLogger.Object); + hc.EnqueueInstance(pagingLogger2.Object); + hc.SetSingleton(jobServerQueue.Object); + + var ec = new Runner.Worker.ExecutionContext(); + ec.Initialize(hc); + ec.InitializeJob(jobRequest, CancellationToken.None); + ec.Start(); + + var embeddedStep = ec.CreateChild(Guid.NewGuid(), "action_1_pre", "action_1_pre", null, null, ActionRunStage.Main, isEmbedded: true); + embeddedStep.Start(); + + embeddedStep.AddIssue(new Issue() { Type = IssueType.Error, Message = "error annotation that should have step and line number information" }); + embeddedStep.AddIssue(new Issue() { Type = IssueType.Warning, Message = "warning annotation that should have step and line number information" }); + embeddedStep.AddIssue(new Issue() { Type = IssueType.Notice, Message = "notice annotation that should have step and line number information" }); + + jobServerQueue.Verify(x => x.QueueTimelineRecordUpdate(It.IsAny(), It.Is(t => t.Issues.Where(i => i.Data.ContainsKey("stepNumber") && i.Data.ContainsKey("logFileLineNumber") && i.Type == IssueType.Error).Count() == 1)), Times.AtLeastOnce); + jobServerQueue.Verify(x => x.QueueTimelineRecordUpdate(It.IsAny(), It.Is(t => t.Issues.Where(i => i.Data.ContainsKey("stepNumber") && i.Data.ContainsKey("logFileLineNumber") && i.Type == IssueType.Warning).Count() == 1)), Times.AtLeastOnce); + jobServerQueue.Verify(x => x.QueueTimelineRecordUpdate(It.IsAny(), It.Is(t => t.Issues.Where(i => i.Data.ContainsKey("stepNumber") && i.Data.ContainsKey("logFileLineNumber") && i.Type == IssueType.Notice).Count() == 1)), Times.AtLeastOnce); + } + } + [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")]