Visual Studio网站构建在CI服务器上间歇性地失败

时间:2012-05-08 18:26:15

标签: visual-studio-2010 msbuild continuous-integration hudson build-automation

我们有一个相当复杂的Visual Studio解决方案(57个项目,其中19个是几乎每次都是通过推送代码触发而无法构建的网站,但随后我们手动触发构建并重试它构建得很好。< / p>

该解决方案包含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 Search for this message目前不太有帮助。 This link最接近实际问题,但没有解决方案。显然,我们在构建期间不会更改任何解决方案文件,因为它发生在构建服务器上。

当它失败时,我们会手动触发构建,我们会按预期得到(抱歉,编辑):

------ 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处理它就好了。这些怪癖真的会让你脱掉头发。

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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,它会在构建过程中消除一层复杂性。

希望这有帮助!

答案 2 :(得分:2)

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

我知道你说你可以手动同时运行它们,一切都很顺利。虽然它闻起来像是一种竞争条件。尝试禁用较小项目的自动触发器并作为最终的健全性检查,以确保它不会弄乱你。

我想如果你根本没有怀疑它,你就不会在帖子中提到它。出来的规则。