卡住不活动的msbuild.exe进程,lockingStylecop.dll,Nuget AccessViolationException和CIbuild立相互冲突的奥秘

观察:

  • 在我们的Jenkins构build服务器上,我们看到大量的msbuild.exe进程(〜100)在作业完成后大约20mb的内存使用率和0%的CPU活动。

  • 使用不同版本的stylecop构build时断时续地失败:

    workspace\packages\StyleCop.MSBuild.4.7.41.0\tools\StyleCop.targets(109,7): error MSB4131: The "ViolationCount" parameter is not supported by the "StyleCopTask" task. Verify the parameter exists on the task, and it is a gettable public instance property.

  • Nuget.exe 间歇性退出时出现以下访问冲突错误(0x0000005):

    .\workspace\.nuget\nuget install .\workspace\packages.config -o .\workspace\packages" exited with code -1073741819.

MsBuild通过Jenkins Matrix作业以下列方式启动,启用“BuildInParallel”:

  `msbuild /t:%Targets% /m /p:Client=%Client%;LOCAL_BUILD=%LOCAL_BUILD%;BUILD_NUMBER=%BUILD_NUMBER%; JOB_NAME=%JOB_NAME%;Env=%Env%;Configuration=%Configuration%;Platform=%Platform%; Clean=%Clean%; %~dp0\_Jenkins\Build.proj` 

经过大量的挖掘,尝试各种不可能的事情之后,我最终创build了一个新的最小化的解决scheme,这个解决scheme在很less发生的情况下再现了这个问题。 问题原来是由msbuild的多核并行 – “m”参数造成的。

  • 'm'参数告诉msbuild产生“节点”,这些将在构build结束后保持活动状态,然后由新构build重新使用!
  • StyleCop“ViolationCount”错误是由给定的构build重新使用来自另一个构build工作区的旧版本stylecop.dll导致的,其中ViolationCount不受支持。 这很奇怪,因为CI工作区只包含新版本。 看起来,一旦StyleCop.dll被加载到一个给定的MsBuild节点,它将保持加载下一个版本。 我只能假设这是因为StyleCop加载到节点进程的某种单身? 这也解释了构build之间的文件locking。
  • Nuget访问冲突崩溃现在已经消失(没有其他更改),所以显然与上述节点重用问题有关。
  • 由于“m”参数默认为核心数量,我们看到在构build服务器上为给定作业创build了24个 msbuild实例。

以下post是有帮助的:

修正:

  • 添加行set MSBUILDDISABLENODEREUSE=1到启动msbuild的batch file
  • /m:4 /nr:false启动msbuild
  • 'nr'paremeter告诉msbuild不使用“节点重用” – 所以msbuild实例在构build完成后closures,不再相互冲突 – 导致上述错误。
  • 'm'参数设置为4,以阻止每个作业产生太多的节点

我遇到过同样的问题。 我发现一个老参考是在csproj文件

 <PropertyGroup> <StyleCopMSBuildTargetsFile>..\packages\StyleCop.MSBuild.4.7.48.0\tools\StyleCop.targets</StyleCopMSBuildTargetsFile> 

另外,我closures了visual studio后删除了与sln文件位于同一文件夹中的整个“Packages”文件夹。 它触发VS重build文件夹,释放旧版本stylecop的caching