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

Posted

技术标签:

【中文标题】卡住不活动的 msbuild.exe 进程、锁定 Stylecop.dll、Nuget AccessViolationException 和 CI 构建相互冲突的奥秘【英文标题】:The mystery of stuck inactive msbuild.exe processes, locked Stylecop.dll, Nuget AccessViolationException and CI builds ***ing with each other 【发布时间】:2012-11-10 17:16:19 【问题描述】:

观察:

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

【问题讨论】:

投反对票,不予置评。谢谢! 赞成和喜爱,因为这类事情是 i) 在开发工作中遇到的最烦人 类型的问题,并且 ii) 最不可能通过 google 轻松解决。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

以下帖子很有帮助:

msbuild.exe staying open, locking files http://www.hanselman.com/blog/FasterBuildsWithMSBuildUsingParallelBuildsAndMulticoreCPUs.aspx http://stylecop.codeplex.com/discussions/394606 https://github.com/Glimpse/Glimpse/issues/115 http://msdn.microsoft.com/en-us/library/vstudio/ms164311.aspx

修复:

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

【讨论】:

我得到了这个确切的行为,但在a different task。不幸的是,禁用节点重用对我不起作用:( 我也遇到了这个确切的错误。/m:4 /nr:false 非常适合我。 可以在VS2012中设置这个msbuild参数吗? (即 /m 和 /nr) 我面临的情况要简单得多。运行VS,留下很多msbuild进程。 env 技巧解决了这个问题。 设置 MSBUILDDISABLENODEREUSE=1 并将 /nr:false 传递给 msbuild.exe 是否多余?你能做一个或另一个吗?

以上是关于卡住不活动的 msbuild.exe 进程、锁定 Stylecop.dll、Nuget AccessViolationException 和 CI 构建相互冲突的奥秘的主要内容,如果未能解决你的问题,请参考以下文章

预构建 MSBuild 任务以更新与构建的 exe 不同步的 AssemblyInfo

PowerShell - 启动进程和命令行开关

cmake cmake MSBUILD : error MSB1009: 项目文件不存在 or MSBuild.exe not find !

cmake cmake MSBUILD : error MSB1009: 项目文件不存在 or MSBuild.exe not find !

SonarQube.Scanner.MSBuild.exe:如何指定sonar.sources?

Bamboo 随机运行不同版本的 msbuild.exe 并构建失败