11

我们有一个相当复杂的 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 可以很好地处理它。这些是真正让你拔头发的怪癖。

4

3 回答 3

6

我在 Hudson/Jenkins 上构建 C++ 时遇到了问题,这可能是相关的,如果您同时进行两个构建,那么可能会发生不好的事情。

这是因为 Hudson/Jenkins 将在构建结束时运行进程树杀手来清理进程,而 MsBuild/VisualStudio 将在构建之间共享一些公共进程。

我在 C++ 构建中遇到的实际问题表现为另一个错误:

fatal error C1090: PDB API call failed, 
error code '23' : '( 

问题在这里提出:

https://issues.jenkins-ci.org/browse/JENKINS-9104

关闭进程树杀手可能会解决您的问题。

于 2012-12-10T10:35:41.357 回答
2

我对 Hudson 或网站项目(我使用 TeamCity 和 Web 应用程序项目)不太熟悉,但我想我会抛出一些东西来看看它是否有帮助。

您是否尝试过直接使用 MSBuild 而不是使用 Visual Studio 来构建解决方案?该命令看起来像这样:

    %windir%\Microsoft.NET\Framework\<version>\MSBuild SolutionName.sln /t:Rebuild /p:configuration=debug

我注意到您没有在构建完成后将命令行开关传递给 Visual Studio 以关闭 /RunExit MSDN Link 那么 Visual Studio IDE 是否会在您的构建服务器上为每个构建打开而不是关闭?我可以看到 IDE 的多个实例打开了相同的解决方案,导致出现问题。

我建议尽可能使用 MSBuild 而不是 Visual Studio 来执行构建,除非您依赖 IDE 中的某些内容。您至少应该获得更快的构建时间,因为您不必加载 Visual Studio,它消除了构建过程中的一层复杂性。

希望这有帮助!

于 2012-05-09T02:01:35.690 回答
2

由于相同的签入而运行的另一个并发构建感觉它们是相关的。一个资源在我的构建过程中消失,而相关构建运行使我怀疑相关构建。

我知道你说过你可以手动同时运行它们,一切都很好。不过,对我来说,这闻起来像是一种比赛条件。尝试在较小的项目上禁用自动触发器并提交作为最终的健全性检查,以确保它不会把你弄乱。

我想如果你根本不怀疑,你就不会在你的帖子中提到它。排除这种情况。

于 2012-05-09T05:28:54.583 回答