我们有一个相当复杂的 Visual Studio 解决方案(57 个项目,其中 19 个是网站,几乎每次通过推送代码触发时都无法构建,但随后我们手动触发构建并在重试时构建就好了。
该解决方案包含 57 个项目,其中 19 个是网站项目。(不是 Web 应用程序项目,没有 .csproj 文件。)其余的是类库和后台作业。19 个网站项目在 IIS 虚拟目录中构建成一个大型多功能内容管理系统。
构建服务器是 Hudson v1.395。用于构建的命令是:
"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.com" "SolutionName.sln" /rebuild Debug
当构建失败时,它总是在完全相同的网站项目上这样做,并带有完全相同的消息:
------ Rebuild All started: Project: C:\...\WebsiteName\, Configuration: Debug Any CPU ------
Validating Web Site
: Build (web): The application domain in which the thread was running has been unloaded.
Validation Complete
对此邮件的Google 搜索目前没有多大帮助。此链接最接近实际问题,但没有解决方案。显然,我们不会在构建期间更改任何解决方案文件,因为它发生在构建服务器上。
当它失败时,我们手动触发构建,并且我们得到了我们期望的结果(抱歉,已编辑):
------ Rebuild All started: Project: C:\...\News2\, Configuration: Debug Any CPU ------
Validating Web Site
Building directory '/WebsiteName/Dir1/Dir2/'.
Building directory '/WebsiteName/'.
Building directory '/WebsiteName/Dir3/'.
// 22 more but you get the point
// A few warnings caused by our own use of the ObsoleteAttribute, nothing to be concerned about
Validation Complete
什么可能导致此应用程序域卸载消息?
其他一些注意事项:
- 我们认为这可能是 Hudson 内存不足,因为我们确实观察到 java 大量泄漏它。因此,我们添加了一项任务,每天早上 6 点重启 Hudson 服务。即使有了这个以及在构建过程中准备好使用的大量可用内存,它仍然失败了。
- 推送到同一个存储库还会同时构建一个更简单(只有 22 个项目,没有网站项目)的解决方案。那个总是成功的。此外,手动触发它们同时运行成功。
- 我知道我们应该升级 Hudson,但这始终是我们似乎从来没有时间进行的次要项目之一。无论如何,我相当强烈地认为这是 Visual Studio / MSBuild 问题,而不是 Hudson 问题。
编辑 1:MSBuild
MSBuild 的问题在于有很多与 Visual Studio 中的构建不同的小怪癖。解决方案在开发人员机器上的 Visual Studio 中编译然后在构建服务器上失败是非常令人沮丧的。甚至 msbuild 的输出也与我们的开发人员在他们的构建输出窗口中看到的完全不同(一方面更冗长)。是否有其他命令行标志使 MSBuild 输出更符合您在 Visual Studio 构建窗口中获得的内容?
还有其他尴尬的事情。如果您碰巧有一个与项目同名的解决方案文件夹,MSBuild 会引发错误,但 Visual Studio 可以很好地处理它。这些是真正让你拔头发的怪癖。