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

时间:2012-11-22 10:18:17

标签: msbuild nuget stylecop

观察:

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

  • 使用不同版本的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`

3 个答案:

答案 0 :(得分:69)

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

  • 'm'参数告诉msbuild生成“nodes”,这些将在构建结束后保持活动状态,然后由新版本重新使用!
  • 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 :(得分:1)

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

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

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

的缓存

答案 2 :(得分:0)

一段时间以来,我遇到了同样的问题,经过一些挖掘,构建过程花费了6分钟以上的时间,我发现这是节点重用错误,因此添加了/ m:4 / nr:false立即修复了问题