KirillOsenkov / MSBuildStructuredLog

A logger for MSBuild that records a structured representation of executed targets, tasks, property and item values.
MIT License
1.41k stars 188 forks source link

ArgumentNullException when running on Ubuntu in GitHub Actions #775

Closed pascalberger closed 2 months ago

pascalberger commented 2 months ago

I'm using MsBuild.StructuredLogger in a Cake addin (Cake.Issues) for parsing binary logs.

When writing bin log on GitHub Actions Ubuntu runner using StructuredLogger.dll and reading it afterwards the following exception occurs. Happens for .NET 6, .NET 7 and .NET 8. Same code works on other OS and Ubuntu on Azure Pipelines.

Error: System.ArgumentNullException: Value cannot be null. (Parameter 'format')
   at System.ArgumentNullException.Throw(String paramName)
   at System.String.FormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)
   at System.String.Format(String format, Object[] args)
   at Microsoft.Build.Logging.StructuredLogger.BuildEventArgsReader.FormatResourceStringIgnoreCodeAndKeyword(String resource, String[] arguments) in C:\MSBuildStructuredLog\src\StructuredLogger\BinaryLogger\BuildEventArgsReader.Viewer.cs:line 198
   at Microsoft.Build.Logging.StructuredLogger.BuildEventArgsReader.GetPropertyReassignmentMessage(String propertyName, String newValue, String previousValue, String location) in C:\MSBuildStructuredLog\src\StructuredLogger\BinaryLogger\BuildEventArgsReader.Viewer.cs:line 72
   at Microsoft.Build.Logging.StructuredLogger.BuildEventArgsReader.ReadPropertyReassignmentEventArgs() in C:\MSBuildStructuredLog\src\StructuredLogger\BinaryLogger\BuildEventArgsReader.cs:line 1276
   at Microsoft.Build.Logging.StructuredLogger.BuildEventArgsReader.ReadBuildEventArgs(BinaryLogRecordKind recordKind) in C:\MSBuildStructuredLog\src\StructuredLogger\BinaryLogger\BuildEventArgsReader.cs:line 329
   at Microsoft.Build.Logging.StructuredLogger.BuildEventArgsReader.Read() in C:\MSBuildStructuredLog\src\StructuredLogger\BinaryLogger\BuildEventArgsReader.cs:line 246
   at Microsoft.Build.Logging.StructuredLogger.BinLogReader.ReadRecordsFromDecompressedStream(BuildEventArgsReader reader, Boolean includeAuxiliaryRecords)+MoveNext() in C:\MSBuildStructuredLog\src\StructuredLogger\BinaryLogger\BinLogReader.cs:line 440
   at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()
   at Cake.Issues.MsBuild.LogFileFormat.BinaryLogFileFormat.ReadIssues(MsBuildIssuesProvider issueProvider, IRepositorySettings repositorySettings, MsBuildIssuesSettings issueProviderSettings) in /_/src/Cake.Issues.MsBuild/LogFileFormat/BinaryLogFileFormat.cs:line 29
   at Cake.Issues.BaseMultiFormatIssueProvider`2.InternalReadIssues() in /_/src/Cake.Issues/BaseMultiFormatIssueProvider.cs:line 28
   at Cake.Issues.BaseIssueProvider.ReadIssues() in /_/src/Cake.Issues/BaseIssueProvider.cs:line 31
   at Cake.Issues.IssuesReader.ReadIssues() in /_/src/Cake.Issues/IssuesReader.cs:line 55
   at Cake.Issues.Aliases.ReadIssues(ICakeContext context, IEnumerable`1 issueProviders, IReadIssuesSettings settings) in /_/src/Cake.Issues/Aliases.ReadIssues.cs:line 185
   at Cake.Issues.Aliases.ReadIssues(ICakeContext context, IIssueProvider issueProvider, IReadIssuesSettings settings) in /_/src/Cake.Issues/Aliases.ReadIssues.cs:line 130
   at Cake.Issues.Aliases.ReadIssues(ICakeContext context, IIssueProvider issueProvider, DirectoryPath repositoryRoot) in /_/src/Cake.Issues/Aliases.ReadIssues.cs:line 43
   at Submission#0.ReadIssues(IIssueProvider issueProvider, DirectoryPath repositoryRoot)
   at Submission#0.<<Initialize>>b__0_1(BuildData data)
   at Cake.Core.CakeTaskBuilderExtensions.<>c__DisplayClass37_0`1.<Does>b__0(ICakeContext _, TData data) in C:\projects\cake\src\Cake.Core\CakeTaskBuilder.Execution.cs:line 43
   at Cake.Core.CakeTaskBuilderExtensions.<>c__DisplayClass42_0`1.<Does>b__0(ICakeContext context) in C:\projects\cake\src\Cake.Core\CakeTaskBuilder.Execution.cs:line 141
   at Cake.Core.CakeTaskBuilderExtensions.<>c__DisplayClass39_0.<Does>b__0(ICakeContext context) in C:\projects\cake\src\Cake.Core\CakeTaskBuilder.Execution.cs:line 81
   at Cake.Core.CakeTask.Execute(ICakeContext context) in C:\projects\cake\src\Cake.Core\CakeTask.cs:line 119
   at Cake.Core.DefaultExecutionStrategy.ExecuteAsync(CakeTask task, ICakeContext context) in C:\projects\cake\src\Cake.Core\DefaultExecutionStrategy.cs:line 69
   at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 318
   at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 341
   at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 353
   at Cake.Core.CakeEngine.RunTask(ICakeContext context, IExecutionStrategy strategy, CakeTask task, String target, Stopwatch stopWatch, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 254
   at Cake.Core.CakeEngine.RunTarget(ICakeContext context, IExecutionStrategy strategy, CakeTask[] orderedTasks, String target, Boolean exclusive, Stopwatch stopWatch, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 229
   at Cake.Core.CakeEngine.RunTargetAsync(ICakeContext context, IExecutionStrategy strategy, ExecutionSettings settings) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 199
   at Cake.Cli.BuildScriptHost`1.internalRunTargetAsync() in C:\projects\cake\src\Cake.Cli\Hosts\BuildScriptHost.cs:line 87
   at Cake.Cli.BuildScriptHost`1.RunTargetAsync(String target) in C:\projects\cake\src\Cake.Cli\Hosts\BuildScriptHost.cs:line 74
   at Cake.Core.Scripting.ScriptHost.RunTarget(String target) in C:\projects\cake\src\Cake.Core\Scripting\ScriptHost.cs:line 110
   at Submission#0.<<Initialize>>d__0.MoveNext()

Test case to reproduce this issue: https://github.com/cake-contrib/Cake.Issues/pull/515

The test case write a binary log file using StructuredLogger.dll: https://github.com/cake-contrib/Cake.Issues/blob/163bc3becb4f9cea49ebd1502c3c4c84018a351a/tests/Cake.Issues.MsBuild/script-runner/build.cake#L39C1-L46C15

Afterwards it read the generated binary log in a Cake Addin: https://github.com/cake-contrib/Cake.Issues/blob/163bc3becb4f9cea49ebd1502c3c4c84018a351a/src/Cake.Issues.MsBuild/LogFileFormat/BinaryLogFileFormat.cs#L29

Do you have any idea what might trigger the issue in this setup?

KirillOsenkov commented 2 months ago

Duplicate of #736

pascalberger commented 2 months ago

Sorry, missed that one. As mentioned Strings.Initialize() worked around the issue.

Thanks a lot!