Let the IssueMetadata class be the mechanism for specifying log message overrides.

This commit is contained in:
John Wesley Walker III
2023-01-17 13:43:04 +00:00
parent 87ababb858
commit efc0a92cc7
6 changed files with 55 additions and 51 deletions

View File

@@ -648,7 +648,7 @@ namespace GitHub.Runner.Worker
var filteredDictionaryEntries = command.Properties
.Where(kvp => !string.Equals(kvp.Key, keyToExclude, StringComparison.OrdinalIgnoreCase));
var metadata = new IssueMetadata(issueCategory, false, filteredDictionaryEntries);
var metadata = new IssueMetadata(issueCategory, false, null, filteredDictionaryEntries);
var issue = context.CreateIssue(this.Type, command.Data, metadata, true);
context.AddIssue(issue);
}

View File

@@ -620,11 +620,16 @@ namespace GitHub.Runner.Worker
if (!string.IsNullOrEmpty(wellKnownTag))
{
if (writeToLog && !string.IsNullOrEmpty(refinedMessage))
if (writeToLog)
{
long logLineNumber = Write(wellKnownTag, refinedMessage);
//Note that ::Write() has it's own secret masking logic
string logText = metadata?.LogMessageOverride ?? result.Message;
if (!string.IsNullOrEmpty(logText))
{
long logLineNumber = Write(wellKnownTag, logText);
result.Data["logFileLineNumber"] = logLineNumber.ToString();
}
}
if (previousCountForIssueType.GetValueOrDefault(0) < _maxIssueCount)
{
_record.Issues.Add(result);
@@ -1192,7 +1197,7 @@ namespace GitHub.Runner.Worker
// Do not add a format string overload. See comment on ExecutionContext.Write().
public static void InfrastructureError(this IExecutionContext context, string message)
{
var metadata = new IssueMetadata(null, true, Enumerable.Empty<KeyValuePair<string, string>>());
var metadata = new IssueMetadata(null, true, null, Enumerable.Empty<KeyValuePair<string, string>>());
var issue = context.CreateIssue(IssueType.Error, message, metadata, true);
context.AddIssue(issue);
}

View File

@@ -98,7 +98,7 @@ namespace GitHub.Runner.Worker.Handlers
var matchers = _matchers;
// Strip color codes
var stripped = line.Contains(_colorCodePrefix) ? _colorCodeRegex.Replace(line, string.Empty) : line;
var refinedLine = line.Contains(_colorCodePrefix) ? _colorCodeRegex.Replace(line, string.Empty) : line;
foreach (var matcher in matchers)
{
@@ -108,7 +108,7 @@ namespace GitHub.Runner.Worker.Handlers
// Match
try
{
match = matcher.Match(stripped);
match = matcher.Match(refinedLine);
break;
}
catch (RegexMatchTimeoutException ex)
@@ -116,7 +116,7 @@ namespace GitHub.Runner.Worker.Handlers
if (attempt < _maxAttempts)
{
// Debug
_executionContext.Debug($"Timeout processing issue matcher '{matcher.Owner}' against line '{stripped}'. Exception: {ex}");
_executionContext.Debug($"Timeout processing issue matcher '{matcher.Owner}' against line '{refinedLine}'. Exception: {ex}");
}
else
{
@@ -324,7 +324,7 @@ namespace GitHub.Runner.Worker.Handlers
_executionContext.Debug($"Dropping file value '{match.File}' and fromPath value '{match.FromPath}'. Exception during validation: {ex}");
}
var metadata = new IssueMetadata(null, false, issueData);
var metadata = new IssueMetadata(null, false, match.SourceText, issueData);
var issue = _executionContext.CreateIssue(issueType, match.Message, metadata, true);
return issue;
}

View File

@@ -8,6 +8,28 @@ namespace GitHub.Runner.Worker
{
public delegate void OnMatcherChanged(object sender, MatcherChangedEventArgs e);
public sealed class IssueMetadata
{
public IssueMetadata(string key, string value)
: this(null, false, null, new []{ KeyValuePair.Create(key, value) })
{
}
public IssueMetadata(string category, bool infrastructureIssue, string logMessageOverride, IEnumerable<KeyValuePair<string, string>> data)
{
this.Category = category;
this.IsInfrastructureIssue = infrastructureIssue;
this.LogMessageOverride = logMessageOverride;
this.Data = data;
}
public readonly string Category;
public readonly bool IsInfrastructureIssue;
public readonly string LogMessageOverride;
public readonly IEnumerable<KeyValuePair<string, string>> Data;
}
public sealed class MatcherChangedEventArgs : EventArgs
{
public MatcherChangedEventArgs(IssueMatcherConfig config)
@@ -69,7 +91,7 @@ namespace GitHub.Runner.Worker
if (regexMatch.Success)
{
return new IssueMatch(null, pattern, regexMatch.Groups, DefaultSeverity);
return new IssueMatch(line, null, pattern, regexMatch.Groups, DefaultSeverity);
}
return null;
@@ -110,13 +132,13 @@ namespace GitHub.Runner.Worker
}
// Return
return new IssueMatch(runningMatch, pattern, regexMatch.Groups, DefaultSeverity);
return new IssueMatch(line, runningMatch, pattern, regexMatch.Groups, DefaultSeverity);
}
// Not the last pattern
else
{
// Store the match
_state[i] = new IssueMatch(runningMatch, pattern, regexMatch.Groups);
_state[i] = new IssueMatch(line, runningMatch, pattern, regexMatch.Groups);
}
}
// Not matched
@@ -184,8 +206,9 @@ namespace GitHub.Runner.Worker
public sealed class IssueMatch
{
public IssueMatch(IssueMatch runningMatch, IssuePattern pattern, GroupCollection groups, string defaultSeverity = null)
public IssueMatch(string sourceText, IssueMatch runningMatch, IssuePattern pattern, GroupCollection groups, string defaultSeverity = null)
{
SourceText = sourceText;
File = runningMatch?.File ?? GetValue(groups, pattern.File);
Line = runningMatch?.Line ?? GetValue(groups, pattern.Line);
Column = runningMatch?.Column ?? GetValue(groups, pattern.Column);
@@ -200,6 +223,8 @@ namespace GitHub.Runner.Worker
}
}
public string SourceText { get; }
public string File { get; }
public string Line { get; }

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using GitHub.Services.Common;
namespace GitHub.DistributedTask.WebApi
{
@@ -14,48 +15,25 @@ namespace GitHub.DistributedTask.WebApi
string this[string key] { get; }
}
public class IssueMetadata
{
public IssueMetadata(string key, string value)
: this(null, false, new []{ KeyValuePair.Create(key, value) })
{
}
public IssueMetadata(string category, bool infrastructureIssue, IEnumerable<KeyValuePair<string, string>> data)
{
this.Category = category;
this.IsInfrastructureIssue = infrastructureIssue;
this.Data = data;
}
public readonly string Category;
public readonly bool IsInfrastructureIssue;
public readonly IEnumerable<KeyValuePair<string, string>> Data;
}
[DataContract]
public class Issue : IReadOnlyIssue
{
public Issue()
: this(null)
{
}
private Issue(Issue original)
{
m_data = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);
if (original != null)
{
this.Type = original.Type;
this.Category = original.Category;
this.Message = original.Message;
this.IsInfrastructureIssue = original.IsInfrastructureIssue;
if (original.m_data != null)
{
foreach (var item in original.m_data)
{
this.Data.Add(item);
}
this.Data.AddRange(original.Data);
}
}
@@ -91,10 +69,6 @@ namespace GitHub.DistributedTask.WebApi
{
get
{
if (m_data == null)
{
m_data = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);
}
return m_data;
}
}

View File

@@ -983,8 +983,8 @@ namespace GitHub.Runner.Common.Tests.Worker
{
_onMatcherChanged = handler;
});
_executionContext.Setup(x => x.CreateIssue(It.IsAny<DTWebApi.IssueType>(), It.IsAny<string>(), It.IsAny<DTWebApi.IssueMetadata>(), It.IsAny<bool>()))
.Returns((DTWebApi.IssueType type, string message, DTWebApi.IssueMetadata metadata, bool writeToLog) =>
_executionContext.Setup(x => x.CreateIssue(It.IsAny<DTWebApi.IssueType>(), It.IsAny<string>(), It.IsAny<IssueMetadata>(), It.IsAny<bool>()))
.Returns((DTWebApi.IssueType type, string message, IssueMetadata metadata, bool writeToLog) =>
{
var result = new DTWebApi.Issue()
{