使用 CruiseControl 进行持续集成






3.21/5 (10投票s)
将您引导完成使用各种工具设置 CruiseControl Build 服务器的过程。
引言
对于任何希望提高生产力并成为更优秀开发者的开发者来说,持续集成服务器都是必备之物。总的来说,它能始终为您提供应用程序一个良好且持续可用的工作副本。具体来说,它能在您提交代码时立即发现问题。这就像多了一个全职开发者,其唯一职责就是编译和检查您的代码是否存在错误。
我全职工作时是一名独立开发者,业余时间也会在家做一些副业。任何声称构建服务器只适用于团队的人都是胡说八道。正如我上面所说,拥有一个构建服务器就像多了一个帮助您发现问题的开发者。
在持续集成的软件方面,有许多选择。我使用 CruiseControl 是因为
- 它是开源社区中最受欢迎的。
- 它相当容易设置。
尽管本文可能会让您觉得工具繁多,让人不知所措,而且我敢保证您在设置各种构建文件和让所有工具协同工作时会遇到问题,但从长远来看,这一切都是值得的,价值百倍。
为了对 CruiseControl 的工作原理有一个基本的了解,请查看此处的图片。它应该能让您了解整个流程的工作方式。
以下是流程步骤:
- 您将代码提交到您的 SCM。
- 您的构建服务器每 60 秒检查一次您的 SCM 以查找更改。
- 检测到更改后,构建服务器会将源代码签出到本地目录,然后由 NAnt 进行编译。
- 编译完成后,您可以运行任意数量的工具,这些工具会生成 XML 文件,供 CruiseControl 读取。
- CruiseControl 将 XML 输出与自身输出合并,以生成网站结果。
- 完成了!
背景
首先,您需要一个专用的机器作为您的构建服务器。它不需要是高性能的,但需要有一定的配置。在我家里,我有一台运行 Windows XP、配备 512MB RAM 的旧 EMachine,它运行得非常好。您还需要安装 IIS 和 .NET Framework SDK。
设置好之后,我们就可以开始设置文件系统了。
1. 为所有工具创建一个基础目录
我一直使用的基础目录是 _C:\CI\_。我还会创建一个目录,用于存放您所有的项目。理想情况下,这应该放在 CruiseControl 的根目录之外,因为默认情况下 CruiseControl 会将您的项目隐藏在服务器目录中,我个人不喜欢这样。我的项目根路径是 _C:\CI\Projects\_。
2. 下载并安装工具
CruiseControl.NET
选择设置 IIS 虚拟目录。安装完成后,您可以选择安装 CCTray,它会在您的本地机器系统托盘中安装一个应用程序,该应用程序会定期检查构建服务器是否有损坏的构建。不知何故,在安装 Cruise Control 后,我必须进入服务管理器并手动启用 CruiseControl 服务,它没有自动启动。
Subversion/Source Control Access
我使用 Subversion,您需要安装它,这样 CruiseControl 才能从您的源代码存储库中获取最新签入的代码。如果您想使用 Visual SourceSafe,那么 CruiseControl 也有相应的配置,并且 CruiseControl 支持许多其他类型的源代码管理系统。
CCNetConfig (感谢下面的评论中的 Camalot Designs)
我个人还没有试过这个工具,但正如 Camalot 在下面的评论中所说,它是一个用于创建和编辑 ccnet 配置文件(XML)的 GUI 工具。整个 CruiseControl/NAnt 过程中最困难的部分之一就是设置 XML 配置文件,这个工具应该能让这一部分变得容易得多。
NAnt
在构建项目时,您可以使用 MSBuild 或 NAnt。使用 NAnt 的唯一问题是它目前无法构建解决方案 (*.sln) 文件。这使得使用 NAnt 完成整个构建过程变得更加困难。我相信这是可以做到的,但我个人从未走过这条路。所以我采用的方法是让一个 NAnt 任务启动一个 MSBuild。这就是下面的 nant-contrib 发挥作用的地方。MSBuild 任务可以构建您的主解决方案文件。
NAnt-Contrib
要设置 NAnt-Contrib,只需将 _NantContrib\bin_ 中的所有程序集复制到 _NAnt\bin_。或者,您也可以直接将 _NantContrib\bin_ 注册到您的 PATH 环境变量中。NAnt-Contrib 包含其他人随时间贡献的附加 NAnt 任务。其中一些任务相当有用,例如 <nunit> 任务和 <msbuild> 任务。
NUnit
使用 _nunit-console.exe_ 对您的测试项目执行单元测试,并将结果输出到 _artifacts_ 目录。
NCover
检查您的测试代码覆盖率。这个 MSI 不提供安装路径选项,所以一旦安装,您应该将其移动到您的 _CI_ 目录。
NCoverExplorer/NCoverExplorer Extras
它会生成一个非常漂亮的 NCover 输出页面,包含精美的条形图等。
与 ncover 在 CruiseControl 中提供的标准文本输出相比,它能更好地展示您的代码覆盖率。_NCoverExplorer_ Extras 包含用于构建漂亮的 ncoverexplorer 输出的 NAnt 任务。为了设置它,只需将 _NCoverExplorer.NAntTasks.dll_ 复制到您的 _NAnt\bin_ 目录,NAnt 就可以在运行时找到这些任务。
请按照 _NCoverExplorer.Extras\CruiseControl.Net\readme.txt_ 中的说明进行操作,它会告诉您将 XSL 文件放在哪里,以便 CruiseControl 可以读取它们,从而获得漂亮的输出。
FxCop
检查您的代码是否符合可接受的模式和实践指南。(我个人对此持保留态度,尽管它已被证明很有用。)
将文件添加到您的 PATH 环境变量
至少,将 _NAnt\bin\_ 文件夹添加到您的 PATH 环境变量中,您可以根据需要添加其他工具。从长远来看,这将使设置 NAnt 构建文件更加容易。
完成所有这些步骤后,请重新启动计算机,以确保所有应用程序都已正确设置并且您的 PATH 已刷新。
3. 配置 Cruise Control
打开 _C:\CI\CruiseControl.net\server\ccnet.config_,此文件包含 Cruise Control 要监视的所有项目。它还包含有关在发现项目更改时要运行的 _<task>_ 的设置,例如:
<tasks>
<nant>
<executeable>c:\ci\nant\bin\nant.exe</executeable>
<buildfile>path\to\default.build</buildfile>
<targetList>
<target>all</target>
</targetList>
</nant>
</tasks>
接下来,重新启动 CruiseControl 服务以应用我们对 _ccnet.config_ 所做的更改,然后启动 CruiseControl 网站,并确保我们的项目显示出来。您的项目 _根_ 文件夹现在应该包含从存储库签出的完整代码。
CruiseControl 将使用此设置在您在 _ccnet.config_ 中定义的任何时间间隔来查找更改。
如果您的代码未签出,您可以转到网页上的“查看服务器日志”来查看问题所在。一旦 Cruise Control 检测到新项目,它将创建项目文件夹和 artifacts 目录,然后自动连接到您的源代码管理存储库并将最新源代码下载到“_trunk_”文件夹。
此时,您应该可以通过 Web 浏览器访问您的 CruiseControl 服务器。您的项目应该会显示出来,即使它显示“失败”或“未知”,因为我们还没有设置构建文件。如果不是这样,请在继续操作之前检查以上所有选项,因为接下来的步骤会更复杂。
现在,我在学习 NAnt 时用过的最好的建议是创建一个 _*.bat_ 文件来 _仅_ 运行您的 _*.build_ 文件。这将暂时排除 CruiseControl,直到您确信您的项目能够正确构建。然后,您可以继续尝试通过 CruiseControl 自动化构建。这有助于排除其他未知因素。
我通常将其放在 _C:\CI\Projects\startnant.bat_,并在将新项目添加到 CruiseControl 之前更改构建文件,以便我能够确信 NAnt 的一切正常工作。
这是一个示例 _*.bat_ 文件:
nant.exe c:\ci\projects\united\default.build
现在是 _default.build_ 文件。这是全部内容。基本上,最简单的阅读方法是查找:
<target name="all" depends="clean,get,build,tests,reporting" />
这是任务运行的顺序。所以任务将按顺序运行:
clean - get - build - tests - reporting。
如果其中任何一个在任何时候失败,它都会停止执行,除非您将其设置为:_failonerror="false"_, 这种情况下它将继续执行。
附加的 _default.build_ 文件几乎可以用于任何项目,只需更改顶部的属性以匹配您的配置,然后将其放入项目根目录。然后使用您之前创建的 BAT 文件进行测试。
您会注意到我在末尾注释掉了 FxCop 部分。这是因为在撰写本文时,我还没有设置 FxCop 项目,但想向您展示如何配置该部分。
此时,您应该能够运行您的 BAT 文件,看到构建完成并在 _Project\artifacts\_ 目录下生成大量输出文件。这引导我们进入下一节。
我们最后要做的是告诉 CruiseControl 将此输出与自身“合并”,以便结果显示在 CruiseControl 网站上。
要做到这一点,请打开 _C:\CI\CruiseControl.NET\server\_ 下的 _ccnet.config_ 文件,并添加以下行:
<publishers>
<merge>
<files>
<file>C:\CI\Projects\United\artifacts\*.xml</file>
<file>E:\CI\Projects\United\artifacts\CoverageReport.xml</file>
</files>
</merge>
<xmllogger />
</publishers>
将此放在您的 _<project>_ 节点内。它将合并所有 XML 文件和一个名为 _CoverageReport.xml_ 的文件到 CruiseControl 的输出中。
您现在应该访问您的 CruiseControl Web 控制台,强制进行构建并观察其完成。然后,您可以浏览项目并查看所有不同的报告。
关注点
您第一次尝试让这一切正常工作时,一定会把头撞在墙上。我花了 2 天时间才第一次成功编译。主要是因为我的项目文件夹结构不佳。不正确的文件夹结构使得一次性构建解决方案更加困难。我建议在您的项目根目录中创建一个 _"SharedLibs"_ 文件夹来存放所有依赖项。这样,您就不必在每次更改程序集时都将它们放置在构建服务器的特定位置。您所有的程序集都将纳入源代码管理,位于您的项目根目录之下。这听起来有些奇怪,因为您在源代码管理中重复了文件,但这是最简单且推荐的做法,因为这样您就可以随时更改依赖项。
正如我一开始所说,这对任何开发者来说都是必需的。无论是否团队。它提高了我的生产力,仅仅是因为当我的老板来找我要求查看项目的工作副本时,我只需从构建服务器复制最新的源代码。仅此一点就值得称赞。
所有这些工具结合起来非常强大,而且由于 CruiseControl,我们可以将它们整合到一个易于使用的界面中。设置过程有点令人生畏,我花了相当长的时间才弄清楚所有东西是如何协同工作的。这里的关键是阅读所有工具的文档。尤其是 NAnt 和 CruiseControl。NAnt 的功能远不止我在此描述的。我发布的构建文件只是一个非常基础的入门级构建文件。您可以用 NAnt 做更多的事情,所以请务必阅读文档!
我希望这篇文章对某人有所帮助。我一直想写这篇文章,我不得不在家里设置另一个构建服务器,并花时间边走边写这篇文章,同时也完成了这个过程。
祝好!
历史
- 2007/4/28 - 文章首次发布
- 2007/4/29 - 添加了 CCNetConfig 工具信息,感谢 Camalot Designs。谢谢!