C# 在持续集成中优化编译时间

C# 在持续集成中优化编译时间,c#,build,compilation,teamcity,C#,Build,Compilation,Teamcity,也许那只是一个疯子的梦想,但是 在我的公司里,我们有一个大型的C#NET项目,有大约25个解决方案(非常古老)和大约350万个。loc。我面临的问题是:构建时间太慢,现在使用SSD(开发机器)需要7分钟,使用普通硬盘驱动器在VM中需要15分钟以上(这将是我想要部署的TeamCity构建系统)。 我知道,构建系统应该是最快的,但短期内我无法改变 我想缩短开发人员的提交构建单元测试反馈循环(最好现在就在Teamcity机器上),只需编译上次提交时涉及的项目,从本地nuget服务器(Teamcity服

也许那只是一个疯子的梦想,但是

在我的公司里,我们有一个大型的C#NET项目,有大约25个解决方案(非常古老)和大约350万个。loc。我面临的问题是:构建时间太慢,现在使用SSD(开发机器)需要7分钟,使用普通硬盘驱动器在VM中需要15分钟以上(这将是我想要部署的TeamCity构建系统)。 我知道,构建系统应该是最快的,但短期内我无法改变

我想缩短开发人员的提交构建单元测试反馈循环(最好现在就在Teamcity机器上),只需编译上次提交时涉及的项目,从本地nuget服务器(Teamcity服务器本身版本为7.0)获取所有其他程序集

现在,这将大大减少小型提交的反馈循环(15分钟到不到一分钟,考虑到实际的单元测试)

我知道这种部分编译的问题是可能会跳过编译错误(不匹配的接口可能会被忽略),但这可以通过运行第二个(Teamcity?)构建服务器实例来缓解,该实例并行运行整个enchilada。但立即获得第一次反馈对我来说非常重要

现在我的问题是:是否有任何构建系统/持续集成系统可以处理此任务?或者我必须编写自己的提交感知后台服务吗?当我们使用FinalBuilder脚本时,这会有点令人讨厌,而且任何API似乎都无法读取该格式(但没有深入研究)


另外,我只想对上次提交时更改的项目运行单元测试,或者至少对它们进行优先级排序。但这是事后诸葛亮。

MSBuild确实区分了构建脚本目标的“构建”和“重建”——普通构建只构建自上一个构建以来被视为已更改的项目

也就是说,当从源代码管理获取源代码时,不清除TeamCity代理的构建目录就足够了(这样做的能力可能取决于SCM-它似乎可以与Mercurial一起正常工作),只触发构建,而不是重建


关于单元测试,TeamCIty可以先执行失败的测试,但确定哪些测试解决了哪些源代码部分对我来说似乎是一项困难的任务,TeamCIty AFAIK不支持这项任务。

大多数可用的CI引擎都采用部署管道过程,这是专门为减少开发循环中的反馈时间而设计的。它的工作原理是这样的,如果任何一个步骤出错,都会立即显示失败状态

建议()将前4个步骤缩短到2-5分钟,即使对于最复杂的项目也是如此,如果超出这一步,则说明您的配置和使用CI流程的方式存在问题

Code commit triggers ---> Step 1. Automatic checkout on CI side Step 2. Compile code, ideally 1-2 mins Step 3. Save binaries to the artifact repository Step 4. Unit test, ideally 1-2 mins Step 5. Deploy to staging Step 6. Automated integration testing Step 7. Automated acceptance testing ------------------------------------ Manual testing Manual deploy to production 代码提交 触发器---> 第一步。CI端的自动签出 第二步。编译代码,最好是1-2分钟 第三步。将二进制文件保存到工件存储库 第四步。单元测试,理想情况下为1-2分钟 第五步。部署到暂存 第六步。自动化集成测试 第七步。自动验收测试 ------------------------------------ 手动测试 手动部署到生产环境 具体到步骤2,您可以:

a。将大型解决方案拆分为不同的层。每一层都有自己的VisualStudio解决方案,并且只有与该层相关的项目,从某种意义上说,您可以对最初庞大的解决方案进行分散。在步骤5中,您将知道如何将层组装成可用的应用程序

b。在TeamCity配置中,您可以指定是执行干净签出还是使用已经可用的源(可以节省步骤1的时间)。检查MSBuild的目标是否设置为Build,这将仅拾取自上次生成以来已更改的源文件(节省步骤2的时间)


根据个人经验,选项a)是最好的选项,但如果需要,您也可以同时使用a)和b),但这可能会带来一些潜在的错误,旧文件的保存时间会超过需要的时间。Teamcity还支持多个代理(免费版最多3个),允许您并行运行任务。

使用依赖版本系统。如果您在每个项目的文件夹中使用SVN,您可以为每个c#项目设置一个CI项目,该项目只构建该项目,并快速通知您该项目是否成功

设置具有生成触发器的第二个CI项目,以便在第一个项目成功并让第二个项目运行测试用例时,它们可以生成第二个CI项目。我用詹金斯成功地做到了这一点

对于完整的构建,您可以有另一个CI项目来监视根文件夹的任何更改,并启动整个解决方案的构建


通过这样设置,您可以在签入代码时快速生成每个项目并返回结果,并且在项目的测试中返回速度较慢

可能重复“是”,看到了,但是。。1) 它非常古老,2)许多答案无法与C#一起使用,3)少数有帮助的答案(如custom VS Addin的答案)不支持任何链接,而且隐藏得太深,我不希望在中获得一些有价值的反馈time@hko我知道这似乎是一个难以想象的数字,浪费了很多分数,“但我会考虑在另一个问题上悬赏,或者在另一个问题上跟踪答案中的每一个环节。”鲁本巴特林与78代表。。是的,有点刺耳;)会考虑它;@hko不敢相信我建议:D请不要真的这么做!人力资源管理。。听起来不错,但是:我会用它来测试补丁,因为它们失败了,它们不会被提交到“稳定”的基线(使用hg)。。因此,我必须将构建目录“重置”为来自gbaseline的最后一次提交。。不是很难做到,但我仍然有点惊讶,似乎没有一个既定的解决方案..很高兴知道,但大多数都没有回答这个问题,作为我的专家