FAKE icon indicating copy to clipboard operation
FAKE copied to clipboard

Update MSBuild.StructuredLogger to latest

Open KirillOsenkov opened this issue 2 years ago • 17 comments

I'm not sure how this works, but this seems to be using an old version of the MSBuild.StructuredLogger package:

https://github.com/fsprojects/FAKE/blob/13e30330cae0597aed6154a95a06d21716b18de3/paket.lock#L805

The latest version is: https://www.nuget.org/packages/MSBuild.StructuredLogger/2.1.814

Without the latest version, builds fail with:

Unhandled exception. Fake.Core.BuildFailedException: Target 'PrepareMSBuildTests' failed.
 ---> System.AggregateException: One or more errors occurred. (Unsupported log file format. Latest supported version is 14, the log file has version 15.)
 ---> System.NotSupportedException: Unsupported log file format. Latest supported version is 14, the log file has version 15.
   at Microsoft.Build.Logging.StructuredLogger.BinLogReader.ReadRecordsFromDecompressedStream(Stream decompressedStream)+MoveNext() in C:\MSBuildStructuredLog\src\StructuredLogger\BinaryLogger\BinLogReader.cs:line 218
   at Microsoft.FSharp.Collections.Internal.IEnumerator.choose@171.System.Collections.IEnumerator.MoveNext() in D:\workspace\_work\1\s\src\fsharp\FSharp.Core\seq.fs:line 178
   at Microsoft.FSharp.Collections.SeqModule.ToList[T](IEnumerable`1 source)
   at Fake.DotNet.MSBuildBinLog.getErrorsAndWarnings(String binLogFilePath)
   at Fake.DotNet.MSBuild.handleAfterRun(String command, FSharpOption`1 binLogPath, Int32 exitCode, String project)
   at Fake.DotNet.DotNet.pack(FSharpFunc`2 setParams, String project)
   at Build.prepareMSBuildTests[a](a _arg1) in C:\Farkle\eng\build.fs:line 217
   at [email protected](TargetParameter arg00@)
   at Fake.Core.TargetModule.runSimpleInternal(TargetContext context, Target target)
   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---
   at Fake.Core.TargetModule.raiseIfError(OptionalTargetContext context)
   at Fake.Core.TargetModule.runOrDefaultWithArguments(String defaultTarget)
   at Build.main(String[] argv) in C:\Farkle\eng\build.fs:line 506

KirillOsenkov avatar Apr 21 '23 20:04 KirillOsenkov

Welcome to the FAKE community! Thank you so much for creating your first issue and therefore improving the project!

github-actions[bot] avatar Apr 21 '23 20:04 github-actions[bot]

FAKE automatically creates binlogs for most builds that are orchestrated through FAKE, and then reads the warnings/errors directly from the binlog to prevent any parsing issues. As a result, it needs to keep bumped! It should be no impact to the rest of FAKE to bump this, so I'd encourage @yazeedobaid to do so at the earliest opportunity!

baronfel avatar Apr 21 '23 22:04 baronfel

How do you guys specify a version? Where does 2.1.545 come from in paket.lock?

I'm hitting this problem while building https://github.com/dotnet/msbuild/issues/8478#issuecomment-1438978755 with FAKE. I searched the Farkle repo, and I only found these occurrences:

image

Doesn't seem to be the "source" of where this value is flowing from?

KirillOsenkov avatar Apr 21 '23 22:04 KirillOsenkov

As a workaround, you can just reference the most recent version of MSBuild.StructuredLogger from your project to force it to bump the transitive dependency.

gtbuchanan avatar May 16 '23 15:05 gtbuchanan

The latest version (2.2.206) version of MSBuild.StructuredLogger fails with a ArgumentNullException. It seems it's due to localized string not being initialized.

This can be fixed by adding the following line at the start of build script:

Microsoft.Build.Logging.StructuredLogger.Strings.Initialize()

This could be done directly in Fake to avoid the problem

thinkbeforecoding avatar Feb 15 '24 14:02 thinkbeforecoding

do you have the full callstack? mind filing an issue on https://github.com/KirillOsenkov/MSBuildStructuredLog/issues/new

I want to fix this (and I thought I did)

KirillOsenkov avatar Feb 15 '24 14:02 KirillOsenkov

In addition, for the May release we should finally ship a version of binlogs that are forward-compatible, so you could update to the version to be released then and then not have to update ever again - until/unless you need support for a new kind of message that is introduced. But since FAKE's binlog integration is very simple (just warnings/errors) that should be enough for quite a long time.

baronfel avatar Feb 15 '24 15:02 baronfel

I tried to update the structured log lib to a newer version in the FAKE build a while ago and it caused the integration tests to fail, possibly because it depends on Microsoft.Build.Framework 17.5.0 which doesn't have a .NET 6 TFM anymore, so I'm not sure what the procedure to update here should be as long as everything is here is built around .NET 6.0?

Numpsy avatar Feb 18 '24 14:02 Numpsy

Is this the issue you're running into? https://github.com/KirillOsenkov/MSBuildStructuredLog/issues/692

KirillOsenkov avatar Feb 18 '24 15:02 KirillOsenkov

Basically if things fail we need to investigate and fix them.

KirillOsenkov avatar Feb 18 '24 15:02 KirillOsenkov

Is this the issue you're running into? KirillOsenkov/MSBuildStructuredLog#692

it was something like that (the CI build attempt from here seems to have expired and deleted the logs though).

Also sounds similar to #2722

Numpsy avatar Feb 18 '24 16:02 Numpsy

@KirillOsenkov FYI

I think I'm running in the same issue here

I have added <PackageVersion Include="MSBuild.StructuredLogger" Version="2.2.206" /> to fix aforementioned error, and it runs fine locally on my dev machine. However in the CI it fails with

Unhandled exception. Fake.Core.BuildFailedException: Target 'Build' failed.
 ---> System.AggregateException: One or more errors occurred. (Value cannot be null. (Parameter 'format'))
 ---> 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 Microsoft.FSharp.Collections.Internal.IEnumerator.choose@171.System.Collections.IEnumerator.MoveNext() in D:\a\_work\1\s\src\fsharp\FSharp.Core\seq.fs:line 178
   at Microsoft.FSharp.Collections.SeqModule.ToList[T](IEnumerable`1 source)
   at Fake.DotNet.MSBuildBinLog.getErrorsAndWarnings(String binLogFilePath) in D:\a\FAKE\FAKE\src\app\Fake.DotNet.MSBuild\BinLog.fs:line 48
   at Fake.DotNet.MSBuild.handleAfterRun(String command, FSharpOption`1 binLogPath, Int32 exitCode, String project) in D:\a\FAKE\FAKE\src\app\Fake.DotNet.MSBuild\MSBuild.fs:line 957
   at Fake.DotNet.DotNet.build(FSharpFunc`2 setParams, String project) in D:\a\FAKE\FAKE\src\app\Fake.DotNet.Cli\DotNet.fs:line 1654
   at Build.build[a](a _arg1) in /home/vsts/work/1/s/src/Build/Build.fs:line 60
   at [email protected](TargetParameter arg00@)
   at Fake.Core.TargetModule.runSimpleInternal(TargetContext context, Target target) in D:\a\FAKE\FAKE\src\app\Fake.Core.Target\Target.fs:line 371
   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---
   at Fake.Core.TargetModule.raiseIfError(OptionalTargetContext context) in D:\a\FAKE\FAKE\src\app\Fake.Core.Target\Target.fs:line 1319
   at Fake.Core.TargetModule.runOrDefaultWithArguments(String defaultTarget) in D:\a\FAKE\FAKE\src\app\Fake.Core.Target\Target.fs:line 1542
   at Build.main(String[] argv) in /home/vsts/work/1/s/src/Build/Build.fs:line 341

Call site:

let build _ =
    solutionFile
    |> DotNet.build <--- line 60
        (fun p ->
            { p with 
                Configuration = configuration
                }) 

EDIT: the workaround by @thinkbeforecoding does work

anpin avatar Apr 17 '24 22:04 anpin

my apologies, I haven't gotten the time to get to this. For now please use Strings.Initialize() and I'll fix it properly at some point later.

KirillOsenkov avatar Apr 18 '24 00:04 KirillOsenkov