卡住不动的msbuild.exe进程、被锁定的Stylecop.dll、Nuget AccessViolationException和CI构建之间的冲突之谜

66

观察结果:

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

  • 使用不同版本的stylecop进行构建会间歇性地失败:

    workspace\packages\StyleCop.MSBuild.4.7.41.0\tools\StyleCop.targets(109,7): error MSB4131: “ViolationCount”参数不受“StyleCopTask”任务支持。 请验证该任务上是否存在参数,以及它是否是可获取的公共实例属性。

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

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

MsBuild通过Jenkins矩阵作业以以下方式启动,启用“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`

1
没有评论的负评。谢谢! - Jon Rea
5
已点赞和收藏,因为这种问题是开发工作中最令人讨厌的问题之一,同时也是最不可能通过谷歌轻松解决的问题。 - Tom W
3个回答

78

经过大量的挖掘和尝试各种方法却毫无效果,最终我创建了一个新的极简解决方案,仅包含很少的其他内容,从而重现了问题。问题原来是由 msbuild 的多核并行化 - 'm' 参数引起的。

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

以下帖子很有帮助:

修复方案:

请在启动msbuild的批处理文件中添加一行set MSBUILDDISABLENODEREUSE=1
使用/m:4 /nr:false参数启动msbuild。
'nr'参数告诉msbuild不要使用“节点重用”,因此msbuild实例在构建完成后被关闭,不再互相冲突,从而避免了上述错误。
'm'参数设置为4,以防止每个作业生成过多的节点。

我遇到了完全相同的问题,但是发生在另一个任务上。不幸的是,禁用节点重用对我没有起作用 :( - julealgon
4
我也遇到了完全相同的错误。/m:4 /nr:false 对我来说非常完美。 - Mangesh
4
在VS2012中设置这些msbuild参数是否可能?(即/m和/nr) - Belurd
请问您能否澄清如何/在哪里实际应用修复程序? - Evgeny Lukiyanov
2
设置MSBUILDDISABLENODEREUSE=1并将/nr:false传递给msbuild.exe是多余的吗?你可以只做其中之一吗? - Antonio Maiorano
显示剩余2条评论

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 立即解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接