目录
原著:Luntbuild Team, 翻译:Melthaw Zhang [RedSaga]
Luntbuild是一种基于流行的构建工具-- Apache Ant-- 的自动化构建和管理工具。 通过Luntbuild,可以很容易做到日构建和持续集成。如果您对日构建和持续集成并不熟悉, 请参考一下关于日构建和持续集成的文章。
首先,Luntbuild团队感谢您选择Luntbuild作为您持续集成的工具,同时,我们注意到,现在市场上还有很多 现成的持续集成的工具,到底该选择哪一种,需要您自己做出判断。下面这篇文章对现有的持续集成工具 进行了很好的横向比较,也许这篇文章对您的抉择有所帮助: Continuous Integration Server Feature Matrix.
您可以通过Luntbuild示例 来了解Luntbuild的功能。也可以通过阅读FAQ 进一步学习Luntbuild。
在Luntbuild里面最基本的操作单位是一次构建(build). 构建通过构建计划(Schedule)触发,也可以通过手工启动。 在Luntbuild里面一次构建会经过以下几个步骤:
从版本控制系统(VCS)中获取源码。
对当前源码打上标签,标签值就是当前构建的版本号.
在源码目录下运行相关的Ant/Maven/Command构建脚本(build script)。
在源码目录下运行相关的Ant/Maven/Command构建后处理脚本(post build script)。
发布构建的日志以及其他构建制品(build artifacts)。
构建的配置,监视,以及访问构建制品这些操作全部都通过web这种直观的方式来完成。 开发和测试团队集中式的获取这些构建信息。
激动的时间来到了,我们现在要做第一次登录Luntbuild的表演。Luntbuild的登录页面如下:

登录页面要求您输入Name(用户名) 和 Password(口令). 第一次登录请用默认的管理员帐号luntbuild/luntbuild(分别作为用户名和口令),如果您修改了安全配置,那么请使用 您在applicationContext.xml文件里面指定的口令(详情请参考 Luntbuild安全)。 登录以后您可以创建新的用户。
登录页面右上角有两个图标。这两个图标在所有的Luntbuild页面里都有,其中
链接到Luntbuild 用户指南。
而
链接到Luntbuild官方web站点。
输入用户名和口令之后,点击login(登录)按钮(或者直接按回车键)即可登录到Luntbuild系统。
成功登录后将会进入Luntbuild主页:

在主页上有五栏,分别是:
Builds(构建清单) - 概括显示当前的Luntbuild构建
Projects(项目列表) - 显示所有的Luntbuild项目
Users(用户列表) - 显示所有的Luntbuild用户
Properties(系统属性) - 显示Luntbuild的一些系统属性
Administration(系统管理) - 显示Luntbuild管理任务,例如导入/导出(import/export)
点击各栏就可以进入相应的页面。
每个页面的顶端是导航区
,
导航区将帮助您在Luntbuild的不同页面间进行快速切换。例如:如果您正在创建一个新的项目(通常是点击Project(项目)页上的New(新建)图标),
您可以通过点击导航区的Home(主页)快速返回主页面。
如果您在运行Luntbuild的时候遇到什么问题了,点击每一页右上角的system log(系统日志), 然后就会进入Luntbuild的系统日志页面。关于调试构建过程中遇到的问题, 详情请参考调试构建中的问题
每页的右上角还包含了刷新按钮
, 该按钮可以设置页面自动刷新功能为启动或者关闭状态。如果您正在跟踪运行中构建的状态,那么设置为自动刷新状态是个不错的选择。
如果要退出Luntbuild,只需要点击右上角的logout(退出)链接。
在Properties(系统属性)页里面列出的属性将会影响所有的Luntbuild项目。Luntbuild的系统属性详细解释如下:
在此指定访问Luntbuild的Servlet的url,在邮件通知里面会用到servlet url,因此设置正确的servlet url是很重要的。 通常这个的值的格式为http://<server>:<port>/luntbuild/app.do,其中<server> 是您的构建服务器的名字或者ip地址,而<port>是访问Luntbuild的端口号。 如果这个属性没有设置,那么Luntbuild将会使用默认值http://<server_ip>:8080/luntbuild/app.do, 其中<server_ip>是构建服务器的实际ip地址。
您可以根据需要指定Luntbuild的顶层工作目录,通常情况下,Lunbuild里面配置的各个项目会在该目录下建立 子目录(以项目名称命名)作为本项目自己的工作目录,用来从版本控制系统中检出源码。 如果没有指定该顶层工作目录,Luntbuild将使用Lunbuild安装目录下的work 子目录作为顶层工作目录。
您可以根据需要指定Luntbuild的顶层发布目录。每个产生的构建都会在该目录下建立子目录作为自己的发布 目录,用来存放该构建产生的制品,如日志和其他发布文件。该子目录格式为<project-name>/<schedule-name>/<build-version>。 如果没有指定该顶层发布目录,Luntbuild将使用Luntbuild安装目录下的publish 子目录作为顶成发布目录。
您可以以秒为单位指定页面刷新的时间间隔。如果没有设置该属性,那么默认值为15秒。
您可以根据需要指定SMTP邮件服务器,Luntbuild将通过它发送邮件通知。如果没有设置该属性, Luntbuild将使用本地机作为默认值。
该属性为可选属性,如果SMTP主机需要安全认证,那么您应该设置该属性来指定认证的用户名。
该属性为可选属性,该口令为上面的SMTP用户对应的口令。
Luntbuild需要Jabber帐号用于发送Jabber消息。
您可以根据需要指定Jabber服务器,用于发布Jabber消息。如果该属性没有设置,那么Luntbuild将使用本地机作为默认值。
连接Jabber服务器的端口号,默认值5222。
在此设置Jabber帐号名,Luntbuild使用Jabber帐号来登录Jabber服务器并发送消息。
Jabber帐号对应的口令。
Luntbuild可以通过MSN帐号N来发送创建通知信息。 例如luntbuild@hotmail.com。
MSN帐号的口令。
在一个多人团队里使用Luntbuild,首先应该先创建好Luntbuild用户,并分配适当的权限,即使该团队只有您一个人。 Luntbuild的用户可以收到构建状态的通知,同时被授权访问Luntbuild的不同部分。
创建Luntbuild用户的步骤:首先点击Users(用户),然后点击new(新建)图标(该图标在该页的右上角),然后进入以下页面:

填写以下信息:
在此提供一个唯一的名字用来确定一个用户。这个属性的值用于显示和登录。
用户的全名
勾上checkbox既给用户赋予创建新项目的权限。
在此提供一个初始化的口令(用户以后可以修改)。
在此指定用户的Jabber帐号,例如:johndoe@jabber.org。 关于Jabber的详情请参考 jabber.org。
在此指定用户的电子邮箱。
在此指定用户的MSN帐号,例如:foobar@hotmail.com
点击Project(项目)栏。
项目页面显示了当前的Luntbuild实例下所有的项目配置信息。 一个项目就是一个可以构建的单元,在其中配置了和构建有关的信息,例如:版本控制系统,项目Builder,构建计划等等。
点击页面右上角的New Project(新建项目)图标

提供一个唯一标识的项目名称。 请牢记对于每一个项目,都会在Luntbuild顶层工作目录和顶层发布目录下创建相应的子目录,而该子目录的名字就是项目名。
项目的描述信息。
在此选择角色为'project admin'的用户
在此选择角色为'project builders'的用户
在此选择角色为'project viewers'的用户
在构建后以何种方式通知相关人员
在项目构建完成后接收通知的用户
定义项目有关的变量,每行定义一个变量,例如
| a=1 |
| b=2 |
可以在其他的OGNL表达式中引用或者指定这里定义的变量,例如, 在设置构造构建计划的"next build version"属性的时候可以直接引用这里定义的变量。 数字型的变量可以递增或递减,例如,如果您有两个构建计划分别为"nightly"和 "release", 并希望发生在这两个计划的构建共享同一个递增的版本号,那么您可以定义下面这样的变量:
| versionPart=foo-1.0.0 |
| iterationPart=1 |
然后设置这两个构建计划的"next build version"属性。
| ${project.var["versionPart"]} (${project.var["iterationPart"].increaseAsInt()}) |
通过这种方式,这两个构建计划的构建版本号将会包括两个部分:第一部分为"versionPart"的值,第二部分为"iterationPart" 的值,而"iterationPart"会随着每次构建而递增。最终构建的版本号就是下面这个样子:
| foo-1.0.0 (build 1) |
| foo-1.0.0 (build 2) |
| foo-1.0.0 (build 3) |
| ... |
您还可以定义许多其他类型的版本策略,详情参考构建计划的 next build version 属性。
定义项目的日志级别,将会影响到构建日志的详细程度。
首先选择“VCS Adaptors”控制面板标签
点击该面板右上角"New VCS Adaptor"图标。
选择版本控制系统
以下地址可以下载AccuRev: http://www.accurev.com/download/index.htm. 下面是该适配器的属性列表:
AccuRev 端口号的格式为<servername>:<port>,其中<servername> 和 <port> 应该用实际的AccuRev的服务器名和端口号代替。 该属性是可选的,该属性的值会覆盖acclient.cnf值。
在该目录下保存accurev的可执行文件 如果如果系统目录下没有包含accurev的可执行文件,那么应该放在 在该目录下。
从VCS check out代码来进行创建之前的等待周期(也就是多长时间没有用户check in),以秒为单位。 这是为了避免在其他人正在做check in的过程中check out代码。 该属性为可选,如果该属性没有设置,那么在check out代码出来创建之前不会有等待周期。
首先在用于创建的机器上必须安装了Clearcase客户端。 同样您还应该保证启动您的应用服务器或者servlet容器的帐号能够访问Clearcase服务器,而且能做视图快照。 下面是该连接的属性列表。
Clearcase 服务器端视图存储的位置,该属性用于创建当前项目的Clearcase视图的stgloc选项值。 该属性和"Explicit path for view storage"只指定一个即可
只有"Clearcase view stgloc name"属性没有指定的时候该属性才需要。 如果指定了,那么创建当前项目的Clearcase视图的时候,该值将作为-vws选项值代替-stgloc选项
Config spec 用于创建Clearcase快照视图
如果在上述的Config spec下指定要获取某些分支下的最新版本,这个时候该属性有效。Luntbuild用 该属性来决定自上一次创建后资料库是否发生了改变。该属性包括了多种条目,每个条目的格式为 "<path>[:<branch>]" 其中<path>是VOB下的路径,该值对于上述的config spec是可见的。对于该目录下的任何子目录, Luntbuild会检查clearcase服务器端内容是否发生了变化。 如果<branch>指定了,那么Luntbuild将会检查指定的分支里的内容是否发生了变化。 多个条目可以通过";"符号或者多行来区分。
当您使用Luntbuild为当前项目创建有关的Clearcase快照视图的时候,可以执行mkview sub命令的命令行选项。 可以指定的命令行选项包括-tmode, -ptime, and -cachesize,例如您可以指定"-tmode insert_cr",这样就使用 Windows的文本行终结符。
cleartool可执行文件所在的路径。如果在系统的路径下找不到cleartool的可执行文件,就会在 这里设置的目录下找。
在Luntbuild准备从VCS检出代码前,需要确保最近一次检入操作距离现在的最短时间(单位为秒),在这段时间不能有新的检入操作。 这样是为了避免有其他用户正在做检入的过程中Luntbuild做检出的操作,从而导致捡出代码的不一致性。 该属性为可选属性,如果为空,Luntbuild就会立刻检出代码,并执行构建,而不会检测当前VCS中是否有正在进行的检入操作。
如果您使用的是Windows平台,首先在您的平台上安装相应的CVS客户端,可以从下面的网站下载相应的安装包 http://www.cvshome.org 或者 http://www.cvsnt.org
下面是cvs连接的一些属性
例如:pserver:administrator@localhost:d:/cvs_repository。 如果您的连接方式是ssh,请设置:ext:协议,并且要设置好ssh相应的环境,这些设置都在都在Luntbuild外进行。 详情参考cvs用户指南。
使用pserver协议来连接的CVS口令
该属性指要使用的cvs是否是cygwin下的cvs? 可选的值为"yes"或"no",默认值为"no"。
该选项用来设置log命令的"-S"选项是否禁止? 可选的值为"yes"或"no",默认值为"no"。 在log命令中使用-S选项可以加速对cvs代码库中发生变化的检测, 不过早期的cvs并不支持该选项。如果是早期的cvs版本,请输入"yes"来禁止该选项。
该属性用来设置在检测CVS代码库的变化的时候是否禁止history命令。 可选的值为"yes"或"no",默认值为"no"。 和log命令一起使用history命令可以加速对cvs代码库中发生变化的检测, 但是,有些cvs代码库并没有保存commit的历史信息,这种情况下,应该使用"yes"来禁止该命令。
cvs可执行文件所在的路径。如果在系统路径下找不到cvs的可执行文件,就会在 这里设置的目录下找。
在Luntbuild准备从VCS检出代码前,需要确保最近一次检入操作距离现在的最短时间(单位为秒),在这段时间不能有新的检入操作。 这样是为了避免有其他用户正在做检入的过程中Luntbuild做检出的操作,从而导致捡出代码的不一致性。 该属性为可选属性,如果为空,Luntbuild就会立刻检出代码,并执行构建,而不会检测当前VCS中是否有正在进行的检入操作。
该属性为可选属性。如果指定了,那么会以文件的修改时间为检测对象来检测源目录内容的变化。 所有检测到的已修改的文件将会复制到项目工作目录下,并在此基础上进行构建。
在Luntbuild准备从VCS检出代码前,需要确保最近一次检入操作距离现在的最短时间(单位为秒),在这段时间不能有新的检入操作。 这样是为了避免有其他用户正在做检入的过程中Luntbuild做检出的操作,从而导致捡出代码的不一致性。 该属性为可选属性,如果为空,Luntbuild就会立刻检出代码,并执行构建,而不会检测当前VCS中是否有正在进行的检入操作。
首先应该在构建的机器上安装Perforce客户端。关于许可证信息请联系http://www.perforce.com。 下面是该连接的属性列表:
Perfoce端口格式<port>, 或者 <servername>:<port>, 其中<servername> 和 <port> 将被实际的Perforce服务器名和端口代替。
在此指定访问Perfoce服务器的用户名。该用户应该有创建和修改客户端描述符(client specifications)的权限, 还应该有检出代码以及给代码打上标签的权限。
Perforce用户对应的口令。如果Perforce没有使用基于口令的安全机制,那么这里口令可以为空。
设置客户文本文件的行结束符。目前可设置的值如下:
| local: use mode native to the client |
| unix: UNIX style |
| mac: Macintosh style |
| win: Windows style |
| share: writes UNIX style but reads UNIX, Mac or Windows style |
该属性为可选属性。如果没有指定,那么默认值为"local"
P4可执行文件所在的路径。如果在系统的路径下找不到cvs的可执行文件,就会在 这里设置的目录下找。
在Luntbuild准备从VCS检出代码前,需要确保最近一次检入操作距离现在的最短时间(单位为秒),在这段时间不能有新的检入操作。 这样是为了避免有其他用户正在做检入的过程中Luntbuild做检出的操作,从而导致捡出代码的不一致性。 该属性为可选属性,如果为空,Luntbuild就会立刻检出代码,并执行构建,而不会检测当前VCS中是否有正在进行的检入操作。
首先请在您的构建服务器上安装好Subversion的客户端。 subversion的下载地址为http://subversion.tigris.org.
下面是Subversion连接的属性列表:
Subversion的“根”url,例如:"svn://buildmachine.foobar.com/"或者"file:///c:/svn_repository" 或者"svn://buildmachine.foobar.com/myproject/othersubdirectory",等等。 其他的例如标签的目录,分支的目录,模块等等都是相对于该“根”url的。
指定在上述根url下用于存放主分支代码(trunk)的目录。该目录是根url的相对目录。 如果在根url下没有定义任何trunk目录,那么该属性的值为空值。
指定在上述根url下用于存放分支代码的目录。该目录是根url的相对目录。 如果不设置该属性,那么Luntbuild将采用默认值,即"branches"。
指定在上述根url下用于存放标签的目录。该目录是根url的相对目录。 如果不设置该属性,那么Luntbuild将采用默认值,即"tags"。
登录Subversion的用户名。
登录Subversion的用户的口令。
svn可执行文件所在的路径。如果在系统的路径下找不到svn的可执行文件,就会在 这里设置的目录下找。
在Luntbuild准备从VCS检出代码前,需要确保最近一次检入操作距离现在的最短时间(单位为秒),在这段时间不能有新的检入操作。 这样是为了避免有其他用户正在做检入的过程中Luntbuild做检出的操作,从而导致捡出代码的不一致性。 该属性为可选属性,如果为空,Luntbuild就会立刻检出代码,并执行构建,而不会检测当前VCS中是否有正在进行的检入操作。
首先需要在构建服务器上安装Clearcase客户端。 同时还要确保运行应用服务器和servlet容器的帐户能够访问Clearcase服务器,并且能够创建快照视图。 下面是该连接的一些属性:
在此指定Clearcase视图存储位置的名字,其值将作为创建Clearcase视图的stgloc选项的值。
在此指定项目vob的标签,例如\pvob1
如果"Clearcase view stgloc name" 属性的值为空,那么本属性的值就必须设置。 如果指定了本属性的值,其值作为创建Clearcase视图的-vws选项的值,并且会代替原来使用的-stgloc选项。
在此指定UCM流的名字。
指定在UCM流内部要构建的基线。如果要指定多个基线,那么中间用空格分开。 下面的值具有特殊的意义:
| <latest>: 基于每个组件最新的代码进行构建。 |
| <latest baselines>: 基于每个组件最新的基线进行构建。 |
| <recommended baselines>: 基于推荐的基线进行构建。 |
| <foundation baselines>: 基于所有的最基础的基线进行构建。 |
当"What to build"属性的值为"latest"时,本属性的值有效。 Luntbuild用该属性来决定自上一次创建后资料库是否发生了改变。该属性包括了多种条目,每个条目的格式为 "<path>[:<branch>]" 其中<path>是VOB下的路径,该值对于上述的config spec是可见的。对于该目录下的任何子目录, Luntbuild会检查clearcase服务器端内容是否发生了变化。 如果<branch>指定了,那么Luntbuild将会检查指定的分支里的内容是否发生了变化。 多个条目可以通过";"符号或者多行来区分。
在通过Luntbuild来创建当前项目有关的clearcase的快照视图的时候,您可以有选择性的指定mkview sub命令的扩展选项。 目前可以指定选项限定为-tmode, -ptime, 和 -cachesize。例如,您可以指定"-tmode insert_cr",这样可以使用Windows 的行结束文本模式。
在此指定clearcase工具可执行文件所在路径,如果这些可执行文件不在系统路径下,就应该在此指定其所在的目录。
在Luntbuild准备从VCS检出代码前,需要确保最近一次检入操作距离现在的最短时间(单位为秒),在这段时间不能有新的检入操作。 这样是为了避免有其他用户正在做检入的过程中Luntbuild做检出的操作,从而导致捡出代码的不一致性。 该属性为可选属性,如果为空,Luntbuild就会立刻检出代码,并执行构建,而不会检测当前VCS中是否有正在进行的检入操作。
首先在构建服务器上安装VSS软件,下载地址http://download.microsoft.com。 下面是VSS连接的属性:
该目录是srcsafe.ini文件所在目录。例如:\\machine1\directory1 这个路径名要么用主机名要么用主机的ip地址,而且要确保运行应用服务器或者servlet容器的帐号事先已经登录 到这台机器上,否则在构建时Luntbuild会汇报一个“No VSS database found”的错误。
登录该VSS的用户名。
上面指定的用户的口令。
指定VSS的history命令的日期时间格式。该属性为可选属性,如果该属性的值为空,那么Luntbuild将使用 默认值"M/dd/yy;h:mm:ssa"。 默认值只适合使用US的英文操作系统。 对于其他的使用英语的国家,例如英国,澳大利亚,加拿大,VSS使用的时间格式为(假设VSS的本地语言已经设置为相应的值):
'd/M/yy;H:mm'
如果Luntbuild运行的操作系统为非英文的操作系统,可以通过以下方法决定使用的日期时间格式:
打开安装在您的构建服务器上的VSS,选择一个现有的VSS数据库,然后查看里面的项目和文件。 在文件列表框里面有几栏,其中一栏是"Date-Time"。可以使用这个位置相应的"datetime format"(日期时间格式)。 例如,如果其中一个的值为 "04-07-18 20:19",那么相应的"datetime format"(日期时间格式)为 "yy-MM-dd;HH:mm" 注意在日期和时间之间的semicolon(分号)一定要指定。 在这里鼓励大家将该属性设置为"yy-MM-dd;HH:mm:ss",这样可以提高精确度。 例如,如果VSS里面的日期时间为"7/18/04 8:19p",那么相应的"datetime format"(日期时间格式) 为"M/dd/yy;h:mma"。 这个时候如果设置为 "M/dd/yy;h:mm:ssa",那么可以增加准确性。
下面是从JDK文档中节选的部分格式化字符的信息:
表 7.1. Date/Time format characters(日期时间格式化字符)
| 字符 | 解释 | 例子 |
|---|---|---|
| y | 年 | 1996 ; 96 |
| M | (一年中的)月 | July ; Jul ; 07 |
| d | (一个月中的)日 | 10 |
| a | Am/pm(上下午)标志 | p |
| H | (一天中的)小时,范围(0-23) | 0 |
| h | (上午或下午的)小时,范围(1-12) | 12 |
| m | (小时中的)分钟 | 30 |
| s | (分钟中的)秒 | 55 |
详情参考 http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html
在此指定ss.exe文件所在的路径,如果ss.exe文件不在系统路径下面,Luntbuild就会使用这个属性的值作为寻找该ss.exe 文件的目录。
在Luntbuild准备从VCS检出代码前,需要确保最近一次检入操作距离现在的最短时间(单位为秒),在这段时间不能有新的检入操作。 这样是为了避免有其他用户正在做检入的过程中Luntbuild做检出的操作,从而导致捡出代码的不一致性。 该属性为可选属性,如果为空,Luntbuild就会立刻检出代码,并执行构建,而不会检测当前VCS中是否有正在进行的检入操作。
首先在Windows平台上完全安装StarTeam SDK的运行时套件(把运行时dll安装在Windows系统目录下)。 通常这是StarTeam客户端安装程序的一部分。 许可信息请参考http://www.borland.com. 下面是该连接的一些属性:
StarTeam项目的位置,格式<servername>:<portnum>/<projectname>, 其中<servername>是StarTeam服务器名字,<portnum>是服务器使用的端口号,默认值49201。 <projectname>是运行在StarTeam服务器上的StarTeam的项目名。
登录StarTeam服务器的用户名。
登录StarTeam服务器的口令。
该属性可选的值如下:
all: 所有ASCII码文件将其行结束符调整为和检出的客户机的行结束符一致。
no: 检出的文件的行结束符以服务器为准。
该属性为可选属性。如果没有指定,默认值为yes。
在Luntbuild准备从VCS检出代码前,需要确保最近一次检入操作距离现在的最短时间(单位为秒),在这段时间不能有新的检入操作。 这样是为了避免有其他用户正在做检入的过程中Luntbuild做检出的操作,从而导致捡出代码的不一致性。 该属性为可选属性,如果为空,Luntbuild就会立刻检出代码,并执行构建,而不会检测当前VCS中是否有正在进行的检入操作。
点击某个VCS定义页面里面的New Module(新建模块)图标。 如果定义了多个VCS模块,那么Luntbuild会按序依次检出这些模块。 如果后面模块目标路径和前一个模块有部分重叠,那么这部分重叠的路径将会被后一个模块覆盖。 例如:假设您定义了一个模块,其目标路径为"/foo/bar", 然后又定义了第二个模块,其目标路径为"/foo", 那么从第二个模块检出的内容将完全覆盖第一个模块。 反过来,如果第一个模块的目标路径为"/foo", 第二个模块的目标路径为"/foo/bar",那么第一个模块检出的"/foo/bar"下的内容会被第二个模块覆盖, 而在检出代码中的其他路径比如/foo/another_bar,将不会被覆盖。
标签在AccuRev里面是用于同步的事务编号。在此指定您希望基于哪个事务编号进行构建。
用于检出代码 Accurev储存位置。
构建模块的回溯流的名字。 The backing stream should be able to have streams created from it by the build user.
指定同回溯流关联的构建流名称 (如果该构建流 存在,它将被自动创建)。 基于这个流,一个相关的引用树将会被创建(树的名称为流的名称加上"_reference"后缀)。
指定从CVS代码库中获取代码的路径,例如:testcvs/src
指定前面的源路径的分支。该选项是可选的。如果没有设置相应的值,那么将把主分支作为默认值。
指定前面的源路径的标签。该选项也是可选的。 如果指定了该值,那么该值将优先于分支的值。如果没有设置相应的值,就会检出上述指定分支里面的最新代码。
"Source path"(源路径)代表了CVS代码库中模块的意思,例如"/testcvs", "/testcvs/web",或者"testcvs"。 但是不能用"/"或者"\"这两个字符来定义源路径。 "Branch"(分支)就是CVS分支(branch),而"Label"(标签)就是CVS的标签(tag)。 对于某个模块,这二个属性(branch和label)中只有一个的值有效。 如果都不为空,那么标签将优于分支。 如果都为空,Luntbuild则从主分支获取最新的代码。
指定Perforce存储位置的路径,例如"//depot/testperforce/...".
指定前面的存储位置路径上的标签。该属性是可选的。 如果为空,那么将会检出该存储路径上最新的版本。
指定客户端的路径,例如"//myclient/testperforce/...".
Depot path: -//depot.side
Client path: //client.side
Perforce的模块定义把代码库的Depot路径("Depot path")映射到客户端路径("Client path")。 Luntbuild也支持Perfoce的标签属性。 Depot路径("Depot path")表示Perforce代码库中的路径,例如 "//depot/testperforce/..." 客户端路径("Client path")表示客户端的路径(也就是Depot路径下的内容检出之后保存在客户端的什么目录下), 例如"//myclient/testperforce/..." "Label"是Perfoce标签,如果您想获取指定的Depot路径下的内容的某个时刻的快照,那么就需要使用标签。 如果标签为空,那么获得的Depot路径下的内容为head版本。 客户端路径对应的目录不一定要存在。 如果不存在那么Luntbuild会自动创建相应的目录。 在Perfoce的连接信息中指定的用户应该有足够的权限来创建或者修改Perforce的参数。
即Subversion代码库中的路径,例如"testsvn", "testsvn/web", 或者 "/testsvn"。 当"branch"(分支) 或者 "label"(标签)属性指定的时候,本路径会映射到svn代码库的另一个路径。
指定以上源路径的分支。该属性为可选项,如果不设置,那么将使用默认值trunk。
指定以上源路径的标签。该属性为可选的。如果设置了该属性,其优先级高于分支。如果不设置,就采用指定分支的head version。
该属性为可选的。目标路径相对于项目的工作目录,如果设置了相应的值,那么从subversion代码库中获取的代码将保存在该目录下。 否则将会在项目的工作目录下创建一个以源路径命名的目录,从subversion获取的代码将保存在该目录下。
"Source path"(源路径)即Subversion代码库中的路径,例如"testsvn", "testsvn/web", 或者 "/testsvn"。 Luntbuild在其他的属性值基础上将该路径映射到Svn代码库中的路径。 我们定义了以下属性来描述这种映射方式:
| Repository url base: svn://localhost |
| Directory for trunk: trunk |
| Directory for branches: branches |
| Directory for tags: tags |
可以试验一下下面的模块设置和路径映射:
Luntbuild从ulr"svn://localhost/trunk/testsvn/web"下检出代码, 并保存在"<project work directory>/testsvn/web"下面。
Luntbuild从ulr "svn://localhost/branches/simplified-chinese/testsvn/web"下检出代码, 并保存在"<project work directory>/testsvn/web"下面。
Luntbuild从ulr "svn://localhost/tags/v1_0/testsvn/web"下检出代码, 并保存在"<project work directory>/testsvn/web"下面。
Luntbuild从ulr "svn://localhost/tags/v1_0/testsvn/web" 下检出代码, 并保存在"<project work directory>/testsvn/web/simplified-chinese"下面。
当Luntbuild给检出到目录"<project work directory>/testsvn/web"下的代码打上标签,例如是"v1_0", 会执行下面的代码:"svn copy <project work directory>/testsvn/web svn://localhost/tags/v1_0/testsvn/web"
如果将"Directory for trunk","Branch"和"Label"三个属性都设置为空值,就可以避免上面的url映射。 通过这种方式,只设置"Source path" 和 "Destination path"属性,您就可以控制从什么地方检出代码,并将检出的代码保存在什么地方。 这种情况下,源路径只会把"repository url base"属性的值作为前缀。
在此指定在VSS代码库中的路径,例如"testvss", 或者"/testvss".
在此指定上面设置的源路径上的标签,该属性为可选的,如果为空,就使用最新的版本。
指定相对于项目工作目录的目标目录,从源目录下获取的代码就保存在这个目录下。 该属性为可选的,如果该属性为空,Luntbuild会在项目工作目录下建一个和源目录的目录结构一致的目录, 并将检出的代码保存在这个目录下。
源路径其实就是相对于VSS代码库根目录的的项目路径,例如"testvss", "/testvss", 或者 "/testvss/web"等等。 使用"/" 或者 "\",都可以获取整个代码库的内容。 标签指VSS标签。VSS通过创建一个新的共享的项目来实现分支功能。 因此您需要配置不同的模块,这样才能从不同的分支获取代码。 如果某个模块的标签为空,Luntbuild则从VSS获取该模块的最新代码。 如果定义目标路径属性,那么从VSS获取的代码将会保存在相对于项目工作目录的目标目录下。 否则会保存在相对于项目工作目录并且和源目录的目录结构一样的目录下。
在此指定StarTeam视图。该属性为可选属性。如果为空,Luntbuild使用当前的StarTeam项目的根view。
在此指定相对于StarTeam视图的路径。"/"代表根路径。
指定以上StarTeam视图的标签。该属性为可选属性。如果为空,就以指定视图上的最新代码为准。
指定相对于项目工作目录的目标目录,从源目录下获取的代码就保存在这个目录下。 该属性为可选的,如果该属性为空,Luntbuild会在项目工作目录下建一个和源目录的目录结构一致的目录, 并将检出的代码保存在这个目录下。
"StarTeam view"指StarTeam的视图,"Label"指StarTeam视图的标签。 如果"StarTeam view"为空,Luntbuild就使用StarTeam的根视图。 "Source path"是相对指定的StarTeam视图根目录的路径。 如果定义了"Destination path"性,那么从StarTeam代码库获取的代码将会保存在相对于项目工作目录的目标目录下。 否则会保存在相对于项目工作目录并且和源目录的目录结构一样的目录下。
Builder根据项目特定的构建计划执行相应的创建活动。
新建Builder的步骤:首先点击"Builders",然后点击该页右上角的"New"图标
然后就会进入Builders编辑页面。

首先选择适当的Builder类型。 目前可以选择的Builder包括:
| Ant Builder |
| Command Builder |
| Maven Builder |
对于指定的项目,根据不同任务的需要,可以创建所需的builders,创建的数目没有限制,这个根据需求而定。 然后针对项目的每个构建计划,从这里定义的一套builder里面挑选出相应的builder或者post-builder。
提供一个用于标识该builder的名称,该名称以后可以修改。
指定运行Ant的命令(通常是ant.bat或者ant的shell文件及其所在的目录) 例如:/path/to/ant 包含在${...}里面的字符串被当作是OGNL表达式,而且在构建前被替换成实际值。 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。
您可以修改Ant命令以添加命令行选项和属性,例如-Ddebug=_debug.
Ant的构建脚本文件(buildfile)所在的路径,如果该目录非绝对路径,Luntbuild认为该目录是相对项目工作目录的。
指定需要构建的目标,使用空格来分隔不同的目标(包括空格符的目标名需要用引号括起来,这样是为了避免被当成是多个目标来处理)。 如果没有指定目标,那么将使用ant构建文件的默认目标。 同样地,您可以使用OGNL表达式(${...})来传递变量,该变量作为构建的目标名。 例如,您可以使用${build.schedule.name}变量,该变量的作用是可以根据不同的构建计划使用不同的构建目标。 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。
在此定义需要传递给ant构建脚本的属性,例如:
| buildVersion=${build.version} |
| scheduleName=${build.schedule.name} |
每一行只能设置一个变量。这里支持使用OGNL表达式格式,即${...}。 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。
设置运行builder的环境变量,例如:
| MYAPP_HOME=${build.schedule.workingDir} |
| SCHEDULE_NAME=${build.schedule.name} |
每一行只能设置一个变量。可以在变量里插入OGNL表达式(即${...})。 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。
构建成功条件式是一个用来判断当前项目是否成功构建的OGNL表达式 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。 如果不设置该属性,那么会使用默认值————result==0 and logContainsLine("BUILD SUCCESSFUL")。 当这个表达式的值为true的时候,就认为本次构建是成功的。 下面的一些例子演示了OGNL表达式的格式。
| result==0, 此处的"result"表示ant构建结果的返回值。 |
| logContainsLine("^ERROR.*"), 如果构建的日志里面的某一行匹配正则表达式"^ERROR.*",那么就认为该表达式为true。 关于正则表达式的格式请参考 http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html |
| 以上的表达式可以使用'!'符号,该符号的作用是用来求相反的值。 例如,!logContainsLine("^ERROR.*"),如果构建日志里没有包括匹配指定模式的行,那么该表达式的值为true。 |
| 以上的表达式可以通过"and"和"or"逻辑运算符组合成新的表达式。 例如,表达式result==0 and !logContainsLine("^ERROR.*"),如果ANT执行构建的结果为0,且构建的日志不 包括以"ERROR"字符串打头的行,那么该表达式的值为true。 |
builder的标识名,设置后可以修改。
在此指定构建命令。例如:/path/to/command.bat "${build.version}" "${build.artifactsDir}"。 ${...}所包括的部分被当作是OGNL表达式来处理,在构建前会被实际值代替。 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。
用于运行构建命令的目录。如果该目录非绝对路径,Luntbuild认为该目录是相对项目工作目录的。
在构建前需要先设置环境变量,例如:
MYAPP_HOME=${build.schedule.workingDir}
SCHEDULE_NAME=${build.schedule.name}
每行只能指定一个环境变量。OGNL表达式可以嵌入在变量的值里面,OGNL表达式需要用${...}括起来。 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。
构建成功条件式是一个用来判断当前项目是否成功构建的OGNL表达式 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。 如果不设置该属性,那么会使用默认值————result==0 and logContainsLine("BUILD SUCCESSFUL")。 当这个表达式的值为true的时候,就认为本次构建是成功的。
提供一个用于标识该builder的名称,该名称以后可以修改。
指定运行Maven的命令(一般来说是maven.bat,或者maven的shell脚本)。 例如:/path/to/maven。 ${...}中间的部分是OGNL表达式,在命令执行前会计算出该表达式的值。 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。
<project>
...
<!--Use value of variable "buildVersion" as current version, this variable is defined in Luntbuild's Maven
builder configuration page-->
<currentVersion>${buildVersion}</currentVersion>
...
</project>
指定要在哪个目录下运行Maven。如果该目录非绝对路径,Luntbuild认为该目录是相对项目工作目录的。
指定要构建的目标。如果要指定多个目标,请用空格来分开多个目标(带空格的目标应该使用引号括起来,否则会被当作是多个目标来处理。) 在目标名字里面可以使用${...},${...}中间的部分会被当作是OGNL表达式来处理。 例如,您可以使用${build.schedule.name},该表达式可以根据不同的目标使用不同的构建计划。 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。
定义传递给maven构建脚本的属性值。例如:
| buildVersion=${build.version} |
| scheduleName=${build.schedule.name} |
每一行只能设置一个变量。也可以在变量中使用OGNL表达式,OGNL表达式需要用${...}括起来。 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。
在这里设置构建的时候要使用的环境变量。例如:
MYAPP_HOME=${build.schedule.workingDir}
SCHEDULE_NAME=${build.schedule.name}
每一行只能设置一个变量。也可以在变量中使用OGNL表达式,OGNL表达式需要用${...}括起来。 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。
构建成功条件式是一个用来判断当前项目是否成功构建的OGNL表达式 每个OGNL表达式都需要有一个对应的JAVA根对象来对表达式求值(通过反射机制),这里的根对象就是当前的Builder对象。 如果不设置该属性,那么会使用默认值————result==0 和 logContainsLine("BUILD SUCCESSFUL")。 当这个表达式的值为true的时候,就认为本次构建是成功的。
构建计划用于启动或触发构建活动,包括了后台自动触发和手工触发两种方式。
构建需要一个工作目录,该工作目录用来保存从VCS代码库中检出的代码。 下面是Luntbuild构造工作目录的一些准则:
Luntbuild顶层工作目录作为所有的Luntbuild项目工作目录的根目录。
每个构建计划都允许定义自己的工作目录。默认情况下,该目录位于Luntbuild顶层工作目录下的以项目名命名的子目录下。
定义了源目录的VCS模块在检出之后,Luntbuild自动在构建计划的工作目录下建相应的子目录,通常情况下子目录结构和 VCS模块的源目录结构一致(除非在定义VCS模块时指定了目标目录)。
例如,如果Luntbuild的顶层工作目录为/luntbuild-install-dir/work, 项目名为myproject,而构建计划子目录定义为myscheduleworkdir, VCS的某个模块的源路径为source, 那么通常情况下source下的内容将会被检出到:/luntbuild-install-dir/work/myproject/myscheduleworkdir/source
为什么构建计划的工作目录这么重要?原因如下:
| 构建计划的工作目录可以在同一个项目的多个构建计划间共享。 这样这些构建计划的构建就会同一个工作目录,从而可以节省很多磁盘空间。 Luntbuild保证如果多个构建计划共享同一个工作目录,那么这些构建计划不会同时运行。 事实上,如果使用该共享工作目录的第一个构建启动了,那么其他的使用该共享目录的构建就 会进入一个等待构建的队列, 等待前一个构建完成之后才能启动下一个构建。 |
| 如果构建计划的工作目录没有和同一个项目的其他构建计划共享,那么项目对应的VCS模块的内容会被多次检出(到多个工作目录), 这样会消耗大量的磁盘空间,而且也会花更多的时间来执行检出VCS模块的操作。 但是这样有个好处就是,(同一个项目里面)不同的构建计划使用不同的工作目录,这样不同的构建计划里的构建可以同时进行。 |
每个构建实例使用发布目录来输出构建的制品,例如构建日志,版本变更日志,要发布的文件等等。 下面是Luntbuild构建发布目录的一些准则:
例如:如果Luntbuild的顶层发布目录为 /luntbuild-install-dir/publish, 项目名myproject, 构建计划名为myschedule, 当前构建的版本号为myapp-1.2.0, 那么版本myapp-1.2.0的构建发布目录的绝对路径为 /luntbuild-install-dir/publish/myproject/myschedule/myapp-1.2.0.
点击Schedules(构建计划)标签,然后点击该页右上角的New Schedule(新建构建计划)图标,即可新建一个构建计划。

构建计划的名字,该名字用于标识构建计划。
在此提供对该构建计划的一些描述信息。
在此指定下一个构建版本的字符串。Luntbuild会在构建的过程中自动增量式修改该字符串的版本号部分。
| luntbuild-1.0 会增加到 luntbuild-1.1 |
| luntbuild-1.2.9 增加到 luntbuild-1.2.10 |
| luntbuild-1.5(1000) 增加到 luntbuild-1.5(1001) |
通常情况下,每次构建下一个构建版本的最后一个数字都会增加。 例如三次构建之后"luntbuild-1.2.0" 会增加到 "luntbuild-1.2.3"。 但是,如果在该字符串中嵌入了OGNL表达式(以${...}括起来),那么最后一个数字就不会自动增加了。 取而代之的是,Luntbuild会根据特定的构建计算出每一个嵌入的OGNL表达式的实际值。 在执行计算的过程中,当前的Schedule 对象会作为该OGNL表达式的根(root)对象。 下面的例子展示了使用OGNL表达式获取不同的版本号的策略:
将每个构建计划的下一个版本号定义为:
foo-${#currentDay=system.(year+"-"+month+"-"+dayOfMonth), #lastDay=project.var["day"].setValue(#currentDay), \
#dayIterator=project.var["dayIterator"].intValue, project.var["dayIterator"].\
setIntValue(#currentDay==#lastDay?#dayIterator+1:1), #currentDay}.${project.var["dayIterator"]}
最终,某个构建的实际版本的字符串将包括构建的日期和当天迭代的次数。
测试和发布构建计划的下一个构建版本都设置为:
foo-${project.var["majorVersionPart"]}.${project.var["minorVersionPart"].increaseAsInt()}对于持续集成构建计划,将下一个构建版本设置为:
foo-1
定义以下项目的变量:
| fixPart=foo-1.1 |
| releasePart=1 |
| iterationPart=0 |
定义每夜构建计划的下一个版本号为:
${project.var["fixPart"]}.${project.var["releasePart"]} build ${project.var["iterationPart"].increaseAsInt()}定义发布构建计划的下一个版本号为:
${project.var["fixPart"]}.${project.var["iterationPart"].setValue(1), project.var["releasePart"].(increaseAsInt(), value)}This way, builds in "release" schedule will get versions like: foo-1.1.1, foo-1.1.2, foo-1.1.3, ..., and builds in "nightly" schedule will get versions like: foo-1.1.1 build 1, foo-1.1.1 build 2, foo-1.1.1 build3, ...., foo-1.1.2 build 1, foo-1.1.2 build2, ...
在此设置构建计划的工作目录。如果设置的不是绝对路径,那么就假设是相对于该构建计划所属项目的工作目录。 如果该属性为空,那么系统使用项目工作目录,即:<global_work_dir>/<project_name>。 其中<global_work_dir>是Luntbuild的顶层工作目录,<project_name>是构建计划对应的项目的名称。 默认的工作目录可能造成同一个项目的多个构建计划使用同一个工作目录。 See build work directory 查看工作目录.
选择构建计划的触发器类型。如果选择"manual"(手工)那么意味着构建计划的构建任务只能通过手工触发。 "simple"则周期性触发(定义一个时间间隔,每隔多少分钟触发一次)。 "cron"则用来定义cron风格的触发器。关于怎么配置cron触发器的详情请参考 http://www.opensymphony.com/quartz/
设置构建计划的cron表达式,格式为 <seconds> <minutes> <hours> <day-of-month> <month> <day-of-week> 例如
0 1 * * ?
的意思是每天的早上1点。 关于该格式的详情,请参考 Cron触发器指南.
在此设置构建计划实施的时间间隔,单位为分钟。
该属性可选。如果为空,那么默认值为"vcsModified or dependencyNewer"。 Luntbuild使用构建必要条件来决定当前构建是否有必要进行。 构建必要条件是一个OGNL表达式。当该表达式的值为true的时候,就认为构建有必要进行。 该OGNL表达式的根对象是当前的 Schedule对象。 下面的例子展示了是OGNL表达式的格式:
vcsModified - 如果当前构建要访问的代码库的内容发生了改变那么认为该表达式的值为true。
dependencyNewer - 如果依赖的构建计划更新了,那么该表达式的值为true
dependencySuccessful - 如果依赖的构建计划里的最新构建都成功了,那么该表达式的值为true
always - 其值总是为true,用于强制运行构建
never - 其值总是为false,通过设置该表达式来停止构建
alwaysIfFailed - 如果上一次构建失败了,那么该表达式的值始终为true, 如果上一次构建成功了,那么该表达式的值和"vcsModified or dependencyNewer"一致。
project["testcvs"].vcsModified - 如果项目"testcvs"对应的代码库的"development"视图的值改变了,那么该表达式的值为true。
execute("/path/to/command.sh") == 0 - 如果指定的命令执行的返回值为0,那么该表达式的值为true
以上的表达式都可以加上'!'前缀,用来求相反的值, 例如如果当前项目代码库中的代码没有变化那么!vcsModified的值为true。
以上的表达式可以使用"and"和"or"逻辑运算符组合成新的表达式。例如表达式 vcsModified or execute("/path/to/command.sh")==0, 如果项目代码库中的代码发生了变化,或者指定的命令运行的返回值为0,那么该表达式为true。
关于OGNL表达式的语法请参考 http://www.ognl.org
选择当前构建计划要使用的builder。执行顺序和选择的顺序一致。
选择当前构建计划要使用的post-builders。 在"post-build strategy"设置了合适的值(post build strategy属性),那么在所有选择的builder执行完 后就会执行这里选择的post-builders。
选择构建计划的构建类型,完整构建(clean build)相对可靠,但是速度更慢。 增量式构建(Incremental build)速度快,但是没那么可靠。 我们建议所有重要的构建计划例如日构建和发布构建都应该使用完整构建,而那些 频繁的构建计划,例如每小时构建使用增量式构建。
设置构建计划的Post-build策略,目前支持的策略如下:
构建完成后不执行前述的post-builders。
只有构建成功后才运行前述的post-builders。
只有构建失败后才运行前述的post-builders。
构建之后无条件运行post-builders
选择构建计划的标签策略。Luntbuld提供了以下策略:
只给那些成功完成的构建对应的代码库打上相应的标签。
不论成功失败,构建结束后都不会打标签。
不论成功失败,构建结束后都会打上标签。
选择构建计划的消息通知策略。Luntbuld提供了以下策略: Choose the notify strategy for this schedule. There are following strategies:
如果当前构建和上一次构建的状态相比有变化的话就发送消息通知。 也就是说,如果上一次构建失败,而本次构建成功,或者上一次构建成功,本次构建失败,这些情况下都会发送通知。
构建失败时发送通知
构建成功时发送通知
构建结束后不发送通知
无论构建状态如何,结束后都发送通知。
选择当前构建计划所依赖的其他构建计划。 如果scheduleA依赖scheduleB,那么Luntbuild在触发scheduleA之前会先触发scheduleB。 构建计划之间的依赖关系间接定义了项目间的依赖关系。
决定当前的构建计划被触发的时候怎样相应的触发其依赖构建计划。目前支持的策略有:
触发本构建计划所依赖的构建计划。 在当前的构建计划触发前会触发其依赖的构建计划。 例如,如果当前的构建计划依赖于其他的构建计划中的一些组件,那么您可以使用本策略,这样可以保证 本构建计划使用到的组件是最新的。
触发依赖本构建计划的其他构建计划。在本构建计划触发后将触发依赖于本构建计划的其他构建计划。例如,如果本构建计划 要构建的组件要被其他的构建计划使用,那么您可以通过本策略来保证组件更新时,使用该组件的的其他产品也被更新。
本策略综合了上面两个策略,也就是说, 在本构建计划触发前先触发本构建计划依赖的其他构建计划,在本构建计划触发完后再触发依赖于本构建计划的其他的构建计划。
不管本构建计划依赖于哪些构建计划,或者依赖于本构建计划的其他构建计划,触发本构建计划的时候都跟它们无关。
决定怎样清除本构建计划里面的历史构建。
| do not cleanup builds automatically(不自动清除构建): 只有通过手工方式删除构建 |
| keep builds by day(以天为单位保存构建成果): 保存指定的天数。 |
| keep builds by count(以计数来保存构建成果): 保存指定的构建数。 |
本页向您展示从VCS用户到Luntbuild用户的映射表。 当Luntbuild获得最近做check in操作的VCS用户清单的时候,会通过映射表获得相应的Luntbuild用户名, 如果有必要就会向这些用户发送通知。 如果没有针对某个特定的VCS用户做映射,那么Luntbuild会自动将VCS用户名映射到相同的Luntbuild用户名。

在此输入当前项目对应的版本控制系统的登录用户名。
选择对应的Luntbuild用户
该属性值就是构建的当前版本号。
该属性值就是构建的时间/日期。
<propertyfile file="stage/buildInfo.properties">
<entry key="buildVersion" value="${buildVersion}"/>
<entry key="buildDate" value="${buildDate}"/>
</propertyfile>
尽管在Luntbuild调用ant前已经预定义这些属性,但是我们鼓励所有用户在您的构建文件的开始就指定这些属性的默认值,这样即使
不依赖于Luntbuild,您的构建文件也可以正确的执行。如:
<property name="buildVersion" value="luntbuild-1.0"/>
<property name="artifactsDir" value="distribute"/>
<property name="buildDate" value=""/>
该属性的值为构建的当前版本。
该属性的值为构建的日期时间。
该属性指定了构建的制品输出目录。 构建产生的最终的制品都会保存在“artifactsDir”属性对应的目录或者其子目录下。 Luntbuild在这个目录下只保存构建有关的信息。 您可以导出构建的内部制品,如下:
<zip basedir="stage" destfile="${artifactsDir}/${buildVersion}.zip"/>

该页展示了Luntbuild里所配置的所有构建计划。
"Project"列对应的值代表了构建计划所关联的项目。
"Schedule"列对应了该构建使用的构建计划。
"When to trigger"列是触发构建计划的日程安排。
"Latest build"列是该构建计划最后一次的构建实例。
最后一列包括了两个图标。最右边的图标
是“构建历史”("history builds")图标,用于访问对应构建计划的所有历史构建记录。
这个图标左边的的图标
是代表“手工运行构建”("run manually")的意思.
您可以通过点击该图标来手动启动构建。
如果构建已经通过手工方式启动了,那么该按钮左边会出现一个“停止构建”图标
。这个时候点击“停止构建”图标,就可以强制停止正在运行的构建。
接下来的例子是有部分构建已经在运行状态的构建计划列表。

在这一页的右上角还有一个“搜索”图标
。
可以通过该功能查找特定的构建实例,
还可以对查询结果进行操作,例如可以删除查询结果里面列出的构建实例。
构建计划栏靠左的图标显示了构建计划的执行状态。 构建计划的执行状态跟构建状态是有区别的。它代表了构建计划是否成功的触发。 触发构建计划不一定会产生一个新的构建实例, 这取决于当前的构建的策略和代码库是否已经改变。 即使构建成功了,构建计划执行状态可能是“失败”("fail"),例如,可能是因为发送通知邮件出错了。 相反的例子是,尽管构建失败了,但是构建计划执行状态是“成功”("successful"),因为构建计划 成功触发,只是构建本身失败了。 跟构建计划执行有关的细节可以查看系统日志,即每一页上面的"system log"链接。
有两种类型的构建,一种是clean(完整)构建,另一种是incremental(增量式)构建 执行clean(完整)构建的时候,Luntbuild首先将目录清空,然后做一个对VCS模块的完整的检出操作。 执行incremental(增量式)构建,Luntbuild只更新那些自上一次检出后发生改变的源文件。 而且在新的构建开始之前增量式构建的文件不会被清除。 增量式构建速度很快,但是没有完整构建可靠。 例如,如果某人删除了VCS里面的一个文件,对于特定的VCS如CVS,其更新命令并不能将工作目录里对应的文件也进行删除。从而可能 导致错误的构建。
每个构建计划的构建历史信息可以点击图标
该图标("history builds")位于构建计划的每一行记录的右侧。
点击该图标后会列出指定的构建计划的所有构建的历史信息。
通过点击列表中某个构建版本对应的超链接,就可以查看该构建的详细信息。
如下图:

在这个页面的"Build artifacts"(构建制品)这个区域,您可以下载相应的制品。
同时您也可以上传制品,或者创建一个新的目录。
如果您为某个构建提供补丁,那么这个功能就很有用了。
该页面还可以访问构建的日志。日志文件可以帮助您分析构建失败的原因。
在当前构建和上一次构建之间,代码库中的文件和目录的变更都会记录在版本变更日志文件里面。
如果在生成构建的时候选择了"label build",那么在该页面的顶端会显示一个“重新构建”("rebuild")图标
如果点击该图标,那么您可以重复该构建。
重新构建的过程完全使用和上一次构建的一致的VCS设置。
在进行重复构建的时候相应的VCS配置明细会记录在构建日志里面。
点击"Builds"标签可以回到构建计划的页面。
在构建计划和历史构建信息的页面都可以通过点击查询构建图标("search build icon")
来查找构建历史信息.
查询页面如下:

该页面提供了以下查询条件:
指定要查询的构建的版本号。如果选择了"exact match"(完全匹配), Luntbuild的查询功能会根据指定的版本号进行精确的匹配。 否则,只要以指定的版本号作为开头的版本都会纳入查询结果。
指定要查询处于哪种状态的构建。目前提供了以下几个选择项。
| all status |
| successful |
| failed |
| running |
查询指定日期以后生成的构建。日期格式为"yyyy-MM-dd",例如"2004-9-2"
查询指定日期之前生成的构建。日期格式为"yyyy-MM-dd",例如"2004-9-2"
指定查询哪个构建计划下生成的构建。
这一页显示匹配查询条件的构建历史信息列表。
点击删除按钮
.
可以删除列表里面相应的构建
也可以点击移动(或者叫提升)按钮
移动选定的构建,
然后会出现移动构建("Move builds")页面。在这个页面您可以选择一个需要将构建移动到哪个目标构建计划("Destination schedule")。
移动构建提供了以下功能:
在删除构建计划或者项目前将构建保存到其他地方
提升重要的构建。例如,我们可以将"nightly"(日构建)构建计划的某个构建提升到"release"(发布构建)构建计划,这样该构建就可以 准备作为对外发布。

本页显示了当前系统中配置的所有项目。
创建项目需要输入版本控制系统信息,Builder信息,构建计划信息。
还可以通过点击
.
进行项目克隆。
这个功能对创建和现有项目类似的项目很有用。
Luntbuild提供了一整套远程调用接口,这套API提供了以下功能:
触发任何构建计划
配置系统属性以及项目属性
搜索构建任务,获得其构建的信息,例如其构建制品的url等等
通过利用Hessian的web service 协议,这些API用起来很容易。 不过有两个jar文件需要加入classpath,这是最基本的,这两个文件是 hessian-3.0.8.jar 和 luntbuild-api.jar. 这两个文件位于"remoting"目录下。该目录下还有一些描述这些API用法的例子。 例如,TriggerBuild这个例子可以用于实现实时的持续集成,也就是说,无论哪个时候,只要对代码库进行了检入(checkin)的操作, Luntbuild就可以 立即触发构建任务。 下面我们以一个cvs代码库的例子来演示一下:
在项目里面创建一个手工触发的构建计划,用来实现实时的持续集成。 为了让构建更加迅速,我们将构建配置为增量式构建。
检出cvs代码库下CVSROOT目录下的"loginfo"文件,并在该文件内容后添加:
testcvs cmd /c d:/lunt/cvs/lunt/luntbuild/remoting/samples/trigger_build.bat
testcvs可以用cvs代码库下的任意目录名代替, 所有在该目录下checkin的操作都会触发trigger_build.bat命令。 trigger_build.bat位于"remoting/samples"目录下。 当然,您也可以复制相关的文件到任何机器上(远程API的jar文件,TriggerBuild.class文件,trigger_build.bat文件), 只要您在该机器上安装了JDK1.4或者更高的版本。 您需要修改trigger_build.bat前面的目录为您的环境里的相应的目录。 同样还需要修改trigger_build.bat文件里面和classpath有关的部分,将下面这些部分调整到和您的实际环境一致,包括 Luntbuild服务器的url,项目名,构建构建计划。在Unix平台下,基于trigger_build.bat文件, 创建一个trigger_build.sh脚本文件是很容易的。
检入(checkin)"loginfo" 文件。从现在开始,在您在该文件中配置的目录下的每次检入(checkin) 操作将会触发trigger_build命令,该命令会直接触发指定的构建计划,从而运行新的构建来验证当前VCS的健康状况。
如果在项目构建的过程中遇到什么问题,您首先应该检查相应的构建日志(build log)。 默认情况下,Luntbuild只将informational, warning, 和error这三类信息记录在日志。 您可以修改项目配置信息,将"Log level"(日志级别)设置为"verbose"。 Luntbuild的日志记录在"luntbuild installation directory"/logs目录下, "luntbuild installation directory"就是luntbuild的安装目录。 日志里面记录了luntbuild检测到的VCS变更情况,还有其他跟特定的构建无关的信息。 您可以查看这些日志来分析问题,比方说不知道什么原因构建计划或者手工构建没有执行。 可以直接点击每一页右上端的"system log"来查看最近的日志。 不过,对于那些旧的日志文件,您需要直接访问logs目录下的相应的日志文件。
Luntbuild内置了用户认证和授权处理的安全机制。 Luntbuild的安全配置是独立于Servlet容器(或应用服务器)的,所有的配置都在Luntbuild应用程序里面完成。
只有通过认证的用户才可以访问Luntbuild。Luntbuild的功能可以指派给以下的几个基本角色:
| 站点管理员 |
| 项目管理员 |
| 项目构建者 |
| 项目参与者 |
| 角色描述 |
拥有该角色的用户代表了root用户。拥有“站点管理员”角色的用户可以访问所有的Luntbuild的功能,没有任何限制。下面是"站点管理员"有权执行的所有任务:
| 用户管理 |
| 系统属性管理 |
| 创建项目 |
| 管理构建计划 |
| 给不同的用户指派“项目管理员”角色 |
| 检查系统日志 |
拥有该角色的用户具有项目管理的所有功能。下面是"项目管理员"有权执行的所有任务:
| 修改项目配置 |
| 管理VCS模块 |
| 管理构建 |
| 给用户指派项目中的角色(项目管理员,项目构建者和项目参与者) |
拥有该角色的用户只能管理项目构建有关的任务。下面是"项目构建者"有权执行的所有任务:
| 手工触发构建 |
这个角色是最受限制的角色,下面是"项目参与者"有权执行的所有任务:
| 查看构建结果 |
| 查看构建日志 |
| 下载构建的制品 |
Luntbuild的安全配置有两种方式. 其中一种通过修改配置文件(例如修改<your app. server>/webapps/luntbuild/WEB-INFO/applicationContext.xml文件) 基于安全方面的考虑,您首先应该修改站点管理员的口令。 修改默认的站点管理员口令请参考inMemoryAuthenticationDAO这一节。
<bean id="inMemoryAuthenticationDAO" class="net.sf.acegisecurity.providers.dao.memory.InMemoryDaoImpl">
<property name="userMap">
<value>
<!-- this is the build-in site admin user - please change the password for security reasons.
However, name of the user, and its role should not be changed! -->
luntbuild=luntbuild,ROLE_SITE_ADMIN,ROLE_AUTHENTICATED
dummy=dummy,ROLE_AUTHENTICATED
</value>
</property>
</bean>
Luntbuild还提供了一个dummy用户,该用户权限最小,仅用于测试。 其他的用户都应该通过Users(用户)标签页来创建,详情请参考添加Luntbuild用户这一章。 第二种是基于数据库的,可以在Project(项目)标签页定义项目有关的角色。详情请参考 新建一个项目这一章。
Luntbuid的数据(项目,构建计划等等)可以通过"Administration"(管理)页进行导出和导入。
指定您要导出的文件的位置,然后点击"Export"(导出)按钮,数据就会被导出了。 导出的数据以XML的格式保存,虽然导出的文件可以手工编辑,但是千万要小心。 您可以将导出的数据再次导入到其他的Luntbuild实例。如果指定的目录为相对路径, 那么该目录将相对于Luntbuild的安装目录,文件将会保存在该相对路径下。 我们强烈推荐使用绝对路径,这样可以很容易就定位文件的位置。
指定您要导入的文件的位置,然后点击"Import"(导入)按钮,数据就会被导入了。
构建版本号
构建副产品目录,它是build.publishDir的子目录.
构建发布目录
JUnit 测试的Html 报告目录
Build schedule 的名字.
Build schedule 描述
Build schedule 工作目录.
VCS改变了吗?
是否检查依赖的schedule更新?
构建项目名.
构建项目描述.
下面是OGNL表达式的一些例子:
build.schedule.vcsModified - 假若当前构建所使用的VCS内容改变了,值为true
build.schedule.project["testcvs"].vcsModified - 假若“development”视角的"trstcvs"项目的VCS内容发生了改变,值为true
ant("/path/to/command.xml", "targetA") == 0 - 假若执行ant脚本/path/to/command.xml的targetA,返回success的话,值为true.
'\','"'这种特殊字符请按照Java字符串的规则前面加上'\'转义。 若不是绝对路径,Ant文件的路径会被假设为相对于当前项目工作目录,假若target是""或者null,会执行默认的target.
execute("/path/to/command.sh") == 0 -
假若执行此命令的返回值为0,值为true '\','"'这种特殊字符请按照Java字符串的规则前面加上'\'转义。
以上的表达式可以在前面加上'!'来对值反转,比如假若当前项目的VCS内容没有改变,!modified会是true.
以上的表达式可以使用"and","or"进行组合。比如,modified or execute("/path/to/command.sh")==0的值,在当前项目的VCS内容变化了,或者执行特定命令的返回为0的时候,会是 true.
请到http://www.ognl.org学习OGNL表达式的语法。