停滞的非活动msbuild.exe进程、锁定的Stylecop.dll、Nuget AccessViolationException和CI构建相互冲突的奥秘

停滞的非活动msbuild.exe进程、锁定的Stylecop.dll、Nuget AccessViolationException和CI构建相互冲突的奥秘,msbuild,nuget,stylecop,Msbuild,Nuget,Stylecop,意见: 在我们的Jenkins build服务器上,我们看到很多msbuild.exe进程(~100)在作业完成后挂起,内存使用量约为20mb,CPU活动率为0% 使用不同版本的stylecop的生成间歇性失败: workspace\packages\StyleCop.MSBuild.4.7.41.0\tools\StyleCop.targets(109,7): 错误MSB4131:“StyleCopTask”任务不支持“ViolationCount”参数。 验证该参数是否存在于任务中,并且它

意见:

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

  • 使用不同版本的stylecop的生成间歇性失败:

    workspace\packages\StyleCop.MSBuild.4.7.41.0\tools\StyleCop.targets(109,7):
    错误MSB4131:“StyleCopTask”任务不支持“ViolationCount”参数。
    验证该参数是否存在于任务中,并且它是可获取的公共实例属性。

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

    \workspace\.nuget\nuget安装。\workspace\packages.config-o。\workspace\packages”
    已退出,代码为-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`
在进行了大量的挖掘和尝试之后,我最终创建了一个新的最小解决方案,该解决方案在几乎没有其他问题的情况下重现了该问题。该问题最终由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不要使用“节点重用”(Node Reuse)——因此msbuild实例在生成完成后关闭,不再相互冲突——从而导致上述错误
  • “m”参数设置为4以停止每个作业生成过多节点

    • 我也有同样的问题。我在csproj文件中找到了一个旧的参考资料

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


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

      我有一段时间遇到了同样的问题,在一些挖掘之后,构建需要6分钟才能完成,我发现我们的It节点重用错误,因此添加/m:4/nr:false立即修复我的问题

      没有任何评论的否决票。谢谢因为这类事情是i)开发工作中最烦人的问题,ii)最不可能用谷歌轻易解决的问题。我得到了这种确切的行为,但继续。不幸的是,禁用节点重用对我不起作用:(我也遇到了这个确切的错误。/m:4/nr:false对我来说非常有效。是否可以在VS2012中设置此msbuild参数?(即。/m和/nr)我面临的情况要简单得多。运行VS,留下许多msbuild进程。env技巧解决了这个问题。设置MSBUILDDISABLENODEREUSE=1并将/nr:false传递给msbuild.exe是否冗余?是否可以执行其中一项操作?