使用 CruiseControl.net 进行持续集成






4.33/5 (11投票s)
讨论了持续集成的优势,并详细介绍了自动化单元测试和文档。包含示例构建文件和配置。
引言
我将与您谈论持续集成;有些人更喜欢“持续构建”这个术语。我将不深入讨论集成整个系统,而是专注于集成构成一个独立应用程序的各个类和程序集。
CruiseControl.net 是我将要特别讨论的应用程序。最基本地说,它可以简单地用于创建自动构建,至少可以证明该应用程序可以在开发服务器上编译,而不仅仅是在开发人员自己的桌面上编译。
为项目设置持续集成需要一些时间和精力,但最终结果是您可以变得更加懒惰:只需让自动化流程为您完成所有工作。
背景
那么,您为什么要首先实现持续集成呢?好吧,它消除了许多关于集成由单个开发人员创建的代码并随后需要集成到最终应用程序中的担忧。通过在干净的机器上构建应用程序,任何丢失的文件或依赖项都会被立即识别出来,因为这些都会导致构建失败。持续集成不必仅限于构建软件。它还可以自动化单元测试(例如 Nunit)、代码覆盖率(例如 Ncover,它指示单元测试实际测试了多少代码)、文档(例如 Sandcastle)和标准合规性(例如 fxCop)等。
现在您可以看到这种自动化的真正价值。开发人员可以更加确信他们提交到源代码控制的代码能够成功构建,并且只要有足够的代码覆盖率,就不会破坏过程中的其他代码。
我必须指出,此过程不测试 GUI 的显示,仅测试功能。因此,它不能取代所有手动测试,但它涵盖了很多内容。
Using the Code
注意:出于安全原因,本文中的服务器名称、UNC 路径和 URL 已被隐匿。同样,示例文件中的路径也是虚构的。您需要根据您的安装情况替换“myServer”和“MyDirectory”的引用。
CruiseControl.net
JetBrains 的 TeamCity 非常适合大型项目,在这些项目中,您需要允许多个团队修改构建引擎的配置。但是,由于这是一篇关于持续集成的入门文章,我选择使用 CruiseControl.net,它是免费且易于使用的。
Web Dashboard 是一个运行在 IIS 上的 ASP.NET 应用程序。它为您提供了所有构建的详细信息,包括关于单个构建的报告和统计信息。请参见下面的屏幕截图

这是一个单元测试统计信息页面的示例

这是一个构建报告

Cruisecontrol 托盘
CruiseControl.net 自带一个客户端应用程序,显示在系统托盘中,可以通过双击图标查看:

这是应用程序

好的,在这个窗口中您将看到四个独立的构建。底部的三个构建是为一个应用程序创建的。我将讨论这三个,因为它们是最有趣的。
SSE Main Build 仅构建整个应用程序。它每 30 秒运行一次,查找任何已提交到源代码控制的新代码。
SSE-NightlyBuild 创建一个应用程序版本,这是可以在服务器本身上运行的最新构建。它还执行所有单元测试。该构建每天凌晨 1 点运行。
SSE-Documentation 仅从每个程序集构建时创建的 comments.xml 文件中创建所有文档。这依赖于开发人员使用 XML 注释和在方法或属性之前使用的预定义标签充分注释其代码。
您可以选择查看任意数量的构建,并且它们不必位于同一个 CruiseControl.net 服务器上。为此,请右键单击 CCTray 图标并选择“设置”:

现在您可以添加一个 CruiseControl.net 服务器以及它拥有的任何您希望监视的构建。
如果任何或所有构建正在进行中,图标将变为橙色。构建完成后,图标将为绿色表示成功,或为红色表示出现错误。Cctray 窗口本身也使用相同的颜色代码。
Nant / MsBuild
为了创建这些构建,您需要编写一些构建脚本。我使用了 nant 0.85 版本。这不是最新版本,但我遇到了更高版本的一些问题,而且这个版本能完成工作,所以我一直用它。
请查看 SSE.build(包含的文件)。您会注意到我在每个目标中都包含了构建 comments.xml 文件。此外,名为 UnitTests 的 .NET 程序集是单独调用的。这是因为该项目不包含在解决方案的发布构建中,而是包含在调试构建中。
在使用 msbuild 时,我还遇到了有关注册表键的问题。这是解决方法
Edit the registry adding sdkInstallRootv2.0 to
LocalMachine\SOFTWARE\Microsoft\.NETFramework\sdkInstallRoot
and point it to the folder where the sdk exists on that computer e.g.
c:\windows\Microsoft.net\Framework\v2.0.50727\
Copy lc.exe to the bin subdirectory of the sdkInstall folder if it isn't there already
注意:除非您遇到问题,否则无需执行上述操作。
Sandcastle
Sandcastle 是 Microsoft 的工具,通过创建 *.chm 文件和类似 MSDN 的页面来自动化类文档。
为了构建所有程序集的文档,您需要编辑 Sandcastle.config 文件并添加其他数据文件元素。请参见 sandcastle.config 文件中的第 74-93 行。
接下来,您需要编写一个 nant 脚本来调用 Sandcastle。这相当复杂,所以我包含了示例 SSE_Documentation.build
。
Nunit
我喜欢单元测试,它们创建起来可能有点麻烦,但我认为它们与使用源代码控制一样必要,而且大多数开发人员都会同意很难想象没有它的生活。
除了确保您的代码按其说明的那样工作之外,单元测试在您希望将应用程序与它通信的任何其他系统隔离进行测试时非常有用。我使用 NUnit 来测试此应用程序,而无需服务器。由于我从包含虚拟数据的本地文件读取,而不是等待服务器 SOAP 调用的结果,因此它也能更快地完成测试。
单元测试原理
原子测试 – 每个测试应仅测试一个属性或方法,并且只有一个预期的结果。应为每个方法或属性创建一个新测试,并为每个方法的边界添加附加测试。
测试用例 – 可以编写单元测试来证明测试用例。这些测试基于特定的用例。例如,如果一个用例包括用户登录应用程序、查看一些数据然后注销,那么测试用例应遵循相同的步骤。
我选择将所有单元测试放在一个程序集中,因为这使得测试自动化非常容易,但是您可能选择为应用程序的每个逻辑层或层创建单独的程序集。这会增加一些自动化工作,但确实意味着您的组件保持独立,开发人员可以独立运行测试。
nunit 框架附带了自己的 MockObject,但不支持事件和泛型等功能。您可以尝试使用 Rhino Mocks。我没用过它,但它的评价很好。
测试驱动开发是指您先编写单元测试,然后再编写要测试的代码。这可以让您的注意力集中在每个方法的确切用途上,并有助于防止创建不必要的代码。这确实需要一些思维方式的转变,并且在进行不需要单元测试的错误修复后,试图重新开始是一个问题。
也许寄希望于开发人员有时间为现有代码编写单元测试是过于乐观的。Visual Studio 2005 Team edition 确实提供了一个单元测试向导,可以创建单元测试的基础,从而减轻工作负担。也许还有其他类似的开源应用程序。
由于已经有很多关于单元测试和 NUnit 的文章,我在这里不赘述。够说的是,自动化您的测试可以确保它们被定期运行。
您会发现在 ccnet.config 文件中的 SSE-NightlyBuild 项目中,Nunit 直接从 CruiseControl.net 调用,使用 <nunit> 标签作为 <tasks> 的子级。
在新服务器上使 CruiseControl.net 生效所需的任务
这假设您使用的是 Windows 服务器
CruiseControl.net
html workshop
nant
nunit
msbuild
perforce P4V
Sandcastle
使 WebDashBoard 与 IIS 协同工作
确保服务器上安装了 ASP.NET:转到“添加/删除程序”,选择“添加/删除 Windows 组件”,选择“应用程序服务器”,然后单击“详细信息”。确保勾选了 ASP.NET。

如果您在安装 .NET Framework 后安装了 IIS,则需要将 ASP.NET 注册到 IIS。您可以通过运行位于 \Windows\Microsoft.NET\Framework\v2.0.50727\ 下的 aspnet_regiis.exe -i 工具来完成此操作。
在 IIS 管理器中,转到“Web 服务扩展”,确保 ASP.NET v2.0.* 已允许,并且其他任何版本都已禁止。

有用链接
- CruiseControl.net
- TeamCity
- Nant
- Sandcastle
- Nunit
- 测试驱动开发
- 要创建自动化测试用例,您可能需要查看用 Ruby 编写的 Cucumber
历史
- 2009 年 3 月 7 日:初始发布