使用 CruiseControl.Net 和 MSBuild 自动化 ASP.NET Web 应用程序项目构建
本文描述了如何使用 CruiseControl.Net 和 MSBuild 自动化 ASP.NET Web 应用程序项目的构建
引言
我最近接触了 CruiseControl.Net,并一直在使用它来进行团队的构建自动化。在深入研究配置的细节之前,让我解释一下我的开发环境。我们使用的是 Visual Studio 2005 Web 应用程序项目。它遵循三层(表示层、业务层、数据访问层)架构。我通常遵循 Visual Studio IDE 的“构建 -> 发布 <Web 网站>”选项来构建项目并将构建传递给测试部门。此选项允许将应用程序发布到通过“发布 Web”对话框设置的特定磁盘路径。
背景
使用 CruiseControl.Net,我需要一种方法来自动化这个过程。在本文中,我解释了如何使用 Microsoft 的构建引擎 MSBuild 来实现。在这里,我想声明一下,这可能不是自动化构建的最佳方法。我只是描述了我的做法,并且它对我有用。希望它听起来有意义,并且对某人有所帮助。
描述
以下是我的 MSBuild 脚本的内容
<Project DefaultTargets="DoPublish"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SourceFileRootFolder>$(CCNetWorkingDirectory)</SourceFileRootFolder>
<WebFolder>MyProject.Web</WebFolder>
<ReleaseFolder>c:\TestDeploy\v$(CCNetLabel)</ReleaseFolder>
</PropertyGroup>
<PropertyGroup Condition ="$(CCNetWorkingDirectory) == ''">
<SourceFileRootFolder>c:\testcc</SourceFileRootFolder>
<ReleaseFolder>c:\TestDeploy\v</ReleaseFolder>
</PropertyGroup>
<ItemGroup>
<DefaultBinFiles Include="$(SourceFileRootFolder)\DefaultBinFiles\*.*"/>
<ProjectBinFiles Include="$(SourceFileRootFolder)\$(WebFolder)\bin\*.*"/>
</ItemGroup>
<Target Name="CleanSource">
<Message Text="Removing all source files from $(ReleaseFolder)" />
<RemoveDir Directories="$(ReleaseFolder)" />
</Target>
<Target Name="DoPublish">
<MSBuild Projects="$(SourceFileRootFolder)\MyProject.sln" Targets="Clean;Build" />
<CallTarget Targets="CleanSource"/>
<MSBuild Projects="$(SourceFileRootFolder)\$(WebFolder)\MyProject.Web.csproj"
Targets="_CopyWebApplication;_BuiltWebOutputGroupOutput"
Properties="OutDir=$(ReleaseFolder)\" ></MSBuild>
<Copy SourceFiles="@(DefaultBinFiles)"
DestinationFolder="$(ReleaseFolder)\$(WebFolder)\bin\"></Copy>
<Copy SourceFiles="@(ProjectBinFiles)"
DestinationFolder="$(ReleaseFolder)\$(WebFolder)\bin\"></Copy>
</Target>
</Project>
我保留一个单独的文件夹“DefaultBinFiles”,我希望将它的内容放置在构建的 bin 文件中。这可能包含缓存在项目或项目中使用的其他 com 引用的任何第三方程序集的副本。ProjectBinFiles 包含在项目的 bin 文件夹中创建的程序集。
MSBuild 元素执行解决方案的清理构建。CleanSource
删除发布文件夹。下一个 MSBuild 命令指示执行 _CopyWebApplication
和 _BuildWebOutputGroupOutput
目标。这些目标可以在 Program Files\MSBuild\Microsoft\VisualStudio\v8.0\WebApplications\Microsoft.WebApplication.targets 中找到。这还需要对 Web csproj 文件进行调整。将以下部分添加到 csproj 文件中,放在 Project 标签之间的任何位置。请注意,csproj 文件实际上是一个 MSBuild 脚本。
<PropertyGroup>
<WebProjectOutputDir>$(OutDir)\$(MSBuildProjectName)</WebProjectOutputDir>
</PropertyGroup>
默认情况下,构建输出放置在 _PublishedWebsites 子文件夹下。以上部分消除了这种情况,并将构建直接放置在 ReleaseFolder 标签中设置的自定义文件夹下。脚本中的接下来的两个 copy 元素递归地将 DefaultBinFiles 和 ProjectBinFiles 文件夹的内容复制到 ReleaseFolder 的 bin 文件夹。
将以下 XML 添加到 ccnet.config 文件
<msbuild>
<executable>C:\WinNT\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
<workingDirectory>c:\TestCC\</workingDirectory>
<projectFile>MSBuild.xml</projectFile>
<targets>DoPublish</targets>
<timeout>300</timeout>
<logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,
ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>
如您所见,CruiseControl.Net 被指示使用 msbuild 来执行在 c:\TestCC\MSBuild.xml 中提供的构建任务。DoPublish
是要执行的目标。
结论
遵循上述 MSBuild 配置会将 ASP.NET Web 应用程序项目的构建输出放置在磁盘上的特定文件夹中,并将它链接到 CruiseControl 会自动执行整个构建过程。有关设置 CruiseControl.Net 的信息,请参阅 如何为初学者设置 CruiseControl.NET。