Build 只生成已更改的项还是全部生成,在持续集成中首选哪一种?

Build 只生成已更改的项还是全部生成,在持续集成中首选哪一种?,build,msbuild,continuous-integration,build-process,teamcity,Build,Msbuild,Continuous Integration,Build Process,Teamcity,我们的软件分为多个组件 Msbuild脚本自动生成和批处理脚本以调用它。 我们每天都在构建我们的组件,即使我们有一些小的变化。 我们希望转向持续集成,这样每当签入时,就会触发构建 我们的msbuild脚本是这样编写的,它将为组件构建所有sln文件。 在持续集成中,我是否只需要构建经过修改的SLN 如果只生成更改的项,是否必须为每个sln编写msbuild 我可以简单地使用teamcity中现有的msbuild脚本吗?无论构建的粒度如何,我的偏好是对整个组件进行完整、干净的构建。如果CI循环的构建

我们的软件分为多个组件

Msbuild脚本自动生成和批处理脚本以调用它。 我们每天都在构建我们的组件,即使我们有一些小的变化。 我们希望转向持续集成,这样每当签入时,就会触发构建

我们的msbuild脚本是这样编写的,它将为组件构建所有sln文件。 在持续集成中,我是否只需要构建经过修改的SLN

如果只生成更改的项,是否必须为每个sln编写msbuild


我可以简单地使用teamcity中现有的msbuild脚本吗?

无论构建的粒度如何,我的偏好是对整个组件进行完整、干净的构建。如果CI循环的构建时间过长,请考虑将该组件分解为依赖于彼此的二进制文件的较小部分。在这种情况下,您将构建更改的组件以及依赖于更改的组件的任何其他组件。在.Net世界中,我听说Nuget在管理这些二进制依赖项方面越来越流行


我在我的第二次练习中更多地讨论了这个策略

无论构建的粒度如何,我的偏好是对整个组件进行完整、干净的构建。如果CI循环的构建时间过长,请考虑将该组件分解为依赖于彼此的二进制文件的较小部分。在这种情况下,您将构建更改的组件以及依赖于更改的组件的任何其他组件。在.Net世界中,我听说Nuget在管理这些二进制依赖项方面越来越流行

我在我的第二次练习中更多地讨论了这个策略

两者都有。 我们每天进行计划的完整构建,每天进行增量构建(门控签入)

这一切都取决于你的构建到底有多大和复杂,但如果你选择其中一个或另一个,你就应该朝着完整的方向走。 我们每天进行计划的完整构建,每天进行增量构建(门控签入)


这一切都取决于你的构建有多大和复杂,但如果你选择其中一个,你就应该走向完整。

我两者都做过,两者都有优点和缺点:

增量构建(仅更改的内容) 这是MSBuild的默认行为。即使在VisualStudio中构建,它也只构建更改的内容(除非选择“全部重建”)

赞成的意见
  • 越快反馈越快越好
  • 构建服务器磁盘和网络上的负载更少,因为您不必每次都检查源代码管理之外的所有内容。这在高负载构建集群中可能很重要
欺骗
  • 可能的源代码管理问题我们遇到了一些问题,源代码树的复杂重命名或重组导致签出失败。我们使用的是subversion,所以更新失败了。如果我们一直在进行干净的签出,这就不会发生(当然,干净的签出意味着我们必须进行完整的重建)
  • 误报的可能性。我们遇到了一个案例,我们没有完全擦除生成代理的源文件并从源文件中签出新副本。有人更改了构建文件,使得它在测试二进制文件之前没有正确地复制它们,但是由于旧的二进制文件仍然存在于磁盘上,所以它正在从它们运行测试。这个构建被破坏了,但它正在运行旧的二进制测试,所以直到一周后我发现了这个问题,我们才意识到我们引入了bug
完全签出和重建 赞成的意见
  • 更稳健您排除了源代码管理更新问题和误报的可能性,因为您每次都是从一张干净的板书开始的。这将消除以前的生成可能会影响此生成的可能性
欺骗
  • 要慢得多这需要等待源代码的完整签出,如果项目很大,这可能需要很长时间。另外,它需要从头开始构建整个源代码树
  • 生成代理、磁盘和网络的负载更高因为您正在签出和重建所有内容,因此会对生成代理的cpu和磁盘以及网络(以及源代码管理系统)产生更大的负担
第三个选项:增量签出和重建 在这种情况下,您只能从源代码管理中提取增量更改,但要执行完全重建

赞成的意见
  • 比完全签出快,实际上只比增量构建稍微慢一点。与执行完整签出或运行测试所需的时间相比,构建时间通常很短
  • 由于您重建了所有源代码,因此更加健壮,但误报仍然可能潜入
欺骗
  • 可能的源代码管理问题请参阅我对增量构建的评论
  • 误报概率请参阅我对增量构建的评论
哪一个最好?
这取决于您对快速反馈(速度)的需求与网络和构建代理的资源约束之间的平衡。如果您有很多资源,并且想要快速反馈和完整重建的健壮性,那么您可以构建两次。可能在签入时,执行增量生成,但每晚执行完全签出和重新生成。

我已经完成了这两项工作,两者都有优点和缺点:

增量构建(仅更改的内容) 这是MSBuild的默认行为。即使在VisualStudio中构建,它也只构建更改的内容(除非选择“全部重建”)

赞成的意见
  • 越快你的反馈循环越快,赌注就越大