使用 CruiseControl.Net 进行持续集成






4.85/5 (11投票s)
本文介绍了使用 CruiseControl.Net 对 Asp.net 应用程序进行持续集成。
引言
我被分配了一项任务来自动化构建过程,因为我们每天都要花费大量时间进行构建,有时这会容易出错。所以我们决定使用 CruiseControl.Net,因为它是一个简单、免费且开源的工具。
在自动化构建之前,我们通常会遇到手动构建的问题,即从部署服务器复制文件到 DEV、QA、STAGE 和 PRODUCTION 服务器,有时我们还会因为在同一天进行多次构建而感到沮丧,这既耗时又令人紧张,而且有时不容易重复或容易回滚。
在本文中,我们将学习如何使用 CruiseControl.Net 设置 CI,让它完成我们要求的所有任务。当在源代码管理中检测到更改时,CCNet 会自动进行构建,它会从 VSS 存储库获取源代码,为我们进行构建,将代码部署到远程服务器,最后向我们发送通知电子邮件。
本文完全面向初学者
所以,下面是本文将要涵盖的内容
-
下载并安装 CruiseControl.Net
-
下载并安装 MSDeploy 2.0
-
配置 CruiseControl.Net
下载并安装 CruiseControl.Net
要设置 CI,您必须下载最新的 CruiseControl.Net 工具并将其安装到您的部署或本地服务器上。安装完成后,请确保
1. CCNET 应用程序在 Internet Information Services (IIS) 管理器中可用
2. “CruiseControl.NET Server”已安装在您的服务中
下载并安装 MSDeploy 2.0
下载并安装 MS Deploy 2.0 版本。 Web Deploy (msdeploy) 简化了 Web 应用程序和 Web 站点到 IIS 服务器的部署。 CCNet 使用 Web Deploy 来同步 IIS 服务器。您需要在部署服务器和环境服务器中安装 MSdeploy 以同步文件。
配置 CruiseControl.Net
我们将要讨论的所有配置文件都放置在或将要放置在
C:\%ProgramFiles%\CruiseControl.NET\server
CruiseControl.NET 附带两个可执行组件:ccservice.exe,它是 Windows 服务;和 ccnet.exe,它是一个用于测试的控制台应用程序。调试控制台应用程序比调试服务容易得多,所以我强烈建议您使用 ccnet.exe 进行初步测试,并仔细阅读控制台输出以熟悉 CCNet 的行为和异常。
此外,服务器组件(Windows 服务或控制台应用程序)都查找名为 ccnet.config 的文件,您将在其中放置 CCNet 所需的所有实际信息,以了解它应该做什么以及如何做。
以下是我们将要配置的配置块
- 项目块
- 源代码管理块
- 触发器块
- 标签器块
- 任务块
- 发布者块
1. 项目块
首先,我们需要为项目配置块的根节点分配一个唯一的名称:<project>
标签。此标签将帮助我们区分其他项目。
<cruisecontrol> <project name="Hello World Sample"> <artifactDirectory>D:\CruiseControl.Net\Artifact Directory\</artifactDirectory> <workingDirectory>D:\CruiseControl.Net\Working Directory\Hello World</workingDirectory> </project> </cruisecontrol>
<ArtifactDirectory>
:用于存储输出日志文件
<WorkingDirectory>
:包含您可能希望 CruiseControl.NET 执行的所有可执行文件。
2. 源代码管理块
源代码管理配置块告诉 CCNet,名为“Hello World Sample”的项目绑定到 VSS - Visual Source Safe。
<sourcecontrol type="vss"> <executable>C:\Program Files\Microsoft Visual SourceSafe\ss.exe</executable> <project>$/Article/Hello World/HelloWorld</project> <username></username> <password></password> <ssdir>D:\VSS</ssdir> <workingDirectory>D:\CruiseControl.Net\Working Directory\Hello World</workingDirectory> <cleanCopy>false</cleanCopy> </sourcecontrol>
这意味着执行此项目时执行的任务取决于该特定 VSS 存储库的状态。
<Executable>
:包含 VSS 的可执行组件。
<Project>
:包含 VSS 中项目的目录。
<Username>
和 <Password>
:用于访问 VSS 以获取最新副本
<ssdir>
:包含 srcsafe.ini 文件的父路径。
3. 触发器块
需要一个触发器块来指定 CruiseControl.NET 何时启动新的集成周期。
我们希望持续检查存储库状态,因此我们需要一个“间隔触发器”来告诉 CruiseControl.NET 在指定时间后定期执行集成
<triggers> <intervalTrigger name="Subversion" seconds="10" /> </triggers>
name
属性由 CruiseControl.NET GUI 用于识别请求构建的触发器;seconds
属性是触发下一个集成周期前的时间量。
每次时间间隔结束后,CCNET 都会检查修改,并且默认情况下,仅在检测到更改时才运行集成。
4. 标签器块
在每个集成周期都会创建一个标签;用于标识发生的特定构建。可以使用不同的标签器来生成 CCNet 将用于跟踪构建的标签。
除了 CruiseControl.NET 发行版附带的标签器块之外,许多人还提供了插件标签器块,以针对特定格式生成标签。
<labeller type="defaultlabeller"> <initialBuildLabel>1</initialBuildLabel> <prefix>HelloWorld-</prefix> <incrementOnFailure>false</incrementOnFailure> <labelFormat>00000</labelFormat> </labeller>
5. 任务块
任务块代表项目构建实际发生的方式。
<tasks> <msbuild> <executable>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</executable> <workingDirectory>D:\CruiseControl.Net\Working Directory\Hello World</workingDirectory> <projectFile>Hello World.csproj</projectFile> <buildArgs>/t:Build /p:OutDir=D:\\CruiseControl.Net\\PublishedFiles\\;Configuration=Release;UseWPP_CopyWebApplication=True;PipelineDependsOnBuild=False;WarningLevel=0</buildArgs> <targets></targets> <timeout>900</timeout> </msbuild> <buildpublisher> <sourceDir>D:\CruiseControl.Net\PublishedFiles\_PublishedWebsites\Hello World</sourceDir> <publishDir>D:\CruiseControl.Net\Backup</publishDir> <useLabelSubDirectory>true</useLabelSubDirectory> </buildpublisher> <exec> <executable>msdeploy.exe</executable> <baseDirectory>C:\Program Files\IIS\Microsoft Web Deploy V2</baseDirectory> <buildArgs>-verb:sync -source:contentPath=D:\CruiseControl.Net\PublishedFiles\_PublishedWebsites\Hello World -dest:contentPath="Hello World",computerName=YaminPC,username=username,password=password</buildArgs> </exec> </tasks>
我们将任务板分为 3 部分。
- 进行构建
- 进行备份
- 部署到远程桌面
a. 进行构建
在我们的示例中,我们将使用 MsBuild 任务来完成我们项目的主要目的,即编译版本化的 Visual Studio 项目文件。
请确保您提供输出路径目录,并使用“\\”斜杠。此任务执行完成后,您将在指定路径中找到已发布的文件。
下面是 MSBuild 任务的 XML 定义
<executable>:包含 MSBuild 可执行文件的路径。
<workingDirectory>:这是 MsBuild 将运行的目录,因此它必须是包含我们项目已检出工作副本的目录。
<projectFile>:这是要构建的项目名称。MsBuild 接受 Visual Studio 解决方案文件作为要构建的项目文件。显然,MsBuild 任务也接受它。
<buildArgs>:此行提供额外的命令行参数给 MsBuild。我们将指定输出目录,并告诉 Msbuild 删除代码中的任何警告(如果有的话)。
b. 进行备份
构建完成后,您可能需要对其进行备份,以便如果下一次相应的构建出现任何问题,您可以回滚到现有构建的更改。
BuildPublisher 任务仅在 MSBuild 任务成功运行后才会运行。
<sourceDIR>
:指定已发布文件的源
<publishDIR>
:指定要移动文件的目标。
c. 部署到远程桌面
构建文件发布并备份完成后,最后一个任务是将文件部署到远程桌面。如果您提供正确的参数,MSDeploy 将简化您的工作。
<Executable>
:应为 MSbuild.exe 的文件名
<BaseDirectory>
:包含 Msbuild 的 URL。
<BuildArgs>
:包含告诉 MSbuild 执行特定任务的参数。源会告诉从何处获取文件,而 Dest 会告诉 MSbuild 将文件放置到相应的位置。
<sourceDIR>
:指定已发布文件的源
<publishDIR>
:指定要移动文件的目标。
如果您仔细查看部署任务的配置文件,您会发现“ContentPath”,它不过是 IIS 管理器中的网站名称,或者可以是您远程桌面的文件夹路径。
6. 发布者块
<publishers> <xmllogger /> <statistics /> <email from="AutoBuild@xxx.com" mailhost="xx.xxx.xxx.xx" mailport="xx" includeDetails="TRUE"> <users> <user name="Yamin" group="buildmaster" address="yaminkhakhu.y@xxx.com" /> <user name="Khakhu" group="developers" address="yaminkhakhu.y@xxx.com" /> </users> <groups> <group name="developers"> <notifications> <notificationType>Fixed</notificationType> <notificationType>Success</notificationType> </notifications> </group> <group name="buildmaster"> <notifications> <notificationType>Always</notificationType> </notifications> </group> </groups> </email> </publishers>
<xmllogger>
:用于使 Web 面板正常工作。
<statistics>
:它收集并更新每次构建的统计信息。您可以通过单击 Web 面板左侧的“查看统计信息”来查看它们。
<email>
:用于定义 SMTP 服务器配置
<group>
:用于定义 SMTP 服务器配置
还有不同类型的通知可用,您可以根据您的需要定义它们并分配给每个用户组。
关注点
我们团队中所有的项目源都已实现自动化构建。
历史
2014 年 10 月 7 日 - 创建
2014 年 10 月 8 日 - 更新损坏的图片