译自: http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html
持续集成已成为当前许多软件开发团队在整个软件开发生命周期内侧重于保证代码质量的常见做法。在本系列文章中,Nicholas Whitehead给您介绍Hudson ,一个现在非常流行的开源CI服务器。他将告诉读者在您的应用开发环境下(实例中包含Windows XP+Tomcat6或Ubuntu Linux+JBoss AS )如何搭建一个Hudson服务器环境,还包含了Hudson中许多配置项的概述,和执行一个自动编译、测试、报告过程的示例。
持续集成(CI)是一种实践,旨在缓和和稳固软件的构建过程。CI能够帮助您的开发团队应对如下挑战:
实现一个CI服务器你需要的最低要求是,一个易获取的源代码仓库(包含源代码),一套构建脚本和流程和一系列围绕构件构建的可执行测试。图1概括了CI系统的基本结构。
该系统的各个组成部分将按如下顺序来发挥作用:
持续集成 在过去几年因为它的逐渐成熟而颇受欢迎,今天您有不少的CI服务器可供选择,包括商业的和开源的。我个人在同事推荐Hudson 之前已经使用过4个CI服务器。一接触Hudson,它就让我印象深刻。虽然我最初以为Hudson应该不会广为人知,但是在一个名为survey at the Java Power Tools site 的网站显示,在调查谁是最广泛使用的CI服务器时,受访者给它投了37.8%的选票(本文写作之时)。
构件:构建完成后的软件成品,如JAR或WAR等,后续文章将不再重新说明。
--SCM(源码控制管理)
Hudson完全支持与Subversion的集成,也只需少量配置就可以把CVS集成在一起,假定CVS客户端已经安装在Hudson所在的主机。其他一些源代码管理(SCM)解决方案Hudson也通过以插件的方式予以支持。在本文写作之时,Hudson已经对下列SCMs提供了支持:
在这篇文章中,我将使用Subversion和Java.net源代码仓库,所以这些插件您都不必安装了。
Hudson是一个存放在Java.net免费的和开放源代码的软件产品。最初是由Kohsuke Kawaguchi编写的,他是一名Sun工程师,在2005年2月宣布释放了他的博客。Hudson已经有大约154个版本。
以下的一些理由将告诉您我为什么喜欢Hudson,为什么我会推荐给您,除非您有任何不寻常的需求:
安装Hudson: Windows XP 或 Ubuntu Linux操作系统
使用Hudson,您需要一个方便和可支持的源代码控制系统(请参阅“支持SCMs ”列出的清单),一份可构建构件的源码,和一串可进行构建的工作脚本。除此之外,您需要确定您已正确安装和配置Hudson服务器[安装一个版本在1.5或以上的Java ;Hudson安装文件,该文件是以Java EE的 Web归档模式(war)存在]。启动该服务器很简单,只需执行下面的命令行:
C:\hudson> java -jar hudson.war
这可能是较普通的做法,然而,我们一般会把Hudson部署到一个基于Servlet的2.4和JSP 2.0规格的Java servlet容器里,如GlassFish, Tomcat, JBoss和Jetty。在接下来的章节,我将引导您完成安装两个Hudson的场景:一个使用Windows XP+Tomcat6,另一个使用Ubuntu Linux操作系统+JBoss 4.2.3。(Ps:此文章发布后JBoss AS 5.0已经发布了。)
安装Hudson:Windows XP+Tomcat6
首先我假定您已经在您的Windows XP系统中安装了1.5版或更高的Java。以下步骤将安装基于Windows Service Installer的Tomcat6.0.18,使Hudson随Windows XP启动并且不需要用户登录的情况下启动,并在后台运行。下载Tomcat的文件为apache-tomcat-6.0.18.exe,现在开始执行安装。
Tomcat的安装会提示您选择安装选项。一定要选择Custom 选项,然后选择Service,如图2所示,这样Tomcat将作为一项服务运行。
下一步,选择一个目录来安装Tomcat,如图3所示。我强烈建议您选择一个没有空格的目录。嘿嘿,我相信你以后会感谢我。
现在安装程序将要求您设置端口。默认端口为8080,这可能不是好的建议;当然,你只要确保其它应用程序没有使用该端口。如果你不更改,Tomcat也将正常启动。您也将被要求为Tomcat管理员提供一个用户名和密码。上面要展示的这一切,如图4所示。
安装程序将要求您提供您已经安装Java的JRE的位置。正如你所看到的图5 ,我使用的Sun Java 1.6.0_07 。
一旦你点击Install,安装程序将完成执行和启动服务。您可以在您的Web浏览器输入http://localhost:8080核实Tomcat是否正常运行。(如果您使用的计算机上没有安装Tomcat,您可以使用适当的名称或IP地址来取代它。)。该网页截图见图6 。
现在,准备安装Hudson,复制hudson.war文件到您Tomcat安装目录的webapps子目录。如果您使用的是如图3所示的同一个安装目录,这将是C:\Tomcat6\webapps 。Tomcat将把该war文件进行热部署,现在要做的最简单的事情就是重启Tomcat。第一种是打开一个Dos界面,并输入以下命令:
C:\Tomcat6>net stop Tomcat6
C:\Tomcat6>net start Tomcat6
第二种是打开Window的服务。这个工具在控制面板的管理工具组中里。点击Windows工具栏,然后选择设置,然后控制面板。在服务程序中寻找为Apache Tomcat的服务名,然后重启。如图7。
Hudson现在应该已经安装。您可以通过在您的Web浏览器输入http://localhost:8080/hudson验证它。
Hudson的主页面如图8。
Ha!Ha!就是这么简单!如果您对一个基于Windows XP和Tomcat 的应用开发环境满意,这就是你所有的设置。如果您想要一个JBoss和Ubuntu Linux操作系统的Hudson运行环境,请继续阅读。
想要在Ubuntu上安装Java 1.6,请打开一个shell并执行以下命令:
sudo apt-get install sun-java6-jdk
此步骤完成,系统将提示您输入您的密码。
请注意,安装JBoss有几种方法的;我这里推荐的方式,您将创建一个专用JBoss用户。最可取的做法是把JBoss安装在您的主目录,这被认为是最佳的做法。这里有摘录了Ubuntu论坛中关于如何安装它的简要描述。
首先,你需要下载一个JBoss 4.2.3.GA的安装包。查找到JBoss - 4.2.3.GA.zip 。
下一步,您将需要为指定的JBoss创建一个用户、主目录和一个组。虽然组策略不是本文探讨的话题,但我可以告诉你,它可以允许您在您的Ubuntu服务器上给其他用户分配JBoss的相关权限。
清单1显示了如何用命令行创建JBoss的主目录、用户和组,和如何安装JBoss服务器。有些命令只输入了前缀,因为它们是一些专属命令。
echo Create the jboss group
sudo groupadd jboss
echo Create the jboss user, define bash as the user's default shell and /home/jboss as the home directory
echo and make the user jboss part of the group jboss
sudo useradd -s /bin/bash -d /home/jboss -m -g jboss jboss
echo Copy the jboss-4.2.3.GA file to /home/jboss or download directly into that directory
sudo mv jboss-4.2.3.GA /home/jboss
echo Change the owner of the file to jboss
sudo chown jboss:jboss /home/jboss/jboss-4.2.3.GA
echo Log into the jboss account
sudo su jboss
echo Go to the jboss home directory
cd
echo Unzip the file jboss-4.2.3.GA
unzip jboss-4.2.3.GA
echo Create a symbolic link "jboss" for "jboss-4.2.3.GA".
echo This allows you to change JBoss versions with minimal changes
ln -s jboss-4.2.3.GA jboss
如果您安装前未解压,请输入以下命令(当用户开始工作的时候)来安装它:
Sudo apt-get install unzip
JBoss服务器现在已经基本安装完成。您可以使用下面的命令启动服务器:
/home/jboss/jboss/bin/run.sh
然而,你会需要在这个例子中安装一个自动启动脚本,以便使服务器能随主机启动而自动启动。在JBoss的下载中附带了三种不同的int.d 脚本,但是每个都需要做些调整;您也可以下载jboss-init.sh,它能自动启动和停止JBoss服务器。清单2中显示了它的运行命令。
echo Move the jboss-init.sh file to /etc/init.d/ and rename it to jboss
sudo mv jboss-init.sh /etc/init.d/jboss
echo Change the owner of the /etc/init.d/jboss file to root
sudo chown root:root /etc/init.d/jboss
echo Make the /etc/init.d/jboss file executable
sudo chmod ug+x /etc/init.d/jboss
echo Activate the /etc/init.d/jboss file in the rc.d lifecycle process.
sudo update-rc.d jboss defaults
现在您可以使用下面的命令启动JBoss服务器来作为后台进程(当您注销它也不会终止):
sudo /etc/init.d/jboss start
要检验您的JBoss正在运行(最多可能需要几分钟的准备时间),请打开您的浏览器输入 http://localhost:8080/jmx-console 。如果成功,应该就会出现如图9显示的JBoss JMX控制台界面。
部署Hudson很简单,只需要你把hudson.war 复制到/home/jboss/jboss/server/default/deploy下。你最好是使用JBoss用户,这样才能确保JBoss服务器有权限读取该文件。Hudson应该在几秒钟内就会部署完毕。然后你可以通过在浏览器中输入http://localhost:8080/hudson 来验证Hudson是否安装成功。显示的页面跟图8一致 。
现在您通过刚才的步骤,应该在Windows XP的Tomcat或Ubuntu Linux操作系统的JBoss上把Hudson安装并成功运行了吧。这也是在操作系统中安装大多数应用服务器和类似web任务管理系统常见的步骤;我想你也同意,安装Hudson真是小菜一碟 。下一步,您将看到在配置Hudson的时候您需要了解的一些基础知识,还将告诉您如何完成一次构建。
如果您想在Hudson完成一次构建,必须符合下列条件:
在本文中,您将使用Ant version 1.7 来构建示例代码。
在您开始构建软件之前,需要对Hudson进行一些小小的配置。首先,您必须告诉Hudson您的Java JDK和Ant的安装位置。点击http://localhost:8080/Hudson 打开Hudson的主页,单击Manage Hudson 。该网页上附带了下一步,单击Configure System 。
在系统配置页面,这个列表中的第一个项显示的是Home directory 。这里包含了Hudson 要执行的所有工作区和存储它的所有配置。我将在本文最后回到对这个目录的介绍。
为了配置一个JDK和Ant实例,请在每一节下面单击Add 按钮,这里将添加实例的名称和绝对地址。图10描述了这两个部分。
一般情况下,您可以对您要安装的JDK和Ant指定一个任意的名称。这样做是因为您可以根据您项目的需要配置多个实例,假如您需要Java的JDK是1.4,1.6和1.7,以及Ant1.6和1.7。当您要对您构建的项目进行配置,就可以使用这些实例来灵活运用。请注意,Hudson会在打开这个页面时就提示您JAVA_HOME和ANT_HOME的空白栏不是一个有效目录。当您输入一个有效的目录后,这些警告也将继续保留(但不会出现在页面上,只在目录无效时再触发)。这只是一个简单的例子,它只是为了表达Hudson的用户友好性 :它会给您一个即时反馈,而不是在等用户提交后再告诉您一个“目录无法找到”的错误。
因为我已经安装了一个Java 1.6的JDK ,我可以按照如下来配置我的JDK:
如果您使用的是Windows ,您只要下载一个Ant 安装包,然后将它解压缩到目标目录。在Ubuntu中,您可以使用下面的命令来安装Ant:
sudo apt-get install ant
sudo apt-get install ant-optional
ant -version
Apache Ant version 1.7.0 compiled on August 29 2007
然后把Ant安装到Ubuntu的/ usr / share /ant下。
图11中显示了在Ubuntu下配置JDK和Ant。当我的标签字段指向具体的安装地点后,警告就消失了。然后我也加入了第二个Ant实例,这是个错误的配置 。在图中,您可以看到,如果为Ant的实例输入一个有效的目录,但是实际上路径并不正确,Hudson就会警告您,您输入的(地址)似乎不正确。JDK和Ant一样(都会提出类似的警告)。后来我从输入框中删除了这个错误的Ant地址,只留下了有效的(Ant地址)。
在下面进行同样的操作时,您将会看到这样的一个警告:"Hudson无法找到可执行的CVS"。如果您没有使用CVS ,可以直接地忽略它。
最后一个重要的选项就是在此网页上配置SMTP,使Hudson能够以电子邮件的方式发送重要的通知,例如构建失败。如果您的SMTP服务器需要身份验证,您将需要使用高级选项。我使用谷歌的应用服务来托管域,但如果您拥有一个有效的Gmail帐户,您可以使用您的Gmail地址和谷歌的SMTP服务器。图12显示了我在Hudson的邮件服务器配置。
现在基本的系统级配置已经完成。您可以准备进入一次具体的构建工作了。
打开http://localhost:8080/Hudson就会显示Hudson的主页,点击 New Job 。图13显示了下一步的截屏;这时,您需要为新的构建工作指定一个名称。这里有几种的工作类型可供您选择,但在本文的讨论范围内,您将把重点放在Build a free-style software project 上。对于其他的类型,我经常使用的Copy existing job ;这主要为了能让我在复制现有的工作基础上新建一次构建工作。
接下来,我将为我的HeliosJMX项目添加一次构建工作,它的源码存放在java.net网站的Subversion仓库里 。因为我将要构建的是trunk上最新的源代码,所以我将把这个工作命名为HeliosJMXTrunk 。输入完成,单击OK 。
你将会看到大量的关于这个工作的配置,这是一些很长的细节,关于它的详细配置如下所列。在每个选项右侧都会有一个小问号(? [单击“展开”和“隐藏”])图标。请不用疑惑,因为点击它您就能获取关于每个配置项的详细说明。这不会迫使您进入另一个网页,从而失去您的工作进程;而是在本网页插入帮助文本,当然这样使用帮助是微侵入的,不会对网页造成什么影响。事实上在Windows和Linux 下几乎所有的这些配置也都是相同的。
Build periodically : 此选项 (也是使用定时作业表达式)仅仅通知Hudson按指定的频率对项目进行构建,而不管SCM是否有变化。我这个作业就属于目标测试环境是按某种方式定期修订的而SCM却是静态的情况。如果您想在这个作业中运行一些测试用例的话,它可能就很有帮助。
Add build step : 按一下这个按钮,添加了一项指令以执行构建脚本。您的指令可以是下列之一:
Ha!Ha!看来这些信息太多了,让您有点无法把握吧!没关系,为了让您更好的掌握这一切,您将在下面看到一个构建作业的样例。这样一来,您就会了解到这些配置项是如何运用到实践中的。
下面是一个如何在实际作业中配置我的Hudson服务器。这项作业构建的是我命名为“HeliosJMX”的实用类库。这一节的所有图片都是我为了描述上一节而因此新建一个作业的截图。
在图14中,您可以看到项目的名称、说明和一个废弃策略。(指示Hudson保持过去5次构建,但废弃更前的构建。)
图15显示了在此次作业中Subversion的安装位置。 这个Subversion仓库的URL网址存放在java.net上: https://helios.dev.java.net/svn/helios/helios-jmx/trunk(貌似现在进不去了,因为需要密码)。Local module directory属性是一个可选的和额外的子目录,它将为此次构建创建一个工作区。
“Use update”复选框是很重要的。这是Hudson准备从工作区构建执行前先刷新Subversion仓库以获取最新源码的最快捷的方式。这一动作是行之有效的,并在大多数情况下也相当快。警告,如果源构件已从仓库删除,工作区也会利用此步骤持续更新源码。另一种选择当然是禁用此选项,若是这样,Hudson将清除工作区并从源码仓库中重新注入。
最后一个选项是指定一个源代码仓库浏览器,诸如FishEye或VisualSVN 。如果您拥有下面列表提供这些产品的一种,就选择适合的浏览器并把它指着自己的源代码仓库地址。
在图16中,您可以看到我填写的构建触发器详情:我每隔5分钟就检查一次Subversion,它们一有变化就构建一次。
(帮助:该字段遵循cron[Linux下任务定时系统]的语法(两者间仅仅有轻微差异)。
具体来说,每行由TAB键或空格隔开的5个字段组成:
MINUTE HOUR DOM MONTH DOW
MINUTE 一小时内多少分钟(0-59)
HOUR 一天内多少小时(0-23小时)
DOM 一个月内多少天(1-31)
MONTH 每月(1-12)
DOW 星期几(0-7),其中0和7都表示周日。
如果要指定一个字段允许多个值,就按下面提供的操作步骤(指定)。
优先顺序如下:
'*' 可用来指定所有有效的值。
'M-N' 可以用来指定一个范围,比如“1-5”
'M-N/X'或'*/X' 可用于在指定范围内跳跃一个X的值,比如在MINUTE字段中"*/15"表示"0,15,30,45","1-6/2"表示"1,3,5"。
'A,B,...,Z' 可以用来指定多个值,比如“0,30”或“1,3,5”。
任何空白行和'#'开始的行都将表示为注释而不予理睬。
此外,''@yearly', '@annually', '@monthly', '@weekly', '@daily', '@midnight', '@hourly'都是支持的 。
举例说明:
#每分钟
* * * * *
#每一小时后第5分钟
5 * * * *
)
图17显示了我定义的Ant任务,以便执行构建过程。配置选项如下:
图18显示了构建完成后我定义的一些动作:
图19显示了构建完成后我定义的更多的动作:
Publish FindBugs analysis results : 我的构建脚本执行FindBugs静态代码,它用于分析作业的源代码,并生成一个调查报告。此选项表明Hudson FindBugs插件已安装。它指示Hudson检索FindBugs XML结果报告,汇总它们到当前作业的历史趋势中并且暴露在当前作业的主页上。FindBugs插件的高级选项允许您当FindBugs上报时确定断言的类别,以及在Hudson获取关于当前作业的状态时,它们将如何影响最终的测定。(更多信息请查阅关于题为"作业状态"这一节)
E-mail notification : 定义一个邮件列表( 多项用空格间隔),以便当构建失败时发送一份通知。当一次作业总是不稳定或者被终止,"Send email for every unstable build "就可以不选,以阻止Hudson不断发送一份已获知条件的邮件通知。
Publish Cobertura coverage report : 我的构建脚本使用了Cobertura作为依据代码覆盖指令产生类文件的容器。当JUnit测试运行时,Cobertura 监测代码覆盖范围并且在测试完成后生成一个覆盖率报告。此选项表明Hudson Cobertura已经安装。它指示Hudson检索已确定的Cobertura XML 覆盖率报告,汇总它们到当前作业的Cobertura历史趋势中并且暴露到当前作业的主页上。标题为“Coverage Metric Targets”的选项表明在Hudson获取关于当前作业的状态时,允许你通过指定代码覆盖地图中的覆盖程度来影响最终的测定。(更多信息请查阅关于题为"作业状态"这一节)
Ha!总算到这一点了,如果您已经确认了这个新的作业,现在就运行它吧,看看它是怎么工作的。不管您是如何配置您的构建触发步骤,您都能够随时请求一次特定的构建(总之,随需应变),除非您选择了Disable Build。当您打算建立一个新的构建作业,或者调试像我上面描述的这些截图,如果没有等到构建触发器讲完是没有什么意义的。在下一节中,我将告诉您如何请求一次特别的构建,以及观察它到底是如何运行作业的。
译自: http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html
要运行您新近创建的作业,第一步就是跳转到http://localhost:8080/hudson(Hudson 控制面板)。图20显示了我在Ubuntu服务器上设置的全新的Hudson实例。
在截屏的中心部分,您可以看到我刚刚定义的HeliosJMXTrunk 作业。当然这个截屏上还有其它一些很值得我们关注的条目:
接下来请求一次构建,您可以点击作业列表表格中最右侧的构建图标。当然,您也可以单击当前作业的名称,它将指向您当前作业的主页,然后单击Build Now链接按钮。
当作业一旦运行,您将会看到这个作业正在队列中的仪表板和当前工作主页上运行。这两种显示如图21 。
一般来说,您想在某些时候以通过视图输出作业的运行来监控当前作业的进展情况。为此,您链接到作业主页,单击Console Output。如果工作已完成,这将显示构建脚本产生的静态输出,;如果作业仍然在运行中,Hudson将不断刷新网页的内容,以便您可以看到它运行时的输出。图22 描述了这个非常有用的功能。
一旦构建完成后,完成后的作业将会有三个地方进行显示。
下面简要介绍控制面板中符号的意义,它描述了“作业状态”这一部分,黄色球标意味着构建成功,但被认为不稳定。W栏目代表着“天气”,这里的小太阳图标表示阳光普照。因为构建成功了而且没有任何处理插件(如上面所述的插件)来通知Hudson报告任何糟糕的情况。当然值得一提的是,最近一次构建花费了15分钟。这是因为我为测试套件中的一些单元测试时使用了一些调度组件,故意使运行时间延长了。把实际构建和测试在当前作业分隔开来运行其实是一个很好的选择。
当前作业主页上还包含了一些有趣的条目。左侧栏的链接主要控制作业的配置(为了修改你在New Job后的定义)、删除作业、构建作业。右边部分的链接指向最新的项目报告和构件。
构建主页是针对一个构建实例而特设的。请注意,Hudson会分配一个内部的版本号用于跟踪分布式构建。此网页还列出Subversion的最新修订(没有在此次构建上的),同样还有三个失败的JUnit测试案例。这三个失败就是导致Hudson认为此次构建不稳定的原因,这说明该次软件构建并没有错误,只是有单元测试失败了。接下来的构建中,如果没有了任何单元测试错误的话,在控制面板和工程主页将显示一次稳健的构建。如图26中截屏所示。
我现在已经涵盖了作业的配置、作业的启动以及请求一次即时构建所必须的步骤。接下来我们简单的讨论一下在Hudson中如何描述一个作业的状态。
在上面展示的截图中,您将注意到有两个图标描述当前作业的状态。Hudson使用两个概念来介绍一个作业的总体状况:
译自: http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html
要运行您新近创建的作业,第一步就是跳转到http://localhost:8080/hudson(Hudson 控制面板)。图20显示了我在Ubuntu服务器上设置的全新的Hudson实例。
在截屏的中心部分,您可以看到我刚刚定义的HeliosJMXTrunk 作业。当然这个截屏上还有其它一些很值得我们关注的条目:
接下来请求一次构建,您可以点击作业列表表格中最右侧的构建图标。当然,您也可以单击当前作业的名称,它将指向您当前作业的主页,然后单击Build Now链接按钮。
当作业一旦运行,您将会看到这个作业正在队列中的仪表板和当前工作主页上运行。这两种显示如图21 。
一般来说,您想在某些时候以通过视图输出作业的运行来监控当前作业的进展情况。为此,您链接到作业主页,单击Console Output。如果工作已完成,这将显示构建脚本产生的静态输出,;如果作业仍然在运行中,Hudson将不断刷新网页的内容,以便您可以看到它运行时的输出。图22 描述了这个非常有用的功能。
一旦构建完成后,完成后的作业将会有三个地方进行显示。
下面简要介绍控制面板中符号的意义,它描述了“作业状态”这一部分,黄色球标意味着构建成功,但被认为不稳定。W栏目代表着“天气”,这里的小太阳图标表示阳光普照。因为构建成功了而且没有任何处理插件(如上面所述的插件)来通知Hudson报告任何糟糕的情况。当然值得一提的是,最近一次构建花费了15分钟。这是因为我为测试套件中的一些单元测试时使用了一些调度组件,故意使运行时间延长了。把实际构建和测试在当前作业分隔开来运行其实是一个很好的选择。
当前作业主页上还包含了一些有趣的条目。左侧栏的链接主要控制作业的配置(为了修改你在New Job后的定义)、删除作业、构建作业。右边部分的链接指向最新的项目报告和构件。
构建主页是针对一个构建实例而特设的。请注意,Hudson会分配一个内部的版本号用于跟踪分布式构建。此网页还列出Subversion的最新修订(没有在此次构建上的),同样还有三个失败的JUnit测试案例。这三个失败就是导致Hudson认为此次构建不稳定的原因,这说明该次软件构建并没有错误,只是有单元测试失败了。接下来的构建中,如果没有了任何单元测试错误的话,在控制面板和工程主页将显示一次稳健的构建。如图26中截屏所示。
我现在已经涵盖了作业的配置、作业的启动以及请求一次即时构建所必须的步骤。接下来我们简单的讨论一下在Hudson中如何描述一个作业的状态。
在上面展示的截图中,您将注意到有两个图标描述当前作业的状态。Hudson使用两个概念来介绍一个作业的总体状况:
译自: http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html
Hudson允许您创建多个构建轨道;根据您的软件开发过程,您可能希望依据软件项目创建一个以上的构建轨道。构建轨道是针对一个具体的项目或产品的构建作业,它们都具有独特的配置。区分构建轨道的因素可能是当构建作业在同一个项目中从SCM的不同分支获取源代码;另外,在执行同一份源代码时,不同的轨道也可以处理不同的任务。其中,在具有相同逻辑的软件项目中可能直接影响你创建不同的构建轨道的有:
图29描述了一个源代码控制分支和对应的Hudson构建轨道的合适的逻辑结构。
Hudson能够很容易地复制一个现有的作业从而创建一个新的作业。为此,您需要浏览到Hudson的控制面板,单击New Job 链接。输入新工作的名称,然后选择Copy existing job。请注意,当您开始输入时,Hudson将会把现有的作业填充到一个列表框,您可以在此复制符合您所输入的内容。然后单击OK,这样就创建了你的新作业。图30描述了这个过程。
一旦您通过这样的方式创建了一个新的作业,除了名字之外它实际上只是您当前作业的副本,所以您会想到通过修改选项从而修改这个新拷贝。例如,您想要:
当您创建一些构建轨道后,您可能发发现您的控制面板已经成为了一个有点杂乱无章的长串作业列表。一种可取的做法就是,以创建视图的方式重组控制面板。一个面板视图包含一组相关的作业,您可以在控制面板上定义一个单独的标签以供显示。当为相关的作业创建视图组时,您就会理解到实施一致的作业命名约定是多么有益了。
要创建一个视图,单击控制面板中标“+”的小标签。在新的视图页面,输入新组的名称和一个可选的描述信息。Hudson将在当前每个作业配置一个的标记复选框,因此您就可以在视图中包含想要的作业了。
然而,在我看来还有一种更好的方式来组织作业。单击标记为Use a regular expression to include jobs in the view的复选框,它提供一个正则表达式,在您想要的作业中匹配名称。这对于作业遵循了一致命名约定来说就很方便。您可以按一般的软件项目归类,或者按可能的构建类型作为作业组来配置视图。我已采取了后一种做法,如图31。我在那里建立了一个名为“Release Builds”的视图,其中包括所有包含" release "关键字的作业。
使用正则表达式归类的办法还有其它优势,就是在新作业被创建后,它们将会按作业名称匹配的方式自动地添加到相关的视图中,但是原来指定方式选择作业的视图则需要手动更新。
图32显示了基于构建类型的新近组织过的面板。
由Hudson类库现有的Hudson功能性扩展和开发者们为Hudson提供的新功能都可以称之为Hudson插件。有些插件可以无缝添加到您的构建过程,然而其它,诸如除CVS和Subversion的SCM插件则需要实现与源代码控制系统的支持,从而有必要使用Hudson完成您的安装。
目前有许多可用的插件,因此我就不在这里一一列举了,但这些插件总的来说有如下类别:
Triggers: 事件监听并触发构建的插件。例如,URL改变触发器将监控一个URL;当地址内容发生改变,这个触发器就将执行一次作业。
Build tools: 实现额外构建工具的插件,如MSBuild和Rake。如果您想在Hudson中构建非Java的软件时这些就特别有用。
Build wrappers: 通常涉及时执行在受控制的构建过程本身之前和之后事件的插件。例如, VMware插件将在构建之前启动一个客户虚拟机,建立和然后在构建完成后关闭它。这在您可能需要访问VM以执行单元测试的情况下是非常有用的。
Build notifiers: 这些插件是做为作业事件发布通知的替代方式--通过Twitter 、IRC、谷歌日历活动等等。
Slave launchers and controllers: 这是Hudson中一个非常强大的功能,本文中没有解释从机Hudson实例扮演主机Hudson实例工作。目前在这个类别中只有一个插件:SSH从机插件,它允许从属来管理超过一个SSH的链接。
Build reports: 这一系列插件主要是在用您的源代码或者构件进行一些分析的基础上创建有用的报表。例如,Cobertura 插件总是通过您的构建脚本增量统计覆盖率。
External site integrations: 以协助Hudson整合与其他应用程序的插件,如Jira或Bugzilla 。
Artifact uploaders: 以协助您把构件发布到一些网络终端的插件,如java.net版本库或一个FTP服务器。
Page decorators: 为Hudson网页增加一些美化或者有用的装饰物,比如在Hudson中增加谷歌跟踪服务以跟踪其所有网页的谷歌分析插件。
Hudson 插件管理器允许您安装新的插件,和更新您Hudson服务器上的插件。管理者将连接到联机资料库,检索可用的和已更新的插件。如果您的Hudson服务器无法直接连接到外部资源,您可以从Hudson网站上下载您想要的插件。点击网站上的plugins文件夹,您将看到一个可用的插件列表。这独特的插件文件以.hpi 作为扩展名。一旦您下载了该插件,复制它到Hudson主目录下的插件子目录。(Hudson主目录被称为.Hudson,将在用户的主目录下运行Hudson服务器。)一旦文件被复制,您将需要重新启动Hudson才能使插件生效。使用Hudson插件管理器,单击控制面板上的Manage Hudson链接,然后点击Manage Plugins。插件管理器显示在图33中,它包含四个标签:
一旦您想要的插件已经安装或者已更新,Hudson需要重新启动才能使它们生效。如果您使用的服务器是JBoss,请注意,您可以通过修饰JBoss的部署目录下的hudson.war已恢复到您原来的已部署的状态来做到这一点。 (在更新一个文件的时间戳时,修饰是一种很实用的功能。) 这会导致JBoss重新部署Hudson服务器,从而达到重新启动的相同效果。
了解某些类型的构建报告插件的一种重要的概念是,它们并不一定为你产生很精髓的报告。相反,它们歹为产生的增量报告而处理额外一些的任务;在某些情况下,它们会把您产生的报告重新格式化到本地Hudson的综合报告中。 例如, Cobertura插件必须依赖于您的构建脚本必须实现检测您的目标测试类、执行单元测试、并生成详细构建覆盖率报告的一系列工序。接着插件更新正在运行的历史趋势的覆盖率报告,以便使您可以随着时间的推移查看覆盖率的变化。在图34中描述了一个这样的趋势报告的样例。
此外,JUnit测试结果和FindBugs的插件例子将创建Hudson本地报告并显示在作业或构建实例的主页上。 (JUnit插件实际上已经存在并且无需安装。 )图35是通过FindBugs插件产生内置的报告并显示构建实例主页上的一个例子。
您可以实现您自己的插件,以提供你能想到的几乎任何类型的Hudson扩展。如果您有兴趣这样做,你可以在Hudson Wiki找到参考、文档和教程(见下面的资源部分)。
以上就是我介绍的Hudson持续集成服务器。我想你将会发现它是一个很好的软件;多亏它的易于安装和配置,你可以体验一下它的启动和运行的速度有多快。 基于java.net网站有活力的书籍中使用Hudson开发项目的主机情况,Hudson很明显具有越来越多的趋势。我粗略地浏览了邮件列表,表明人们接受了调查并且一贯和迅速的做出了反应,但我必须补充,这段时间我一直在使用它,我也没有遇到任何问题以促使我寻求支持。我希望你会喜欢并探索Hudson--签出资源部分下面的更多文章,下载及相关的链接。