64

观察:

  • 在我们的 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`
4

3 回答 3

78

经过大量的挖掘并尝试了各种没有效果的事情后,我最终创建了一个新的最小解决方案,它重现了这个问题而几乎没有其他事情发生。这个问题原来是由 msbuild 的多核并行化 - 'm' 参数引起的。

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

以下帖子很有帮助:

修复:

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

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

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

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

于 2014-02-01T10:22:10.727 回答
0

我有一段时间遇到同样的问题,经过一些挖掘后构建需要 6 分钟以上才能完成我发现我们的节点重用错误所以添加 /m:4 /nr:false 立即解决了我的问题

于 2019-02-14T22:24:31.043 回答