卡住不活动的msbuild.exe进程,lockingStylecop.dll,Nuget AccessViolationException和CIbuild立相互冲突的奥秘
观察:
-
在我们的Jenkins构build服务器上,我们看到大量的msbuild.exe进程(〜100)在作业完成后大约20mb的内存使用率和0%的CPU活动。
-
使用不同版本的stylecop构build时断时续地失败:
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`
经过大量的挖掘,尝试各种不可能的事情之后,我最终创build了一个新的最小化的解决scheme,这个解决scheme在很less发生的情况下再现了这个问题。 问题原来是由msbuild的多核并行 – “m”参数造成的。
- 'm'参数告诉msbuild产生“节点”,这些将在构build结束后保持活动状态,然后由新构build重新使用!
- StyleCop“ViolationCount”错误是由给定的构build重新使用来自另一个构build工作区的旧版本stylecop.dll导致的,其中ViolationCount不受支持。 这很奇怪,因为CI工作区只包含新版本。 看起来,一旦StyleCop.dll被加载到一个给定的MsBuild节点,它将保持加载下一个版本。 我只能假设这是因为StyleCop加载到节点进程的某种单身? 这也解释了构build之间的文件locking。
- Nuget访问冲突崩溃现在已经消失(没有其他更改),所以显然与上述节点重用问题有关。
- 由于“m”参数默认为核心数量,我们看到在构build服务器上为给定作业创build了24个 msbuild实例。
以下post是有帮助的:
- 保持打开,locking文件msbuild.exe
- 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的batch file - 用
/m:4 /nr:false
启动msbuild - 'nr'paremeter告诉msbuild不使用“节点重用” – 所以msbuild实例在构build完成后closures,不再相互冲突 – 导致上述错误。
- 'm'参数设置为4,以阻止每个作业产生太多的节点
我遇到过同样的问题。 我发现一个老参考是在csproj文件
<PropertyGroup> <StyleCopMSBuildTargetsFile>..\packages\StyleCop.MSBuild.4.7.48.0\tools\StyleCop.targets</StyleCopMSBuildTargetsFile>
另外,我closures了visual studio后删除了与sln文件位于同一文件夹中的整个“Packages”文件夹。 它触发VS重build文件夹,释放旧版本stylecop的caching
- MSBuild ItemGroup,不包括.svn目录和文件
- 我可以在Visual Studio中设置LARGEADDRESSAWARE吗?
- 构buildconfiguration:混合平台VS任何CPU
- obj目录中的* .dll.licenses文件不是用TeamCity中的msbuild创build的
- 你可以防止MSBuild.exe运行生成事件?
- Visual Studio传递给MSBuild的参数是什么?
- TFS构build服务器 – CSC:致命错误CS2008:未指定input
- 我可以得到一个“有时可移植的”类库项目加载在Visual Studio Express?
- MSBUILD:错误MSB1008:只能指定一个项目