如何以及为什么设置C#构build机器?

我正在与一个C#项目的小型(4人)开发团队合作。 我build议设立一个build造机器,每晚都会build造和testing项目,因为我明白这是一件好事。 麻烦的是,我们在这里没有太多的预算,所以我必须certificate这些费用是合理的。 所以我想知道:

  • 我需要什么样的工具/许可证? 现在,我们使用Visual Studio和Smart Assembly来构build,而使用Perforce进行源代码pipe理。 我需要其他的东西,还是有相当于一个cron作业来运行自动脚本?
  • 究竟是什么,这会得到我,除了一个破碎的构build指示? 我应该在这个解决scheme(sln文件)中设置testing项目,这些脚本将运行testing项目,所以我可以testing特定的function? 目前我们有两个这样的testing,因为我们没有时间(或坦率地说,是经验)做好unit testing。
  • 我需要什么样的硬件?
  • 一旦构build完成并testing完毕,将其构build在ftp站点上还是采取其他方式进行内部访问是一种常见做法? 这个想法是,这台机器进行构build,我们都去,但如果必须的话,可以debugging构build。
  • 我们应该多久做一次这种构build?
  • 空间如何pipe理? 如果我们每晚build造,我们应该保留所有的旧build筑物,还是在大约一个星期左右之后开始抛弃它们?
  • 还有什么我不在这里看到?
  • 我意识到这是一个非常大的话题,我刚刚开始。 在这里我找不到这个问题的重复,如果有一本书我应该得到,请让我知道。

    编辑:我终于得到它的工作! 哈德森是完全不可思议的,FxCop显示我们认为实现的一些function实际上是不完整的。 我们还必须将安装程序types从旧的vdproj更改为新的Hotness WiX。

    基本上,对于那些正在关注的人,如果你可以从命令行运行你的构build,那么你可以把它放入哈德森。 通过MSBuild从命令行运行构build本身是一个有用的练习,因为它会迫使您的工具变得最新。

    更新: jenkins是哈德逊的最新版本。 现在每个人都应该使用Jenkins。 我会相应地更新链接。

    Hudson是免费的,并且非常容易configuration,并且可以轻松在虚拟机上运行。

    部分来自我的一个旧post:

    我们用它来

    • 部署Windows服务
    • 部署Web服务
    • 运行MSTests并显示与任何junittesting一样多的信息
    • 跟踪低,中等,高任务
    • trendgraph警告和错误

    这里是一些Hudson支持的.net内容

    • 的MSBuild
    • MSTest的
    • NUnit的
    • 团队基础服务器
    • 的FxCop
    • 了StyleCop
    • 编译器警告
    • 代码任务

    此外,上帝禁止你使用视觉资源安全, 它也支持 。 我build议你看看Redsolo关于使用Hudson构build.net项目的文章

    你的问题

    • :我需要什么样的工具/许可证? 现在,我们使用Visual Studio和Smart Assembly来构build,而使用Perforce进行源代码pipe理。 我需要其他的东西,还是有相当于一个cron作业来运行自动脚本?

    • 答:我刚安装了一个运行全新的,修补过的,安装了Windows服务器操作系统的虚拟机的全新副本。 所以你需要许可证来处理。 哈德森将自己安装为一个Windows服务,并运行在端口8080上,您将configuration您希望扫描代码库以更新代码的频率,或者您可以指定它在某个特定时间生成。 所有可通过浏览器进行configuration。

    • 问:除了表示破损的构造外,这究竟会给我带来什么? 我应该在这个解决scheme(sln文件)中设置testing项目,这些脚本将运行testing项目,所以我可以testing特定的function? 目前我们有两个这样的testing,因为我们没有时间(或坦率地说,是经验)做好unit testing。

      答:第一次生成失败或者变得不稳定时,您将收到一封电子邮件。 如果unit testing失败或者可以通过您设置的任意数量的标准将其标记为不稳定,则构build不稳定。 当unit testing或构build失败时,您将通过电子邮件发送,它会告诉您在哪里,为什么以及如何失败。 用我的configuration,我们得到:

      • 自上次构build以来所有提交的列表
      • 提交这些提交的logging
      • 在提交中更改的文件列表
      • 从构build本身的控制台输出,显示错误或testing失败
    • 问:我需要什么样的硬件?

      答:虚拟机就足够了

    • 问:构build完成并testing后,将其构build在ftp站点上还是采取其他方式进行内部访问是常见做法? 这个想法是,这台机器进行构build,我们都去,但如果必须的话,可以debugging构build。

      答:哈德森可以随心所欲地做任何事情,包括通过md5哈希对其进行身份validation,上传,复制,归档等等。它会自动执行此操作,并为您提供构build工件的长期历史logging。

    • 问:我们应该多久进行一次这种构build?

      答:我们每小时都有我们的poll SVN,查找代码更改,然后运行构build。 每晚都没问题,但是有些没有价值的海事组织,因为你昨天的工作不会在你进入的时候在你的脑海里变得清新。

    • 问:如何pipe理空间? 如果我们每晚build造,我们应该保留所有的旧build筑物,还是在大约一个星期左右之后开始抛弃它们?

      – 答:这是由你,经过这么长时间,我把我们的构build文物长期存储或删除它们,但所有的数据存储在文本文件/ xml文件我保持,这让我存储changelog,趋势图,等在服务器上消耗less量空间。 你也可以将Hudson设置为只保留尾随编号的文物

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

      答:不,现在就去哈德森,你不会失望!

    我们有以下的组合运气很好:

    1. Visual Studio(具体地说,使用MSBuild.exe命令行工具并将它传递给我们的解决scheme文件,不需要msbuild脚本)
    2. NAnt (比MSBuild更好的XML语法/任务库,还有用于P4 src控制操作的选项)
    3. CruiseControl.net – 内置在网页仪表板中监视/启动构build。

    CCNet内置通知程序在构build成功/失败时发送电子邮件

    理由:这样做会减轻开发人员进行手动构build的负担,而且还会大大减less人为错误。 量化这个效应是非常困难的,但是一旦你做到了,你将永远不会回头。 有一个可重复的过程来build立和发布软件是最重要的。 我相信你一直是他们手工build立这个软件的地方,只是为了让你的搭build人员说“糟糕,我一定忘记包含这个新的DLL!

    在硬件上:尽可能强大。 更多的功耗/内存=更快的编译时间。 如果你能负担得起,不pipe你的团队多么小,你永远不会后悔拿到一台顶尖的打造机器。

    在空间上:有助于有足够的硬盘空间。 您可以制作您的NAnt脚本以在每次构build开始时删除中间文件,所以真正的问题是保存日志历史logging和旧的应用程序安装程序。 我们有监控磁盘空间并发送警报的软件。 然后我们手动清理驱动器。 通常需要每3-4个月进行一次。

    关于构build通知:这是内置于CCNet的,但是如果您要添加自动化testing作为额外的步骤,则可以从一开始就将其构build到项目中。 一旦项目变大,回溯testing非常困难。 那里有很多关于testing框架的信息(可能还有很多关于SO的信息),所以我会推迟命名任何特定的工具。

    在我以前的工作场所,我们使用了TeamCity 。 使用起来非常简单而且function强大。 它可以免费使用,有一些限制。 Dime Casts也有一个教程。 我们没有使用CruiseControl.NET的原因是我们有很多小的项目,并且在CC.NET中设置每个项目都是非常痛苦的。 我会强烈推荐TeamCity。 总结一下,如果你是开源的,那么CC.NET就是一个学习曲线稍高的大爸爸。 如果你的预算允许你一定要与TeamCity一起或检查出免费版本。

    怎么样? 看看Carel Lotz的博客 。

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

    • 正确实施的工作构build意味着当构build为绿色时,所有开发人员都可以在其计算机上构build
    • 正确实施的工作版本意味着您随时可以部署
    • 正确实施的工作构build意味着,无论您发布什么内容,都会使您的源代码pipe理系统访问。
    • 正确实施的工作构build意味着您可以尽早整合,降低整合风险。

    Martin Fowler关于持续集成的文章仍然是权威文本。 看看它!

    赞成的主要观点是,它会降低开发过程的成本,通过尽快提醒您已经破损或者testing失败。

    整合多个开发商的工作的问题是成长一个团队的主要危险。 团队越大,协调他们的工作就越困难,阻止他们混淆彼此的变化。 唯一好的解决办法就是告诉他们“尽早和经常融合”,办法是在完成工作时检查一小部分工作(有时称为“故事”)。

    你应该让整个机器在整个一天内重build每一次检查。 使用巡航控制,你可以在任务栏上看到一个红色的图标(甚至和你说话!)。

    然后,您应该在源版本标签(给定一个唯一的内部版本号)的情况下每晚做一次完整的清理版本,您可以select发布给您的利益相关者(产品经理,质量保证人员)。 这是为了当一个错误报告时,它是反对已知的内部版本号(这是非常重要的)。

    理想情况下,你应该有一个内部网站,可以下载构build,并有一个button,您可以点击发布以前的每晚构build。

    只是试图build立一个什么mjmarsh说,因为他奠定了一个伟大的基础…

    • 视觉工作室。 MSBuild工作正常。
    • NAnt 。
    • NantContrib 。 这将提供额外的任务,如Perforce操作。
    • CruiseControl.net 。 这基本上是你的“构build仪表板”。

    以上所有(除了VS)都是开源的,所以你不需要额外的授权。

    正如Earwicker所说,build设早,经常build设。 知道一件事情破灭了,你可以产生一个交付物,对于早日捕捉东西很有用。

    NAnt也包括nunit / nunit2的任务,所以你可以实际上自动化你的unit testing。 然后,您可以将样式表应用于结果,并在CruiseControl.net提供的框架的帮助下,为每个构build提供可读的,可打印的unit testing结果。

    这同样适用于ndoc任务。 让您的文档生成和可用,为每个版本。

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


    这个想法是尽可能地自动化构build,因为人类会犯错误。 在前面花费的时间是节省下来的时间。 人们不必通过构build过程来保护构build。 确定构build的所有步骤,为每个任务创buildNAnt脚本,然后逐个构buildNAnt脚本,直到完全自动化整个构build过程。 它也将所有的构build放在一个地方,这是比较好的。 Build 390在Build 380中可以正常工作吗? 那么,这些交付物已经准备好进行testing了 – 抓住它们并且试验一下。

    • 不需要许可证。 CruiseControl.net是免费的,只需要.NET SDK构build。
    • 即使没有自动化的unit testing,构build服务器仍然为构build版本提供受控环境。 没有更多的“约翰通常build立在他的机器上,但他病了,出于某种原因,我不能build立在我的机器上”
    • 现在我有一个在虚拟PC会话中设置。
    • 是。 构build需要倾倒在可访问的地方。 开发版本应该打开debugging。 发布版本应该closures它。
    • 多久是由你决定。 如果设置正确,你可以在每次入住后build立很less的开销。 如果你有(或正在计划进行)unit testing,这是一个好主意。
    • 保持里程碑和释放,只要需要。 还有什么要看你多久build立一次? 丢掉。 日常? 保持一周的价值。 每周? 保持两个月的价值。

    您的项目越大,您将看到自动生成机器的好处。

    这是关于build设的健康。 这是什么让你可以设置任何types的事情,你想与build设发生。 其中您可以运行testing,静态分析和分析器。 当你最近在应用程序的那一部分工作时,问题处理速度要快得多。 如果你做了小小的改动,那么它几乎可以告诉你你在哪里弄坏了它:)

    这当然假设,你设置它与每一个检查(持续集成)build立。

    它也可以帮助QA和Dev更接近。 正如你可以设置functiontesting来运行它,以及探查器和其他任何改善对开发团队反馈的东西。 这并不意味着每次检查都会运行functiontesting(可能需要一段时间),但是您使用整个团队常见的工具来设置构build/testing。 我一直在自动化烟雾testing,所以在我的情况下,我们更密切合作。

    为什么:10年前,我们作为软件开发人员用来分析一些东西到第n级获得文件(用人类语言写的)“签字”,然后开始编写代码。 我们将进行unit testing,stringtesting,然后进行系统testing:整个系统第一次一起运行,有时在签署文档之后的一周或几个月。 只有到那时,我们才能发现我们分析一切时所有的假设和误解。

    持续集成作为和理念使您能够build立一个完整的(尽pipe最初非常简单)的系统。 随着时间的推移,系统function是正交构build的。 每次你做一个完整的构build你都在做早期和经常的系统testing。 这意味着您可以尽早find并修复错误和假设,而修复这些错误和假设是最便宜的时间。

    怎么样:至于怎么,我刚才在博客上写了这个:[ 点击这里 ]

    超过8篇文章,一步一步地介绍如何在.NET解决scheme的windows环境中设置Jenkins服务器。