Welcome

首页 / 软件开发 / 数据结构与算法 / 自动化构建的那些事儿:金融网站虚拟案例

自动化构建的那些事儿:金融网站虚拟案例2013-11-17 infoq Joe Enos 译:邵思华介绍

本系列的第一部分讨论了将你的构建和部署流程自动化的部分好处。促使你这样做的理由有很 多:让你的开发者更关注于核心业务而不是流程管理、减少人为因素导致的错误、减少部署花费的时间以及其 它很多原因。无论你的动机如何,自动化你的构建流程永远是正确的回答。

本篇文章中,我们将以一 个虚拟的金融机构的企业网站作为示例,将其构建过程一步步完全自动化。

案例描述

我们的公 司叫做第三国民银行(3rd National Bank),是一家本地商业机构。我们的在线银行应用包括前端web应用层 (ASP.NET),可接入移动应用的RESTful服务层(WebAPI),一系列使用了传统的领域驱动设计方式来分离业 务逻辑、领域对象及数据访问的内部服务层(WCF),以及一台SQL Server数据库。

软件团队使用 Mercurial作为源代码控制系统,并使用特性分支的策略定期交付新特性。该策略为每个新特性或bug创建一个 新分支,分支代码在测试完成后就会合并入主分支等待发布。

在现阶段,所有的构建和部署过程都是 由软件团队手动完成的,导致开发者每周都得花费几个小时,停下手上的编码工作去维护他们的资源库和服务 器。我们在尝试改变现状,尽可能多的将过程自动化。

构建脚本

构建脚本是自动化构建过程的 第一步。脚本的形式可以是多种多样的:可以是shell或者批处理文件、基于XML的文件,或者由现有或定制的 编程语言所写;可以手写或自动生成;也可以完全从IDE环境中隐藏。你的流程甚至可以组合使用多种技术。 在这篇示例中,我们使用NAnt作为构建脚本引擎。

 

在我们的环境中 ,前端web应用、暴露给外部的服务以及内部服务各是一个独立的Visual Studio解决方案,另外SQL数据库也 是一个独立的database解决方案。我们将创建一个主构建脚本文件3rdNational.Master.build,看起来差不多 是这样:

<project name="3rd National Bank" default="build"> <target name="build"> <call target="createStagingEnvironment" /> <nant buildfile="BankDB/BankDB.build" target="build" /> <nant buildfile="ServiceLayer/ServiceLayer.build" target="build" /> <nant buildfile="OnlineBanking/WebUI.build" target="build" /> <nant buildfile="ExternalServices/ExternalServices.build" /> </target></project>
这段脚本没有做什么具体的事,它仅仅是调用了那四个解决方案的构建脚本。每个解决方案都有一 个构建文件,其中包含了编译及准备这一部分应用程序的所有代码。

现在让我们来看一看其中一个解 决方案的构建脚本。每个解决方案都基于相同的基本步骤:准备、编译及暂存。ServiceLayer.build就是一个 基本的编译脚本,它的语法也非常容易理解:

<project name="ServiceLayer"> <property name="msbuildExe" value="c:windowsmicrosoft.netframeworkv4.0.30319msbuild.exe" /> <target name="build"> <call target="prepare" /> <call target="compile" /> <call target="stage" /> </target> <target name="prepare"> <!-- Implementation omitted --> </target> <target name="compile"> <exec program="${msbuildExe}"> <arg value="ServiceLayer.sln" /> <arg value="/p:Configuration=Release" /> <arg value="/t:rebuild" /> </exec> </target> <target name="stage"> <copy todir="../deploy/BankWcf"> <include name="WcfServices/**/*.svc" /> <include name="WcfServices/**/*.asax" /> <include name="WcfServices/**/*.config" /> <include name="WcfServices/**/*.dll" /> </copy> </target></project>
准备步骤可以包括生成AssemblyInfo文件、重编译代理或者任意数量的其它任务。这个例子里的编译步骤 仅仅是简单调用了MSBuild,这是Visual Studio用来编译解决方案的构建引擎。当构建的每一步骤成功后,最 后一步会把生成的文件复制到某个暂存区域,留待之后使用。

对于其它三个解决方案我们也采取同样 的做法,只是基于不同的项目类型作些微调。

编写构建脚本其实和写代码一样,可以通过不同的做法 达到同样的效果。你可以直接使用命令行编译器替代MSBuild,也可以分别构建每个项目文件而不是整个解决 方案,还可以使用MSDeploy来暂存或部署你的应用程序,取代过滤及复制文件的方式。说到底,这取决于你适 应于哪种方式。只要你的脚本能生成一致的结果,怎样编写都可以。