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

Dav*_*ike 11 msbuild build-automation continuous-integration hudson visual-studio-2010

我们有一个相当复杂的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
Run Code Online (Sandbox Code Playgroud)

当构建失败时,它始终在完全相同的网站项目上执行此操作,并使用完全相同的消息:

------ 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
Run Code Online (Sandbox Code Playgroud)

目前,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
Run Code Online (Sandbox Code Playgroud)

什么可能导致此应用程序域卸载消息?

其他一些说明:

  • 我们认为这可能是Hudson内存耗尽,因为我们确实观察到Java泄漏了很多.因此,我们每天早上6点添加了重启Hudson服务的任务.即使有这个以及在构建期间准备好的可用内存量,它仍然失败了.
  • 推送到同一个存储库还可以同时构建更简单(只有22个项目,没有网站项目)的解决方案.那一个总是成功的.此外,手动触发它们同时运行成功.
  • 我知道我们应该升级哈德森,但这始终是我们似乎没有时间的那些反击项目之一.在任何情况下,我都非常强烈地认为这是一个Visual Studio/MSBuild问题,而不是Hudson问题.

编辑1:MSBuild

MSBuild的问题在于,有许多小怪癖与Visual Studio中的构建不同.对于在开发人员计算机上在Visual Studio中编译然后在构建服务器上失败的解决方案而言,这是非常令人沮丧的.甚至来自msbuild的输出与我们的开发人员在他们的构建输出窗口中看到的完全不同(一件事情更加冗长).是否有其他命令行标志使MSBuild输出更符合您在Visual Studio构建窗口中获得的内容?

还有其他一些事情也很尴尬.如果碰巧有一个名为与项目相同的解决方案文件夹,MSBuild会抛出一个错误,但Visual Studio处理它就好了.这些怪癖真的会让你脱掉头发.

pau*_*ulm 6

我遇到了Hudson/Jenkins上的C++构建问题,这可能是相关的,如果你有两个版本同时发生,那么可能会发生不好的事情.

这是因为Hudson/Jenkins将在构建结束时运行进程树杀手以清理进程,并且MsBuild/VisualStudio将在构建之间共享一些常见进程.

我对C++构建的实际问题表现为另一个错误:

fatal error C1090: PDB API call failed, 
error code '23' : '( 
Run Code Online (Sandbox Code Playgroud)

这里提出了这个问题:

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

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


小智 2

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

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

    %windir%\Microsoft.NET\Framework\<version>\MSBuild SolutionName.sln /t:Rebuild /p:configuration=debug
Run Code Online (Sandbox Code Playgroud)

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

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

希望这有帮助!