上一篇文章是简单的介绍了ccnet的部分设置,已经完成的设置有:
1:获取源代码 ,sourcecontrol 节点有所体现。推荐使用svn,感觉它在DOS下面调用会简单些。
2:编译工程。tasks/msbuild,主要是让msbuilder来完成,其实msbuilder远不止这个编译功能,像网站的发布功能它都有。
3:部署文件。tasks/nant。这正是这篇需要重点介绍的内容。
nant工具功能非常全,也能获取完成获取源码和编译的工作,但这里我只应用它的部署文件功能。因为nant虽然功能强大,但均是DOS命令操作,用作主流程对普通用户来说有难度。
nant最核心的就是它的build脚本文件了,这里简单的介绍下文件结构。
1:build:XML格式,每个build文件包含一个project,project有若干target,每个target包含若干task 。但每个具体的task并不是包含在target标签中,而是平级关系。
2:Projects:工程节点,相关属性如下:
1>:name:工程名称。
2>:default:指定默认的target。
3>:basedir:设置build文件的父目录。
3:Targets:目标、对象,target是nant脚本具体执行动作的最小单位,包含一系列的task。相关属性如下:
1>:name,任务名称。
2>:depends,当前targets所依赖的target,支持多个,中间用","分开。
3>:if,判断语句,如成立则执行此target。
4>:unless,如果条件不成立则路过target。
5>:description,相关描述。
4:Properties:属性。一个project可能有多个属性。主要是用来定义一些全局变量。例如:
<
property name
=
"
base.dir
"
value
=
"..
/../20091030_NationalDay/src
"
/>
<
property name
=
"
deploy.dir
"
value
=
"..
/../deploy/web
"
/>
5:Task:具体任务,即执行的具体代码块。例如:意思是把一个目录下的所有后缀为dll的文件复制到另外一个目录中。
<
copy todir
=
"
${deploy.dir}/bin
"
>
<
fileset basedir
=
"
${base.dir}/Hotel/bin/
"
>
<
include name
=
"
*.dll
"
/>
</
fileset
>
</
copy
>
之前已经说明过,我利用nant只用了它部署文件的功能,nant有一个非常好用的命令"copy",它只会复制比参考版本文件新的或者是不存在的文件。支持单个文件复制和文件夹的复制。这里正旧利用它的部署功能,可能把有修改的文件分别复制到你指定的目录中,目前有很多公司都喜欢把图片单独分开,形成一个独有域名,例如:image.a.com,图片文件和工程文件并不在一个目录下面,这里nant就能轻松胜任。
<
copy todir
=
"
${deploy.dir}/resource/英文站点目录/flights/images/
"
>
<
fileset basedir
=
"
${base.dir}/Flights/Images/
"
>
<
include name
=
"
*.jpg
"
/>
<
include name
=
"
*.jpeg
"
/>
<
include name
=
"
*.gif
"
/>
</
fileset
>
</
copy
>
copy相关属性说明:
1>:todir:复制到的目标文件夹路径。
2>:fileset:源文件目录相关设置。
3>:include:指包含某种规则的,例如包含所有.html的文件。
4>:exclude:排除指定规则,例如不包含.cs的文件。
如何运行nant, nant唯一的缺点就是它没有可操作的界面,需要通过dos命令来完成。在命令提示框中,进入到nant应用程序的目录,然后执行类似如下命令:
Nant -buildfile:\bin\DeployScripts\Hotels\default.build
nant如何和ccnet结合:上面都是介绍nant的用法,但ccnet中如何应用呢?ccnet很好的支持了nant的应用。具体体现了tasks/nant节点中。ccnet在编译完工程后就会调用nant应用程序,nant/buildFile是最好的体现。
到此为此,我们已经实现了自动获取源码,自动编译,打包,但nant生成的包是一个包含了所有应用程序内容的包,当然cs之类的代码是不会有的,直接点就是只包含网站所需要的文件。我们部署时并不需要这么多的文件,因为有的文件根本就没有修改过,我们需要的只是有这一阶段有修改过的内容。这里我们需要利用ccnet配置中的publishers节点了,exec能执行相关脚本来完成后面的打包部署工作,我们来写一个批处理文件,通过调用win.rar来完成压缩。相关win.rar相关命令可以网上搜索下,这里为了实现增量包,利用了ta这个参数,即只关心这个时间之后修改过的文件。
shift
if
exist
"
E:\deploy\Web_auto.rar
"
del
/
F E:\deploy\Web_auto.rar
"
D:\Program Files\WinRAR\rar.exe
"
A
-
r
-
ep1
-
ta20090925000000 E:\deploy\Web_auto.rar
-
AD
E:\deploy\web
至此,我们利用ccnet+svn+msbuilder+nant+winrar实现了获取源码,编译,打包自动化的工作,通过ccnet的管理平台,我们非常方面直接的进行打包的跟踪和管理。这里为了大家实现方便,我把我做的ccnet的配置文件贴出来供大家参考。
<
cruisecontrol xmlns:cb
=
"
urn:ccnet.config.builder
"
>
<!--
This
is
your CruiseControl.NET Server Configuration file. Add your projects below
!
-->
<!--
<
project name
=
"
MyFirstProject
"
/>
-->
<
project name
=
"
20091030_NationalDay
"
queue
=
"
Q2
"
queuePriority
=
"
2
"
>
<
webURL
>
http:
//
localhost/ccnet/ViewProjectReport.aspx</webURL>
<
workingDirectory
>
E:\20091030_NationalDay
</
workingDirectory
>
<
artifactDirectory
>
E:\20091030_NationalDay\log
</
artifactDirectory
>
<
modificationDelaySeconds
>
10
</
modificationDelaySeconds
>
<
sourcecontrol type
=
"
svn
"
>
<
trunkUrl
>
svn路径
</
trunkUrl
>
<
workingDirectory
>
E:\20091030_NationalDay
</
workingDirectory
>
<
executable
>
D:\Program Files\VisualSVN\bin\svn.exe
</
executable
>
<
username
>
svn用户名
</
username
>
<
password
>
svn用户密码
</
password
>
<
timeout units
=
"
hours
"
>
1
</
timeout
>
<
cleanUp
>
true
</
cleanUp
>
</
sourcecontrol
>
<
triggers
>
<
intervalTrigger name
=
"
continuous
"
seconds
=
"
6000
"
/>
</
triggers
>
<
tasks
>
<
modificationWriter
>
<
filename
>
svnchangelist.xml
</
filename
>
<
path
>
E:\20091030_NationalDay
</
path
>
<
appendTimeStamp
>
True
</
appendTimeStamp
>
</
modificationWriter
>
<
modificationReader
>
<
filename
>
svnchangelist.xml
</
filename
>
<
path
>
E:\20091030_NationalDay
</
path
>
</
modificationReader
>
<
msbuild
>
<
executable
>
C:\Windows\Microsoft.NET\Framework\v3.
5
\MSBuild.exe
</
executable
>
<
workingDirectory
>
解决方案所在目录
</
workingDirectory
>
<
projectFile
>
Hotel.sln
</
projectFile
>
<
buildArgs
>/
noconsolelogger
/
p:Configuration
=
Release
/
v:diag
</
buildArgs
>
<
timeout
>
900
</
timeout
>
<
logger
>
D:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll
</
logger
>
</
msbuild
>
<
nant
>
<
executable
>
E:\bin\nant.exe
</
executable
>
<
baseDirectory
>
E:\20091030_NationalDay
</
baseDirectory
>
<
buildArgs
>-
D:cvs.executable
=
E:\bin\DeployScripts\deploy.bat
</
buildArgs
>
<
nologo
>
false
</
nologo
>
<
buildFile
>
E:\bin\DeployScripts\Hotels\
default
.build
</
buildFile
>
<
targetList
>
<
target
>
run
</
target
>
</
targetList
>
<
buildTimeoutSeconds
>
1200
</
buildTimeoutSeconds
>
</
nant
>
</
tasks
>
<
publishers
>
<
exec
>
<
executable
>
deploy.bat
</
executable
>
<
baseDirectory
>
D:\Program Files\CruiseControl.NET\
</
baseDirectory
>
<
buildArgs
>
EL_Online_V36_03.01_200910
</
buildArgs
>
</
exec
>
<
modificationHistory onlyLogWhenChangesFound
=
"
true
"
/>
<
rss items
=
"
30
"
/>
<
statistics
/>
<
xmllogger logDir
=
"
E:\20091030_NationalDay\buildlogs\
"
/>
<
email from
=
"
[email protected]
"
includeDetails
=
"
TRUE
"
mailhost
=
"
邮件服务器地址
"
>
<
users
>
<
user address
=
"
接收邮件地址
"
group
=
"
buildmaster
"
name
=
"
min.jiang
"
/>
</
users
>
<
groups
>
<
group name
=
"
developers
"
notification
=
"
always
"
/>
<
group name
=
"
buildmaster
"
notification
=
"
always
"
/>
</
groups
>
<
modifierNotificationTypes
>
<
NotificationType
>
Failed
</
NotificationType
>
<
NotificationType
>
Fixed
</
NotificationType
>
</
modifierNotificationTypes
>
<
subjectSettings
>
<
subject buildResult
=
"
StillBroken
"
value
=
"
Build is still broken for 20091030_NationalDay
"
/>
</
subjectSettings
>
</
email
>
</
publishers
>
</
project
>
</
cruisecontrol
>