卡住非活动msbuild.exe进程,锁定Stylecop.dll,Nuget AccessViolationException和CI构建相互冲突的谜团

问题描述 投票:57回答:3

观察:

  • 在我们的Jenkins构建服务器上,我们看到很多msbuild.exe进程(~100)在作业完成后闲置,大约20mb内存使用率和0%CPU活动。
  • 使用不同版本的stylecop的构建间歇性地失败: 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`
msbuild nuget stylecop
3个回答
71
投票

在经过大量挖掘并尝试各种不起作用之后,我最终创建了一个新的最小解决方案,在很少有其他事情的情况下重现了这个问题。问题原因是由msbuild的多核并行化 - 'm'参数引起的。

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

以下帖子很有帮助:

修复:

  • 将行set MSBUILDDISABLENODEREUSE=1添加到启动msbuild的批处理文件中
  • 使用/m:4 /nr:false启动msbuild
  • 'nr'参数告诉msbuild不使用“节点重用” - 因此msbuild实例在构建完成后关闭并且不再相互冲突 - 导致上述错误。
  • 'm'参数设置为4以停止每个作业产生过多的节点

1
投票

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

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

另外,在关闭visual studio后,我删除了与sln文件位于同一文件夹中的整个“Packages”文件夹。它触发VS重建文件夹并放开旧版stylecop的缓存


0
投票

我有一段时间遇到同样的问题,经过一些挖掘后,构建需要花费6分钟才能完成我发现它的节点重用故障所以添加/ m:4 / nr:false立即修复我的问题

© www.soinside.com 2019 - 2024. All rights reserved.