我如何以及为什么要设置一个 C # 构建机器?

我和一个小型(4人)开发团队在一个 C # 项目上合作。我已经建议设置一个构建机器,它将每晚进行项目的构建和测试,因为我知道这是一件好事。问题是,我们没有很多预算,所以我必须向当权者解释这笔开支。所以我想知道:

  • 我需要什么样的工具/许可证?现在,我们使用 VisualStudio 和智能程序集进行构建,使用 Perforce 进行源代码控制。我是否需要其他东西,或者是否有一个相当于 cron 作业的东西来运行自动化脚本?
  • 这到底能给我带来什么,除了显示我的身材有问题之外?我是否应该在这个解决方案(sln 文件)中设置将由这些脚本运行的测试项目,以便测试特定的函数?目前,我们有两个这样的测试,因为我们没有时间(或坦率地说,没有经验)来进行好的单元测试。
  • 我需要什么样的硬件?
  • 一旦构建完成并进行了测试,将该构建放在 ftp 站点上是一种常见的做法,还是有其他内部访问的方法?这个想法是,这台机器使 构建,我们都去它,但可以使调试构建,如果我们必须。
  • 我们应该多久进行一次这样的构建?
  • 空间是如何管理的?如果我们每晚都在构建,我们应该保留所有旧的构建,还是在大约一周后开始抛弃它们?
  • 还有什么我没看到的吗?

    我知道这是一个很大的话题,我才刚刚开始。我在这里找不到这个问题的副本,如果有一本书在那里,我应该得到,请让我知道。

    编辑: 我终于让它工作了!Hudson 非常出色,FxCop 展示了一些我们认为已经实现的特性实际上是不完整的。我们还必须将安装程序类型从旧的和破产的 vdproj 改为新的热点 WiX。

    基本上,对于那些正在关注的人来说,如果您可以从命令行运行您的构建,那么您可以将它放到 Hudson 中。通过 MSBuild 从命令行运行构建本身就是一个有用的练习,因为它强制您的工具是最新的。

  • 41045 次浏览

    我们在以下组合中运气很好:

    1. VisualStudio (特别是,使用 MSBuild.exe 命令行工具并将解决方案文件传递给它。消除了对 msbuild 脚本的需要)
    2. NAnt (类似于 XML 语法/任务库,比 MSBuild 更好,也有 P4 src 控制操作的选项)
    3. Cruisecontrol.net -内置在 web 仪表板中用于监视/启动构建。

    CCNet 内置了通知器,以便在构建成功或失败时发送电子邮件

    关于正当理由: 这减轻了开发人员进行手工构建的负担,并且在消除人为错误方面做了很多工作。量化这种影响是非常困难的,但是一旦你这样做了,你就再也不会回头了。拥有一个可重复的过程来构建和发布软件是至关重要的。我敢肯定,你已经去过那些地方,他们手工构建的软件,它得到了在野外,只有你的构建人员说: “哎呀,我一定是忘了包括新的 DLL!”

    在硬件上: 尽可能强大。更多的功能/内存 = 更快的构建时间。如果你能负担得起,你永远不会后悔得到一个一流的建设机器,无论多么小的团队。

    空间: 有助于有足够的硬盘空间。您可以编写 NAnt 脚本,在每次构建开始时删除中间文件,因此真正的问题是保留日志历史和旧的应用程序安装程序。我们有监控磁盘空间和发送警报的软件。然后我们手动清理硬盘。通常需要每3-4个月做一次。

    关于构建通知: 这是内置在 CCNet 中的,但是如果您打算添加自动化测试作为一个附加步骤,那么从一开始就将其构建到项目中。一旦项目变大,支持适合性测试是极其困难的。有大量关于测试框架的信息(可能也有大量关于 SO 的信息) ,所以我将推迟命名任何特定的工具。

    支持这种做法的主要理由是,通过尽快提醒您构建中断或测试失败,它将降低开发过程的成本。

    集成多个开发人员的工作是团队成长的主要危险。团队规模越大,就越难协调他们的工作,阻止他们干扰彼此的变化。唯一好的解决方案是告诉他们“尽早且经常地进行集成”,在他们完成工作时检入小的工作单元(有时称为“故事”)。

    您应该让构建机器在每次有人签入时重新构建,一整天都是如此。使用“巡航控制”,你可以在任务栏上看到一个变红的图标(甚至可以和你说话!)当构造被破坏时。

    然后,您应该每晚进行一次完全干净的构建,其中标记了源版本(给定一个惟一的构建编号) ,您可以选择将其发布给您的涉众(产品经理、 QA 人员)。这样,当报告一个 bug 时,它就是对应一个已知的构建编号(这一点非常重要)。

    理想情况下,您应该有一个可以下载构建的内部站点,并有一个按钮,您可以单击以发布前一个夜间构建。

    这完全是关于健康的建设。这样做的好处是,您可以设置构建中希望发生的任何类型的事情。其中可以运行测试、静态分析和分析器。 当您最近处理应用程序的这一部分时,处理问题的速度要快得多。如果您提交了小的更改,那么它几乎可以告诉您在哪里破坏了它:)

    当然,这是假设您将其设置为每次签入(持续集成)都进行构建。

    它还可以帮助 QA 和 Dev 走得更近。因为您可以设置用它运行的功能测试,以及分析器和其他任何可以改进向开发团队的反馈的东西。这并不意味着功能测试在每次检入时都会运行(可能需要一段时间) ,但是您可以使用整个团队通用的工具来设置构建/测试。我一直在自动化烟雾测试,所以在我的案例中,我们的合作更加紧密。

    更新: 詹金斯是 Hudson 的最新版本。现在大家都该用 Jenkins 了。我会相应地更新链接。

    Hudson 是免费的,非常容易配置,并且很容易在 VM 上运行。

    部分来自我的一个老职位:

    我们用它来

    • 部署 Windows 服务
    • 部署 Web 服务
    • 运行 MST 测试并显示与任何 junit 测试一样多的信息
    • 跟踪低,医疗,高任务
    • 趋势图警告和错误

    下面是一些 Hudson 支持的内置.net 东西

    另外,上帝禁止你使用视觉源码安全,它也支持这一点。我建议你看看 Redsolo 关于使用 Hudson 构建.net 项目的文章

    你的问题

    • 问: 我需要什么样的工具/许可证?现在,我们使用 VisualStudio 和智能程序集进行构建,使用 Perforce 进行源代码控制。我是否需要其他东西,或者是否有一个相当于 cron 作业的东西来运行自动化脚本?

    • A: 我刚刚在一个全新的 VM 上安装了 Visual Studio,这个 VM 运行着一个全新的、打了补丁的 Windows 服务器操作系统。所以你需要许可证来处理。Hudson 将自己作为一个 Windows 服务安装,并在端口8080上运行,您将配置您希望它扫描代码存储库以获得更新代码的频率,或者您可以告诉它在某个时间构建代码。都可以通过浏览器进行配置。

    • 问: 确切地说,除了表明身体结构出现问题之外,这会给我带来什么呢?我是否应该在这个解决方案(sln 文件)中设置将由这些脚本运行的测试项目,以便测试特定的函数?目前,我们有两个这样的测试,因为我们没有时间(或坦率地说,没有经验)来进行好的单元测试。

      A: 第一次构建失败或变得不稳定时,你会收到一封电子邮件。如果单元测试失败,或者通过您设置的任意数量的条件将其标记为不稳定,那么构建就是不稳定的。当一个单元测试或构建失败时,你会收到一封电子邮件,它会告诉你在哪里、为什么以及如何失败。根据我的配置,我们得到:

      • 自上次工作构建以来的所有提交的列表
      • 提交那些提交的笔记
      • 提交中更改的文件列表
      • 控制台输出,显示错误或测试失败
    • 问: 我需要什么样的硬件?

      A: 一个 VM 就足够了

    • 问: 一旦构建完成并进行了测试,将构建放在 ftp 站点上是一种常见的做法,还是有其他内部访问方式?我们的想法是,这台机器进行构建,我们都会进行构建,但是如果必要的话,我们可以进行调试构建。

      A: Hudson 可以对它做任何你想做的事情,包括通过 md5散列标识它,上传它,复制它,存档它,等等。它会自动完成这项工作,并为您提供构建工件的长期运行历史。

    • 问: 我们应该多久进行一次这样的构建?

      A: 我们每个小时都有我们的轮询 SVN,寻找代码更改,然后运行构建。晚上是可以的,但是在我看来有些毫无价值,因为你昨天所做的工作在早上进来的时候不会在你的脑海中留下新鲜的印象。

    • 问: 如何管理空间?如果我们每晚都在构建,我们应该保留所有旧的构建,还是在大约一周后开始抛弃它们?

      答: 这取决于你,经过这么长时间,我移动我们的构建工件到长期存储或删除它们,但所有的数据存储在文本文件/xml 文件,我保存周围,这让我存储变更日志,趋势图等服务器上的空间消耗很小。您还可以将 Hudson 设置为只保留构建尾随 # 中的构件

    • 问: 还有什么是我没有看到的吗?

      不,现在就去找哈德森,你不会失望的!

    我只是想在 Mjmarsh 说的基础上再加点东西,因为他打下了很好的基础..。

    以上所有内容(除了 VS)都是开源的,所以您不需要考虑任何额外的许可。

    就像 Earwicker 提到的,早期构建,经常构建。知道某些东西坏了,您就可以生成一个可交付的东西,这对于及早捕获东西是有用的。

    NAnt 还包括 Nunit/Nunit2的任务,因此实际上可以自动化单元测试。然后你可以把样式表应用到结果中,在 cruisecontrol.net 提供的框架的帮助下,每个版本都有可读的、可打印的单元测试结果。

    这同样适用于 Ndoc任务。为每个构建生成并提供文档。

    您甚至可以使用 执行官任务执行其他命令,例如,使用 InstallShield 生成一个 Windows Installer。


    这个想法是尽可能地自动化构建,因为人类会犯错误。花在前面的时间就是节省下来的时间。人们不必通过构建过程来照看构建。确定构建的所有步骤,为每个任务创建 NAnt 脚本,并逐个构建 NAnt 脚本,直到完全自动化整个构建过程。然后,它还将所有构建放在一个地方,这有利于进行比较。在380版本中运行良好的426版本出现了问题?可交付成果已经准备好了,可以进行测试——抓住它们,然后进行测试。

    • 不需要许可。 cruisecontrol.NET 是免费的,只需要.NET sdk 来构建。
    • 构建服务器,即使没有自动化的单元测试,仍然为构建版本提供了一个受控的环境。不再有“约翰通常靠他的机器生产,但他生病了。因为某些原因,我不能在我的机器上建造”
    • 现在我已经在虚拟 PC 会话中设置了一个。
    • 是的。需要将构建转储到某个可访问的地方。开发构建应该打开调试。发布版本应该关闭它。
    • 多久一次取决于你。如果设置正确,您可以在每次签入后进行构建,开销将非常小。如果您有(或计划有)适当的单元测试,这是一个很好的主意。
    • 只要需要,保持里程碑和版本。其他任何事情都取决于您构建的频率: 持续?扔掉。每天?保持一周的量。每周?保持两个月的价值。

    项目规模越大,您就越能看到自动化构建机器的好处。

    - 怎么做?-看看卡雷尔 · 洛兹的 博客

    为什么? 我能想到几个原因:

    • 一个正常运行的构建,当正确实现时,意味着当构建为绿色时,所有的开发人员 可以都在他们的机器上构建
    • 正常运行的构建,如果实现得当,意味着您随时可以进行部署
    • 一个正常工作的构建,如果实现得当,就意味着您所发布的任何东西都会访问您的源代码控制系统。
    • 一个正常运行的构建,如果实现得当,意味着您要尽早并经常进行集成,从而降低集成风险。

    Martin Fowler 关于 持续集成的文章仍然是权威文章,看看吧!

    在我以前的工作场所,我们使用 团队城市。它使用起来非常简单和强大。它可以免费使用,但有一些限制。还有一个关于 硬币铸件的教程。我们之所以没有使用 cruisecontrol.net ,是因为我们有很多小项目,而且每个项目都要在 CC.NET 中设置,这非常痛苦。我强烈推荐团队城市。总结一下,如果你是开源的,那么 CC.NET 就是学习曲线稍高的先驱。如果你的预算允许,你一定要去 TeamCity 或检查免费版本。

    原因: 10年前,作为软件开发人员,我们习惯于对某些东西进行深度分析,获得文档(用人类语言写成)“签字”,然后开始编写代码。我们会进行单元测试、字符串测试,然后进行系统测试: 第一次将系统作为一个整体一起运行,有时是在文档签署后的几周或几个月。只有到那时,我们才会发现所有的假设和误解,我们有当我们分析一切。

    持续集成作为和思想使您构建一个完整的(尽管最初非常简单)系统端到端。随着时间的推移,系统功能被正交地构建出来。每次您完成一个完整的构建时,您都是在尽早且经常地进行系统测试。这意味着您要尽早发现并修复错误和假设,这时修复它们的成本最低。

    怎么做: 至于怎么做,我之前在博客上写过: [ 点击这里]

    超过8篇文章一步一步地讲述了如何在 Windows 环境中设置 Jenkins 服务器。NET 解决方案。