每晚构build:我为什么要这样做?

为什么我应该做每晚构build?

您应该每晚进行构build以确保您的代码库保持健康。

每晚构build的一个副作用是它迫使团​​队创build和维护一个完全自动化的构build脚本。 这有助于确保您的构build过程被logging并可重复。

自动构build擅长查找以下问题:

  • 有人检查了一些打破东西的东西。
  • 有人忘记检查必要的文件或更改。
  • 您的构build脚本不再有效。
  • 你的机器坏了。

每晚做这个事情可以确保你在24小时内发现这些问题。 在你应该交付软件之前24小时,find所有的问题比较好。

当然,你也应该有自动化的unit testing,每个每晚构build运行。

我个人发现持续集成比每晚构build更好:
http://en.wikipedia.org/wiki/Continuous_integration

我甚至在一个人的项目上使用它,能够以多快的速度暴露问题并在那里照顾他们,这是惊人的。

我一直在做build设工程(其中包括)16年。 我坚信build立早期,build设,经常,不断整合。 因此,我对一个项目做的第一件事是确定如何构build它(Java: Ant或Maven ; .NET: NAnt或MSBuild )以及如何pipe理它( Subversion或其他版本控制)。 然后,我将根据平台添加持续集成( CruiseControl或CruiseControl.NET ),然后让其他开发人员松动。

随着项目的发展,对报告和文档的需求也在不断增长,最终构build需要花费更长的时间。 在这一点上,我将把构build拆分成连续的构build(在checkin上运行),只编译和运行构build一切的unit testing和每日构build,运行所有报告,并构build任何生成的文档。 我也可以添加一个标签仓库的交付版本,并为客户交付做任何额外的包装。 我将使用细粒度的构build目标来pipe理细节,以便任何开发人员可以构build系统的任何部分 – 持续集成服务器使用与任何开发人员完全相同的构build步骤。 最重要的是,我们永远不会为构build服务器构buildtesting版本或客户。

这就是我所做的 – 这就是为什么我这样做(为什么你也应该这样做):

假设你有一个典型的应用程序,有多个项目和几个开发人员。 虽然开发人员可能从一个通用的,一致的开发环境(相同的操作系统,相同的补丁,相同的工具,相同的编译器)开始,但是随着时间的推移,他们的环境将会发生分歧。 一些开发者会虔诚地应用所有的安全补丁和升级,其他的则不会。 一些开发者会添加新的(也许更好的)工具,而其他的则不会。 有些人会记得在build筑之前更新完整的工作区; 其他人只会更新他们正在开发的项目的一部分。 有些开发人员会将源代码和数据文件添加到项目中,但忘记将其添加到源代码pipe理中。 其他人将编写依赖于特定环境的unit testing。 因此,你会很快看到这个stream行的“呃,它在我的机器上build造/工作”的借口。

通过为构build应用程序提供一个单独的,稳定的,一致的,已知的良好服务器,您将很容易发现这些问题,并且通过从每个提交中运行构build,您将能够确定问题何时进入系统。 更重要的是,因为您使用单独的服务器来构build和打包应用程序,所以每次都会以相同的方式打包所有内容。 没有什么比开发人员向客户发送定制构build,让它工作,然后不知道如何重现定制更糟糕了。

当我看到这个问题时,首先我search了Joel Spolsky的回答。 有点失望,所以我打算在这里添加它。

希望大家都知道乔尔testing职业

从他的博客Joeltesting:更好的代码的12个步骤

3.你每天做什么?

当你使用源代码控制时,有时候一个程序员不小心检查破坏构build的东西。 例如,他们已经添加了一个新的源文件,并且一切都在他们的机器上编译好,但是他们忘了将源文件添加到代码库中。 所以他们锁住机器,回家,忘却和快乐。 但没有人能工作,所以他们也不得不回家,不高兴。

打破构build是如此糟糕(如此常见),有助于日常构build,以确保不会被忽视。 在大型团队中,保证破解立即得到解决的一个好办法就是每天下午在午餐时间进行每日制作。 每个人在午餐前尽可能多地签入。 当他们回来时,构build完成。 如果它的工作,太棒了! 每个人都检查最新版本的源代码并继续工作。 如果构build失败了,那么您可以修复它,但是每个人都可以继续使用源代码的预构build版本。

在Excel团队中,我们有一条规则,无论谁打破构build,作为他们的“惩罚”,负责保护构build,直到有人破坏为止。 这是一个很好的鼓励,不要打破构build,也是一个很好的方法,让每个人都通过构build过程轮换,这样每个人都学会了如何运作。

虽然我没有机会做日常生活,但我是一个很好的粉丝。

还是不服气? 看看这里的每日build设简介是你的朋友!

实际上,你应该想要的是持续集成和自动testing(这比每晚构build还要进一步)。

如果您有任何疑问,请阅读Martin Fowler关于持续集成的文章 。

总而言之,你要尽早build立和testing,以便立即发现错误,使其能够得到修复,而在造成这些错误时你所要达到的目标仍然是新鲜的。

我实际上build议在每次登记时都要build立一个。换句话说,我build议设立一个持续集成系统。

这种系统的优点和其他细节可以在福勒的文章和维基百科条目中find。

根据我个人的经验,这是一个质量控制的问题:每一次代码(或testing,可以看作是一种forms的要求)被修改,错误可能正在蔓延。为了确保质量,你应该重新构build产品因为它将被运送并执行所有可用的testing。 这样做的次数越多,形成殖民地的可能性就越小。 因此,每天(每晚)或连续的周期是优选的。

此外,无论您是将项目的访问权限限制在开发人员还是更大的用户群中,夜间构build都可以使每个人都处于“最新版本”,从而最大程度地减less将自己的贡献重新合并到代码中的痛苦。

您希望按照定期计划进行构build,以便发现开发人员之间的代码集成问题。 你每晚要这样做的原因,而不是每周或更长的时间表,因为你发现这些问题的时间越长,解决这些问题就越困难。 在每次检查(持续集成)中进行构build的做法只是将夜间构build过程转化为逻辑极端。

从长远来看,重复构build过程的副作用也很重要。 如果你在一个有多个项目的团队中工作,那么在某个时候你需要能够轻松地重新创build一个旧版本,也许是为了创build一个补丁。 🙁

您可以将构build过程自动化得越多,您为每个后续构build所节省的时间就越多。 它也把构build过程本身从交付最终产品的关键途径,这应该让你的经理感到高兴。 🙂

这也取决于项目团队的规模和结构。 如果不同的团队依赖于其他的API,那么为了频繁的整合,每晚都要build立起来是很有意义的。 如果你只有一两个队友,那么这可能是不值得的。

根据您的产品的复杂性,持续集成可能会也可能不会运行完整的testing套件。

想象一下,思科testing一台路由器,testing数千个不同的设置。 在某些产品上运行完整的testing套件需要时间。 有时几周。 所以你需要build立不同的目的。 每晚构build可以成为更彻底的testing套件的基础。

我认为他们是非常重要的,尤其是对于1人以上的项目。 团队需要尽快知道是否有人:

  • 检查一个不好的文件
  • 不检查文件

任何构build自动化都比没有构build自动化更好:-)

就我个人而言,我更喜欢每日构build – 这样,如果构build不起作用,那么每个人都可以修复。

事实上,如果可能的话,持续集成构build就是要走的路(即在每个签入时build立一个基础),因为这样可以最大限度地减less构build之间的变化量,从而可以轻松地分辨出构build过程是谁打破的,也容易修复构build。

呃…我想这当然取决于你的项目。 如果这只是你的爱好项目,没有发布,没有依赖,没有人,但你提交代码,这可能是矫枉过正。

另一方面,如果有一组开发人员都提交代码,那么自动的每晚构build将帮助您确保存储库中代码的质量。 如果某人为所有其他人做了“打破构build”的事情,它很快就会被注意到。 有可能中断构build而不会注意到,例如忘记将新文件添加到存储库,并且每晚在中央位置build立会很快检测到这些文件。

当然还有其他可能的好处,我相信别人会提供这些好处。 🙂

每晚的build设只需要大型项目(当它需要很长时间来build设它经常在一天中)。 如果你有一个小型的项目,不需要很长的时间,你可以在你完成代码的function时创build它,这样你就可以知道你在程序中不会搞乱任何东西。 但是,对于较大的项目,这是不可能的,所以build立项目是非常重要的,以便您知道一切仍然处于正常工作状态

有几个原因,有些会比其他更适用

  • 如果您的项目正在由两个或更多人共同完成
  • 这是获取最新版本的代码的好方法
  • 每晚构build提供了代码当前状态的时间片
  • 如果你需要将代码发送给人,每晚构build会给你一个稳定的构build

每晚构build并不总是必要的 – 我认为他们只对大型项目非常有用。 但是如果你在一个大项目上,每晚构build一个检查一切正常的好方法 – 你可以运行你所有的testing(unit testing,集成testing),构build你所有的代码 – 简而言之,确认没有任何东西破坏了你的项目。

如果你有一个更小的项目,你的构build和testing时间将会缩短,所以你可以负担得起更多的定期构build。

每晚构build是进行静态代码分析的理想select(参见qalab和从java世界收集统计数据的项目)。 不幸的是,这是很less做的事情。