2008-11-17 73 views
7

我们遇到性能问题与我们的团队基础构建服务器的实施和我正在运行的想法如何加快事情。我们已经添加了几个PropertyGroup元素来提高几个步骤的性能(SkipClean,SkipLabel,SkipInitializeWorkspace),但我认为我们需要进行重大的重组来解决问题。下面是我们的设置:团队建立现在痛苦缓慢

  • 我们已经得到了每一个有很大的不同约40 web应用程序,但运行一串共享组件
  • 每一种网络应用程序都有自己的解决方案;
  • 每个这些Web应用程序引用了大约10到25个共享程序集;
  • 存在一个构建定义,其中包含在每次检入到主干时触发的所有解决方案;

下面是我们遇到

  • 在生成的基本问题,将建立每个共享组件,多次被引用,而不是建立一次,并使用每个应用
  • 放置目录的文件复制时间很慢。它必须通过网络共享,并且不会采用本地路径。
  • 每一个如此多的构建,一个或多个输出文件都会被“锁定”并导致构建在编译良好时中断。
  • 另一件事 - 我也尝试了单独的构建定义,但这样做也会强制另一个工作空间被获取到最新版本。我宁愿它是建立服务器包含一个版本的干线建立。

在过去的几个月中,我们已经屈服于嗜睡,并忽略了这个问题,但现在构建时间超过一个半小时到一个半小时。

我正在玩弄学习和切换到巡航控制的想法,以获得更好的控制。任何人都不同意?

任何帮助最受赞赏。谢谢!

回答

2

首先,它听起来好像您的所有网络应用都包含在同一个团队项目中。如果这是真的,将它们分成逻辑分组。通常情况下,单个团队项目应该包含单个部署模型。

其次,将共享程序集分成他们自己的团队项目。一旦移动,您有几个选择,您可以将源代码或编译的DLL分支到需要它们的团队项目。他们可以有自己的单元测试,并且如果你非常喜欢,你可以扩展团队构建以在成功的测试中自动合并。总结一下,你需要简化你的构建策略。

0

从CruiseControl建议的个人经验谈起 - 记住它是一个持续集成的“框架”。它不会立即解决所有问题(组件化构建,每个组件更改触发,以及序列化构建虽然会使事情变得更好)。它需要相当多的配置(甚至可能是定制)来获得你想要的东西,所以准备投入一些时间。当然,如果你的构建时间缩短了,你将获得长期的巨大回报 - 如果你不能再忽视这个问题,值得投入一些时间在更好的CI解决方案上。

请注意,任何CI工作都只与您所采取的政策一样好。当涉及到版本标签,释放,依赖关系,二进制文件的测试版,归档版本......以及当时我们甚至没有考虑过的其他许多问题时,我们遇到了巨大的政策空白。

此外,准备投入至少一些资源来维护这件事。这不是一份全职工作(我喜欢这样做,因为它会持续改进流程)。我们的定制将我们从第一款产品的2小时整体构建带到20多种产品中的400多个组件,这些产品在大约20分钟内并行地在多台机器上构建,因此非常值得。

+0

可以肯定地说,Team Foundation Build的开箱即用行为有点短视吗?在向导中定义构建时,您可以选择要包含哪些Visual Studio解决方案。听起来你提倡从这个标准中分离出来,对吗? – 2008-11-24 13:28:29

1

你真的需要在每个网络应用程序中构建一切吗?如果共享程序集没有更改,为什么一遍又一遍地构建它们?

这里有一个想法:

  1. 让每一个Web应用程序有自己的\ lib文件夹。
  2. 将每个共享程序集放在lib文件夹中。
  3. 让Web应用程序只从其本地lib文件夹引用共享程序集。
  4. 检查一切。

现在构建不应该启动,除非事情已经改变,并构建将不包括共享组件。

  • 应该有一个包含所有共享程序集的中央文件夹。
  • 此处的任何更改都应传播到所有本地\ lib文件夹。
  • 最后,任何共享程序集在更改时应该被复制到中央文件夹。

这里的想法是让共享程序集项目只知道中央文件夹。这将简化复制构建所需的任何构建后操作。

中央文件夹必须以任何更改将被复制到所有引用Web应用程序的方式进行管理。

3

所以这就是我所做的,我已经将构建时间缩短到了9分钟。对于我正在编译的项目数量,我很好。

  • 创建一个包含所有共享库和所有网络的解决方案。在这一步中有很多额外的工作,因为我必须修复一堆遗留代码或以其他方式存储在多个位置的引用。
  • 节省最多时间的事情是执行文件系统移动而不是所有输出文件的网络副本。由于我们的放置位置实际上位于构建服务器上,因此这是有道理的。

要执行移动,我只需重写TFSBuild中的CoreDropBuild目标。proj文件:

<Target Name="CoreDropBuild" 
     Condition=" '$(SkipDropBuild)'!='true' and '$(IsDesktopBuild)'!='true' " 
     DependsOnTargets="$(CoreDropBuildDependsOn)" > 
      <Exec Command="move $(BinariesRoot)\Release d:\BuildOutput\$(BuildNumber)\Release"/>  
</Target>