求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
使用Hudson进行持续集成
 
作者 米汤,火龙果软件    发布于 2013-11-15
 

持续集成已成为当前许多软件开发团队在整个软件开发生命周期内侧重于保证代码质量的常见做法。在本系列文章中,Nicholas Whitehead给您介绍Hudson ,一个现在非常流行的开源CI服务器。他将告诉读者在您的应用开发环境下(实例中包含Windows XP+Tomcat6或Ubuntu Linux+JBoss AS )如何搭建一个Hudson服务器环境,还包含了Hudson中许多配置项的概述,和执行一个自动编译、测试、报告过程的示例。

持续集成(CI)是一种实践,旨在缓和和稳固软件的构建过程。CI能够帮助您的开发团队应对如下挑战:

1、软件构建自动化 :使用CI,您只要按一下按钮,它会依照预先制定的时间表,或者响应某一特定事件,就开始进行一次构建过程。如果您想取出源码并生成构件,该过程也不会局限于某一特定IDE、电脑或者个人。

2、持续自动的构建检查 :CI系统能够设定成持续地对新增或修改后签入的源代码执行构建,也就是说,当软件开发团队需要周期性的检查新增或修改后的代码时,CI系统会不断要求确 认这些新代码是否破坏了原有软件的成功构建。这减少了开发者们在手动检查彼此相互依存的代码中变化情况需要花费的时间和精力(说直接一点也是钱啊,呵 呵)。

3、持续自动的构建测试 :这个是构建检查的扩展部分,这个过程将确保当新增或修改代码时不会导致预先制定的一套测试方案在构建构件后失败。构建测试和构建检查一样,失败都会触发通知(Email,RSS等等)给相关的当事人,告知对方一次构建或者一些测试失败了。

4、构件生成后续过程的自动化 :一旦自动化检查和测试的构建已经完成,一个软件构件的构建周期中可能也需要一些额外的任务,诸如生成文档、打包软件、部署构件到一个运行环境或者软件仓库。只有这样,构件才能更迅速地提供给用户使用。

实现一个CI服务器你需要的最低要求是,一个易获取的源代码仓库(包含源代码),一套构建脚本和流程和一系列围绕构件构建的可执行测试。图1概括了CI系统的基本结构。

图1. CI系统的基本结构

该系统的各个组成部分将按如下顺序来发挥作用:

1.开发者检查新增和修改到源代码仓库后的代码。

2.CI服务器会为每一个项目创建了一个单独的工作区。当预设或请求一次新的构建时,它将把源代码仓库的源码存放到对应的工作区,在哪里构建就执行到哪个目录下。

3.CI服务器会在新近创建或者更新的工作区内执行构建过程。

4.一旦构建完成,CI服务器就会在一个新的构件中选择性地执行原先定义的一套测试。如果构建失败,相关责任人将会通过电子邮件、即时短信或者其他的方式获取到(失败)通知。

5.如果构建成功,这个构件会被打包并转移到一个部署目标(如应用服务器) 和/或存储为软件仓库中的一个新版本。这个如软件仓库可以是CI服务器的一部分,也可以是一个外部的仓库,诸如一个文件服务器或者像Java.net、 SourceForge分发的一个有效网址。源代码仓库和构件仓库是可以分开的,实际上它可以利用一些根本没有包含任何源代码控制系统(CVS、SVN、 CSS等等)的CI服务器。

6.CI服务器通常会通过某种控制台来进行项目的配置和调试,并且根据请求响应相应的操作,诸如即时构建、生成报告,或者检索构件。

一、Hudson: 持续集成服务器

持续集成 在过去几年因为它的逐渐成熟而颇受欢迎,今天您有不少的CI服务器可供选择,包括商业的和开源的。我个人在同事推荐Hudson 之前已经使用过4个CI服务器。一接触Hudson,它就让我印象深刻。虽然我最初以为Hudson应该不会广为人知,但是在一个名为survey at the Java Power Tools site 的网站显示,在调查谁是最广泛使用的CI服务器时,受访者给它投了37.8%的选票(本文写作之时)。

构件:构建完成后的软件成品,如JAR或WAR等,后续文章将不再重新说明。

支持的SCMs

--SCM(源码控制管理)

Hudson完全支持与Subversion的集成,也只需少量配置就可以把CVS集成在一起,假定CVS客户端已经安装在Hudson所在的主机。其他一些源代码管理(SCM)解决方案Hudson也通过以插件的方式予以支持。在本文写作之时,Hudson已经对下列SCMs提供了支持:

Accurev

BitKeeper

ClearCase

Git

Mercurial

Perforce

StartTeam

Team Foundation Server

Visual SourceSafe

URL SCM (一个特殊的SCM插件,允许使用网址作为SCM)

在这篇文章中,我将使用Subversion和Java.net源代码仓库,所以这些插件您都不必安装了。

Hudson是一个存放在Java.net免费的和开放源代码的软件产品。最初是由Kohsuke Kawaguchi编写的,他是一名Sun工程师,在2005年2月宣布释放了他的博客。Hudson已经有大约154个版本。

以下的一些理由将告诉您我为什么喜欢Hudson,为什么我会推荐给您,除非您有任何不寻常的需求:

1、这是迄今为止我使用过的所有CI产品在安装和配置上中最简单的(CI产品)。

2、基于Web的用户界面非常友好、直观和灵活,在许多情况下,还对需单独配置的部分提供了基于AJAX的即时反馈。

3、Hudson是基于java开发的(如果你是一个Java开发人员,这是非常有用的),但它不仅限于构建基于Java的软件。

4、Hudson本身是一个很简洁的组件,但它提供了一组很明确和可扩展API的Hudson组件。这批组成一个大的类库的Hudson组件反过来又丰富了Hudson的功能;它们都是开源的,而且它们可以直接通过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将作为一项服务运行。

图 2. Tomcat 安装项

下一步,选择一个目录来安装Tomcat,如图3所示。我强烈建议您选择一个没有空格的目录。嘿嘿,我相信你以后会感谢我。

图 3. 选择一个安装目录

现在安装程序将要求您设置端口。默认端口为8080,这可能不是好的建议;当然,你只要确保其它应用程序没有使用该端口。如果你不更改,Tomcat也将正常启动。您也将被要求为Tomcat管理员提供一个用户名和密码。上面要展示的这一切,如图4所示。

图4. 选择一个监听端口和管理员的用户名和密码

安装程序将要求您提供您已经安装Java的JRE的位置。正如你所看到的图5 ,我使用的Sun Java 1.6.0_07 。

图 5. 为Tomcat提供一个Java JRE

一旦你点击Install,安装程序将完成执行和启动服务。您可以在您的Web浏览器输入http://localhost:8080核实Tomcat是否正常运行。(如果您使用的计算机上没有安装Tomcat,您可以使用适当的名称或IP地址来取代它。)。该网页截图见图6 。

图 6. 验证Tomcat是否安装完成和正确运行

现在,准备安装Hudson,复制hudson.war文 件到您Tomcat安装目录的webapps子目录。如果您使用的是如图3所示的同一个安装目录,这将是C:\Tomcat6\webapps 。Tomcat将把该war文件进行热部署,现在要做的最简单的事情就是重启Tomcat。第一种是打开一个Dos界面,并输入以下命令:

de< C:\Tomcat6>net stop Tomcat6
de< 请注意,安装JBoss有几种方法的;我这里推荐的方式,您将创建一个专用JBoss用户。最可取的做法是把JBoss安装在您的主目录,这被认为是最佳的做法。这里有摘录了Ubuntu论坛中关于如何安装它的简要描述。
首先,你需要下载一个JBoss 4.2.3.GA的安装包。查找到JBoss - 4.2.3.GA.zip 。

下一步,您将需要为指定的JBoss创建一个用户、主目录和一个组。虽然组策略不是本文探讨的话题,但我可以告诉你,它可以允许您在您的Ubuntu服务器上给其他用户分配JBoss的相关权限。

清单1显示了如何用命令行创建JBoss的主目录、用户和组,和如何安装JBoss服务器。有些命令只输入了前缀,因为它们是一些专属命令。

清单1. 创建Jboss帐户并安装服务器

de<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 jbossde<

如果您安装前未解压,请输入以下命令(当用户开始工作的时候)来安装它:

de<Sudo apt-get install unzipde<

JBoss服务器现在已经基本安装完成。您可以使用下面的命令启动服务器:

de</home/jboss/jboss/bin/run.shde<
然而,你会需要在这个例子中安装一个自动启动脚本,以便使服务器能随主机启动而自动启动。在JBoss的下载中附带了三种不同的int.d 脚本,但是每个都需要做些调整;您也可以下载jboss-init.sh,它能自动启动和停止JBoss服务器。清单2中显示了它的运行命令。

清单2. 安装JBoss的自动启动脚本

de<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 defaultsde<

现在您可以使用下面的命令启动JBoss服务器来作为后台进程(当您注销它也不会终止):

de<sudo /etc/init.d/jboss startde<

要检验您的JBoss正在运行(最多可能需要几分钟的准备时间),请打开您的浏览器输入 http://localhost:8080/jmx-console 。如果成功,应该就会出现如图9显示的JBoss JMX控制台界面。

de< C:\Tomcat6>net start Tomcat6de<

第二种是打开Window的服务。这个工具在控制面板的管理工具组中里。点击Windows工具栏,然后选择设置,然后控制面板。在服务程序中寻找为Apache Tomcat的服务名,然后重启。如图7。

图7. 服务面板

Hudson现在应该已经安装。您可以通过在您的Web浏览器输入http://localhost:8080/hudson验证它。
Hudson的主页面如图8。

图 8. Hudson首页

Ha!Ha!就是这么简单!如果您对一个基于Windows XP和Tomcat 的应用开发环境满意,这就是你所有的设置。如果您想要一个JBoss和Ubuntu Linux操作系统的Hudson运行环境,请继续阅读。

安装Hudson: Ubuntu Linux操作系统8.04 +JBoss4.2.3(Hardy Heron)

想要在Ubuntu上安装Java 1.6,请打开一个shell并执行以下命令:

de< sudo apt-get install sun-java6-jdkde<

图 9. JBoss JMX 控制台

部署Hudson很简单,只需要你把hudson.war 复制到/home/jboss/jboss/server/default/deploy下。你最好是使用JBoss用户,这样才能确保JBoss服务器有权限读取该文件。Hudson应该在几秒钟内就会部署完毕。然后你可以通过在浏览器中输入http://localhost:8080/hudson 来验证Hudson是否安装成功。显示的页面跟图8一致 。

二、Hudson的构建

现在您通过刚才的步骤,应该在Windows XP的Tomcat或Ubuntu Linux操作系统的JBoss上把Hudson安装并成功运行了吧。这也是在操作系统中安装大多数应用服务器和类似web任务管理系统常见的步骤;我想 你也同意,安装Hudson真是小菜一碟 。下一步,您将看到在配置Hudson的时候您需要了解的一些基础知识,还将告诉您如何完成一次构建。

前置条件

如果您想在Hudson完成一次构建,必须符合下列条件:

1、您必须拥有一个可用的源代码仓库。

2、这个仓库必须包含你想要构建的源代码。

仓库里必须包含能构建源码的构建脚本。它们通常来源于Ant 或者Maven ,但是Hudson也支持简单Shell脚本、NAnt 和MSBuild 。

在本文中,您将使用Ant version 1.7 来构建示例代码。

配置Hudson

在您开始构建软件之前,需要对Hudson进行一些小小的配置。首先,您必须告诉Hudson您的Java JDK和Ant的安装位置。点击http://localhost:8080/Hudson 打开Hudson的主页,单击Manage Hudson 。该网页上附带了下一步,单击Configure System 。

在系统配置页面,这个列表中的第一个项显示的是Home directory 。这里包含了Hudson 要执行的所有工作区和存储它的所有配置。我将在本文最后回到对这个目录的介绍。

为了配置一个JDK和Ant实例,请在每一节下面单击Add 按钮,这里将添加实例的名称和绝对地址。图10描述了这两个部分。

图10. 配置 Ant 和 JDK

一般情况下,您可以对您要安装的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:

1、name : JDK 1.6.0_07

2、JAVA_HOME :

1)Windows : C:\jdk1.6.0_07

2)Linux : /usr/lib/jvm/java-6-sun

如果您使用的是Windows ,您只要下载一个Ant 安装包,然后将它解压缩到目标目录。在Ubuntu中,您可以使用下面的命令来安装Ant:

de<sudo apt-get install ant
sudo apt-get install ant-optional
ant -version
Apache Ant version 1.7.0 compiled on August 29 2007de<

然后把Ant安装到Ubuntu的/ usr / share /ant下。

图11中显示了在Ubuntu下配置JDK和Ant。当我的标签字段指向具体的安装地点后,警告就消失了。然后我也加入了第二个Ant实例,这是个错误的 配置 。在图中,您可以看到,如果为Ant的实例输入一个有效的目录,但是实际上路径并不正确,Hudson就会警告您,您输入的(地址)似乎不正确。JDK和 Ant一样(都会提出类似的警告)。后来我从输入框中删除了这个错误的Ant地址,只留下了有效的(Ant地址)。

图11. 在 Ubuntu下配置JDK 和 Ant

在下面进行同样的操作时,您将会看到这样的一个警告:"Hudson无法找到可执行的CVS"。如果您没有使用CVS ,可以直接地忽略它。

最后一个重要的选项就是在此网页上配置SMTP,使Hudson能够以电子邮件的方式发送重要的通知,例如构建失败。如果您的SMTP服务器需要身份验 证,您将需要使用高级选项。我使用谷歌的应用服务来托管域,但如果您拥有一个有效的Gmail帐户,您可以使用您的Gmail地址和谷歌的SMTP服务 器。图12显示了我在Hudson的邮件服务器配置。

图12. 在Hudson的 SMTP中配置谷歌的邮件服务器

现在基本的系统级配置已经完成。您可以准备进入一次具体的构建工作了。

三、在Hudson下配置一次构建

打开http://localhost:8080/Hudson就会显示Hudson的主页,点击 New Job 。图13显示了下一步的截屏;这时,您需要为新的构建工作指定一个名称。这里有几种的工作类型可供您选择,但在本文的讨论范围内,您将把重点放在Build a free-style software project 上。对于其他的类型,我经常使用的Copy existing job ;这主要为了能让我在复制现有的工作基础上新建一次构建工作。

图13 . 新建工作名

接下来,我将为我的HeliosJMX项目添加一次构建工作,它的源码存放在java.net网站的Subversion仓库里 。因为我将要构建的是trunk上最新的源代码,所以我将把这个工作命名为HeliosJMXTrunk 。输入完成,单击OK 。

你将会看到大量的关于这个工作的配置,这是一些很长的细节,关于它的详细配置如下所列。在每个选项右侧都会有一个小问号(? [单击“展开”和“隐藏”])图标。请不用疑惑,因为点击它您就能获取关于每个配置项的详细说明。这不会迫使您进入另一个网页,从而失去您的工作进程;而 是在本网页插入帮助文本,当然这样使用帮助是微侵入的,不会对网页造成什么影响。事实上在Windows和Linux 下几乎所有的这些配置也都是相同的。

1、Project name :我已经把这个项目命名为HeliosJMXTrunk ,但你也可以在这里修改它。

2、Description : 这是一个自由项,主要用来说明你关于这次构建工作的描述。可不填。(帮助:这说明放在项目的首页,以便访问者可以知道这个工作的内容。您也可以在这里使用任何HTML标记。)

3、Discard old builds : Hudson默认将保留过去的构建,除非你事先选中此框。(帮助: 这里控制着您想要在Hudson所在的磁盘把构建记录存储的有效期(诸如控制台输出、编译产成品等等)。Hudson为此提供了两个标准:1。时间驱动。 在Hudson中您可以判断如果达到一定时限来删除一条记录(例如,七天前)。2。数量驱动。在Hudson中您可以确保它拥有N份构建。如果又有新的构 建开始,最早的那份(记录)就将被删除。Hudson也可以让您建立的个别构建定义为'永远保持这个记录',以便防止某些重要的构建被自动丢弃。)

4、This build is parameterized : 如果选择此选项,Hudson将允许您提供一套任意的键值对参数,它们会被传递到构建过程里。配置的参数往往是构建运行环境中的一些环境变量。(帮助:当您使用了Hudson的各种自动化,有时要求在构建过程中提供一组用户的输入,使用“parameterize”就能够更方便构建。例如,您可能会设立一个按需测试,在那里用户可以提交一个二进制文件的压缩文件来进行测试。

本节参数可以完全按照您构建的需要配置。参数是以名字区分的,所以您可以有多个参数,只要它们名称不同。 关于此功能的更多资料请查看维基专题讨论 。)

5、Enable project-based security : Hudson支持全面的安全方案,可以强制用户在通过身份验证后,再访问Hudson网页;它也可以通过控制用户的权限来管理用户的工作。在这个Hudson例子中我没有配置安全 。

6、Disable build : 如果这里被勾选,这项工作将不会执行构建,直到选项禁用为止。(帮助: 有时候,你会想暂停某个构建中的项目。例如,也许您正准备一次大的迁移,而且你知道新版本会失败。或者您想每一个小时构建一次,但您却发现CVS服务器将 在未来24小时内down机。当这个选项被设置后,关于这个项目就不会再有新的构建。这样一来,您就可以在不想改变外部依赖或者提交错误通知的情况下禁用 构建过程。)

7、Advanced options : 我没有使用这些选项,但是当此复选框被选中时,选项中就会暴露下面的接口:

1.Quiet period : 在这里您可以配置一个静态监控,当构建准备按某个计划运行时,实际上它就已经在执行了。

2.Use custom workspace : 默认情况下,Hudson将在${jboss-home}/.hudson/jobs/[项目名称](注:Linux环境 )下创建一个工作区 。此选项将允许您使用指定的地址替代(它)。

8、Source code management : 在默认情况下是这三个选项:

1.Subversion

2.CVS

3.None

这个None会误解我先前的主张 :一个先决条件是要有一个源代码仓库。但我坚持认为,在大多数情况下,为Hudson选择某个仓库是绝对必要的。本文稍后,我将讨论如何安装Hudson 插件。如果您安装了一个与SCM相关的插件,并重新启动Hudson,那么在这个清单上也将出现一些新的选择。本文,我使用 Subversion 。当您选择Subversion后,将展开一个配置表单。我会在下面的某一部分中单独描述这个配置(见“ Subversion的工作配置” ) 。

9、Build after other projects are built : 此选项支持一条装配(流水作业)线——作业依赖: 一个作业依赖于另一个作业的输出的情况 —— 或者如以下情形:你只是想简单的把一些有关的工程构建编入一个组以便一起构建。当您一选择它,你将得到一个字段,输入其他工程的名字[多个项目名间用逗号 分隔]后,这个构建应该就可以运行。

10、Poll SCM : 这是CI 系统中常见的选项。当您选择此选项,您可以指定一个定时作业表达式来定义Hudson每隔多久检查一下您源代码仓库的变化。如果发现变化,就执行一次构 建。例如,表达式中填写0,15,30,45 * * * *将使Hudson每隔15分钟就检查一次您源码仓库的变化。更多信息请查阅Quartz CronTrigger中关于这个定时作业语法的详细描述。

11、Build periodically : 此选项 (也是使用定时作业表达式)仅仅通知Hudson按指定的频率对项目进行构建,而不管SCM是否有变化。我这个作业就属于目标测试环境是按某种方式定期修订的而SCM却是静态的情况。如果您想在这个作业中运行一些测试用例的话,它可能就很有帮助。

12、Add build step : 按一下这个按钮,添加了一项指令以执行构建脚本。您的指令可以是下列之一:

1.执行 Shell

2.执行 Windows 批处理

3.使用Ant(这是我将要使用的选项,在下面我会做详细的说明)

4.使用Maven

13、Archive the artifacts : 当您选择此选项,就可以指定文件和目录的掩码(Ant风格的掩码,可以指定包含与排除),当与掩码相匹配的构件在构建时将被添加到Hudson的构件仓 库,它们会用作业(名)和构建序号来标识。所有以前构建过的构件可以选择性地丢弃,以节省您Hudson服务器上的磁盘空间。

14、Record fingerprints of files to track usage : 当您选择此选项,它使用类似Ant方式的掩码,恁可以指示Hudson去生成构件的指纹码,确保您能够更容易地找到它们的位置,另外判断系统中的这些构件是否还在使用。

15、Publish javadoc : 如果您的构建脚本能生成JavaDoc,此选项将指示Hudson发布这些内容,而且立即把它公布在当前工作的主页上。每一个成功构建的文档内容都可以保留,但在默认情况下只保留最新的。

16、Publish JUnit test result report : 如果您的构建脚本执行了JUnit测试,此选项将指示Hudson处理XML测试文档并为每次连续构建产生一份可持续的报告,依据正在进行的测试汇总处理结果。其结果是当前工作主页的一份报告,作业中的单元测试会随着时间的推移按由老至新进行陈列。

17、Aggregate downstream test results : 在某些情况下,作业中一组单元测试花费的时间大大长于实际构建它所花的时间。在这些情况下,你可以选择把构建和测试分为不同的作业,以便完成构建能相对迅 速,一旦与这相关的一个或多个测试作业就执行完毕,构建也就成功完成了。 当您选择这个选项, Hudson就会把构建后作业的测试结果进行统计,并且能追溯到它们的明细。用以做为本次构建成功或失败的主要依据。

18、Build other projects : 较之前面的选项,这个选项主要用来实现一个合乎逻辑的构建和测试过程,它会被分为两个或两个以上的物理工作,并且会按顺序执行。当此项被选择后,您将得到 一个字段,可以在其中输入您想在当前作业中后执行的其它作业名[多项作业可用逗号分隔]。即使目前的作业得出结论说构建可能不稳定,您也可以选择这样 做。(关于“作业的稳定性”请查阅“作业状态”章节以获取更多信息)

19、E-mail notification : 当您选择此选项,您可以输入一个或多个电子邮件地址[多个可用空格分隔],当Hudson完成了执行作业后,将会给它们发送通知。事件触发时将产生一份 Email,包括构建失败、构建不稳定等。这儿有一个额外的选项,当由于用户的错误提交造成Hudson决定废弃此次构建,将会发送一份专门的邮件给这位 SCM提交者,以便让他检查源代码。

Ha!Ha!看来这些信息太多了,让您有点无法把握吧!没关系,为了让您更好的掌握这一切,您将在下面看到一个构建作业的样例。这样一来,您就会了解到这些配置项是如何运用到实践中的。

四、在Hudson配置一次构建作业:示例

下面是一个如何在实际作业中配置我的Hudson服务器。这项作业构建的是我命名为“HeliosJMX”的实用类库。这一节的所有图片都是我为了描述上一节而因此新建一个作业的截图。

在图14中,您可以看到项目的名称、说明和一个废弃策略。(指示Hudson保持过去5次构建,但废弃更前的构建。)

图14. 作业示例, 第一部分

图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 。如果您拥有下面列表提供这些产品的一种,就选择适合的浏览器并把它指着自己的源代码仓库地址。

图15. 作业示例, 第二部分

在图16中,您可以看到我填写的构建触发器详情:我每隔5分钟就检查一次Subversion,它们一有变化就构建一次。

(帮助:该字段遵循cron[Linux下任务定时系统]的语法(两者间仅仅有轻微差异)。
具体来说,每行由TAB键或空格隔开的5个字段组成:

1.MINUTE 一小时内多少分钟(0-59)

2.HOUR 一天内多少小时(0-23小时)

3.DOM 一个月内多少天(1-31)

4.MONTH 每月(1-12)

5.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 * * * *

)

图16. 作业示例, 第三部分

图17显示了我定义的Ant任务,以便执行构建过程。配置选项如下:

1.Ant version : 指定一个Ant实例,以执行构建。

2.Targets : 指定的Ant脚本文件中的一系列目标将被调用。这里可以留空,在这种情况下,脚本默认的任务将被执行。

3.Build file : Ant脚本执行完后的存放路径,它跟当期工作区是同级目录。

4.Properties : 这些额外定义的系统属性将可以通过这里传递到Ant脚本中。我这里的脚本包含了一些属性以便通过我的Subversion仓库的身份验证,因为我的程序中包括了一个把一些改变放回仓库的步骤。此外,我还定义了另一些属性,以便为我的单元测试配置参数。

5.Java options : Java的命令行选项可以通过这里传递。有了这个配置,您就可以使用Ant -debug,即一边调试脚本中存在的问题,一边让Ant有选择生成一份特定的诊断日志。其它常见的选项如指定Java的最小和最大的堆栈大小(-Xms 和 -Xmx ),这提醒您将在Hudson中启用一个新的JVM实例来运行您的构建脚本。

图17. 作业示例, 第四部分

图18显示了构建完成后我定义的一些动作:

1.Archive artifacts : 当构建一旦完成,就会指示Hudson归档已构建的构件。这是一个Ant方式的掩码,用来指定一个目录把与之关联的工作区、文件名和一些扩展文件进行归 档。归档后的这部分(文件)可以在当前构建实例的主页上很容易的获取到。高级选项还允许你指定一个排除掩码,你可以选择删除所有存档过的构件,除了最后一 次成功的构建产生的构件。

2.Publish javadoc : 类似上面的选项,它适用于在构建的过程中产生的任何Javadoc内容。

3.Publish JUnit test result report : 指示Hudson在定义的路径上获得一个JUnit XML结果文件,并且汇总它们到历史趋势报告。

图18. 作业示例, 第五部分

图19显示了构建完成后我定义的更多的动作:

1.Publish FindBugs analysis results : 我的构建脚本执行FindBugs静态代码,它用于分析作业的源代码,并生成一个调查报告。此选项表明Hudson FindBugs插 件已安装。它指示Hudson检索FindBugs XML结果报告,汇总它们到当前作业的历史趋势中并且暴露在当前作业的主页上。FindBugs插件的高级选项允许您当FindBugs上报时确定断言的 类别,以及在Hudson获取关于当前作业的状态时,它们将如何影响最终的测定。(更多信息请查阅关于题为"作业状态"这一节)

2.E-mail notification : 定义一个邮件列表( 多项用空格间隔),以便当构建失败时发送一份通知。当一次作业总是不稳定或者被终止,"Send email for every unstable build "就可以不选,以阻止Hudson不断发送一份已获知条件的邮件通知。

3.Publish Cobertura coverage report : 我的构建脚本使用了Cobertura作 为依据代码覆盖指令产生类文件的容器。当JUnit测试运行时,Cobertura 监测代码覆盖范围并且在测试完成后生成一个覆盖率报告。此选项表明Hudson Cobertura已经安装。它指示Hudson检索已确定的Cobertura XML 覆盖率报告,汇总它们到当前作业的Cobertura历史趋势中并且暴露到当前作业的主页上。标题为“Coverage Metric Targets”的选项表明在Hudson获取关于当前作业的状态时,允许你通过指定代码覆盖地图中的覆盖程度来影响最终的测定。(更多信息请查阅关于题为"作业状态"这一节)

图19. 作业示例, 第六部分

Ha!总算到这一点了,如果您已经确认了这个新的作业,现在就运行它吧,看看它是怎么工作的。不管您是如何配置您的构建触发步骤,您都能够随时请求一次特定的构建(总之,随需应变),除非您选择了Disable Build。当您打算建立一个新的构建作业,或者调试像我上面描述的这些截图,如果没有等到构建触发器讲完是没有什么意义的。在下一节中,我将告诉您如何请求一次特别的构建,以及观察它到底是如何运行作业的。

要运行您新近创建的作业,第一步就是跳转到http://localhost:8080/hudson(Hudson 控制面板)。图20显示了我在Ubuntu服务器上设置的全新的Hudson实例。

图20. Hudson 控制面板

在截屏的中心部分,您可以看到我刚刚定义的HeliosJMXTrunk 作业。当然这个截屏上还有其它一些很值得我们关注的条目:

1.灰色球体状图标描述着作业的一种状态。灰色这种情况表明当前作业从来没有被构建过。

2.在左边的表格中,名称为"Build Queue"的标签会显示当前正在运行或者准备运行的作业。表格中名为"Build Executor Status"的标签会公布已分配构建线程的状态。Hudson默认情况下会分配两个用于构建的线程,这意味着Hudson可以并行的执行两个构建。如果要修改它的数量,您可以单击Manage Hudson ,然后修改(1.3以后 # of executors)Configure Executors。请小心使用这个数量,因为软件的构建往往会相当密集的消耗内存资源;把太多构建同时加载到Hudson服务器是不合理的做法,因为这反过来可能会减缓您所有作业的执行效率。

3.RSS订阅图标。Hudson提供了另一种事件通知的方式:RSS订阅,包含整体系统的订阅和单独作业的订阅,主要有如下几种情况:

1)成功的构建

2)不稳定的构建

3)被终止的构建

4)SCM的改变

接下来请求一次构建,您可以点击作业列表表格中最右侧的构建图标。当然,您也可以单击当前作业的名称,它将指向您当前作业的主页,然后单击Build Now链接按钮。

当作业一旦运行,您将会看到这个作业正在队列中的仪表板和当前工作主页上运行。这两种显示如图21 。

图21. 当作业运行时两种不同的显示

一般来说,您想在某些时候以通过视图输出作业的运行来监控当前作业的进展情况。为此,您链接到作业主页,单击Console Output。如果工作已完成,这将显示构建脚本产生的静态输出,;如果作业仍然在运行中,Hudson将不断刷新网页的内容,以便您可以看到它运行时的输出。图22 描述了这个非常有用的功能。

图22. 控制台以直播方式显示作业运行时的输出

一旦构建完成后,完成后的作业将会有三个地方进行显示。

1.你可以在Hudson的控制面板上看到它,如图23 。

2.你可以在当前作业主页上看到它,如图24 。

3.通过点击构建历史中某个具体的构建链接,您就能跳转到Hudson为这个构建实例而专门创建的构建主页上。如图25。

图 23. Hudson控制面板上显示已完成的作业

下面简要介绍控制面板中符号的意义,它描述了“作业状态”这一部分,黄色球标意味着构建成功,但被认为不稳定。W栏目代表着“天气”,这里的小太阳图标表 示阳光普照。因为构建成功了而且没有任何处理插件(如上面所述的插件)来通知Hudson报告任何糟糕的情况。当然值得一提的是,最近一次构建花费了15 分钟。这是因为我为测试套件中的一些单元测试时使用了一些调度组件,故意使运行时间延长了。把实际构建和测试在当前作业分隔开来运行其实是一个很好的选 择。

图 24. 当前作业主页上显示已完成的作业

当前作业主页上还包含了一些有趣的条目。左侧栏的链接主要控制作业的配置(为了修改你在New Job后的定义)、删除作业、构建作业。右边部分的链接指向最新的项目报告和构件。

图 25. 当前构建主页的已完成构建

构建主页是针对一个构建实例而特设的。请注意,Hudson会分配一个内部的版本号用于跟踪分布式构建。此网页还列出Subversion的最新修订 (没有在此次构建上的),同样还有三个失败的JUnit测试案例。这三个失败就是导致Hudson认为此次构建不稳定的原因,这说明该次软件构建并没有错 误,只是有单元测试失败了。接下来的构建中,如果没有了任何单元测试错误的话,在控制面板和工程主页将显示一次稳健的构建。如图26中截屏所示。

图 26. 二次构建后的控制面板和作业主页

我现在已经涵盖了作业的配置、作业的启动以及请求一次即时构建所必须的步骤。接下来我们简单的讨论一下在Hudson中如何描述一个作业的状态。

作业状态

在上面展示的截图中,您将注意到有两个图标描述当前作业的状态。Hudson使用两个概念来介绍一个作业的总体状况:

1、作业状态: 图27中分级符号概述了一个作业新近一次构建会产生的四种可能的状态:

1.Successful: 完成构建,且被认为是稳定的。

2.Unstable: 完成构建,但被认为不稳定。

3.Failed: 构建失败。

4.Disabled: 作业已禁用。

2、作业稳定性: 当一个作业中构建已完成并生成了一个未发布的目标构件,如果您准备暗中评估此次构建的稳定性,Hudson会基于一些后处理器任务为构建发布一个稳健指数 (从0-100 ),这些任务一般以插件的方式实现。它们可能包括单元测试(JUnit)、覆盖率(Cobertura )和静态代码分析(FindBugs) 。分数越高,表明构建越稳定。图28中分级符号概述了稳定性的评分范围。任何构建作业的状态(总分100)低于80分就是不稳定的。

图 27. 作业状态

图 28. 作业稳定性

Hudson允许您创建多个构建轨道;根据您的软件开发过程,您可能希望依据软件项目创建一个以上的构建轨道。构建 轨道是针对一个具体的项目或产品的构建作业,它们都具有独特的配置。区分构建轨道的因素可能是当构建作业在同一个项目中从SCM的不同分支获取源代码;另 外,在执行同一份源代码时,不同的轨道也可以处理不同的任务。其中,在具有相同逻辑的软件项目中可能直接影响你创建不同的构建轨道的有:

1、Source control branches: 为了更干净利落地支持多版本源代码的并行开发,许多开发团队会在其源代码控制系统保持了一系列的分支。诸如此类情况,有必要在Hudson中为每个分支基 础上的开发建立一个单独的构建轨道。同理也可以建立一些较旧的不活跃的分支,以便把软件的老版本进行归类,这样一来也可以很容易地重建。以下的程序您就可 能需要创建单独的分支:

1.基于主干的构建: 这是个新近的、活跃的、频繁修改的源码基线。

2.基于发布的构建: 致力于持续发布而单独创建的分支,其中的源码通常是稳定的,但是主干开发可继续转换未来的发布。

3.基于修复Bug的构建:在主线开发活动中孤立一个Bug以便修复它而单独创建的分支。

4.实验性构建: 为了在源码基线上测试实验性的想法而单独创建的分支,可能最终不会聚合到主线上的代码。

2、Build job task categories: 为不同源码进行构建可能需要不同的设置或者序列化构建任务,这一般视指定分支的当前状态或者活动情况而定。例如,以下的程序您就可能需要创建单独的分支:

1.简单建立核查作业,当您不需要考虑构建的稳健性而仅仅想要定期核实代码能被构建,然后产生可用的构件。

2.构建并核实构建的稳定性可能略低于平常的指标,就从源代码和构建后的构件中构建构件和执行一个完整的测试流程。

3.发布候选作业,执行完整构建和稳健性测试流程,然后完成一系列任务以提供可交付的发布产品。

4.执行完整发布作业,当一个候选发布版准备分发并自动地把打包后的构件上传到一个公共的库,以及任何其它必须的任务以便完成一个完整的发布。

3、Deliverable considerations: 即便是完全相同的代码分支和构建任务,您也可能需要采用稍微不同的工具以支持构建。例如,您可能需要根据类Java 1.5和Java 1.4 发布单独的版本。

图29描述了一个源代码控制分支和对应的Hudson构建轨道的合适的逻辑结构。

图29. 源代码控制分支和对应的Hudson构建轨道

Hudson能够很容易地复制一个现有的作业从而创建一个新的作业。为此,您需要浏览到Hudson的控制面板,单击New Job 链接。输入新工作的名称,然后选择Copy existing job。请注意,当您开始输入时,Hudson将会把现有的作业填充到一个列表框,您可以在此复制符合您所输入的内容。然后单击OK,这样就创建了你的新作业。图30描述了这个过程。

图 30. 拷贝现有作业从而创建一个新的作业

一旦您通过这样的方式创建了一个新的作业,除了名字之外它实际上只是您当前作业的副本,所以您会想到通过修改选项从而修改这个新拷贝。例如,您想要:

1.当某个工作区迁移后更改源代码控制目标分支。

2.修改构建脚本或者构建脚本目标,并通过Hudson执行。

3.修改系统属性,并通过Hudson传递到您的Ant脚本里。

五、使用视图

当您创建一些构建轨道后,您可能发发现您的控制面板已经成为了一个有点杂乱无章的长串作业列表。一种可取的做法就是,以创建视图的方式重组控制面板。一个 面板视图包含一组相关的作业,您可以在控制面板上定义一个单独的标签以供显示。当为相关的作业创建视图组时,您就会理解到实施一致的作业命名约定是多么有 益了。

要创建一个视图,单击控制面板中标“+”的小标签。在新的视图页面,输入新组的名称和一个可选的描述信息。Hudson将在当前每个作业配置一个的标记复选框,因此您就可以在视图中包含想要的作业了。

然而,在我看来还有一种更好的方式来组织作业。单击标记为Use a regular expression to include jobs in the view的 复选框,它提供一个正则表达式,在您想要的作业中匹配名称。这对于作业遵循了一致命名约定来说就很方便。您可以按一般的软件项目归类,或者按可能的构建类 型作为作业组来配置视图。我已采取了后一种做法,如图31。我在那里建立了一个名为“Release Builds”的视图,其中包括所有包含" release "关键字的作业。

图 31. 创建一个新的面板视图

使用正则表达式归类的办法还有其它优势,就是在新作业被创建后,它们将会按作业名称匹配的方式自动地添加到相关的视图中,但是原来指定方式选择作业的视图则需要手动更新。

图32显示了基于构建类型的新近组织过的面板。

图 32. 按构建类型的面板视图

六、Hudson 插件

由Hudson类库现有的Hudson功能性扩展和开发者们为Hudson提供的新功能都可以称之为Hudson插件。有些插件可以无缝添加到您的构建过程,然而其它,诸如除CVS和Subversion的SCM插件则需要实现与源代码控制系统的支持,从而有必要使用Hudson完成您的安装。

目前有许多可用的插件,因此我就不在这里一一列举了,但这些插件总的来说有如下类别:

1、SCM: 除CVS和Subversion外需要实现与源代码控制系统支持的插件。

2、Triggers: 事件监听并触发构建的插件。例如,URL改变触发器将监控一个URL;当地址内容发生改变,这个触发器就将执行一次作业。

3、Build tools: 实现额外构建工具的插件,如MSBuild和Rake。如果您想在Hudson中构建非Java的软件时这些就特别有用。

4、Build wrappers: 通常涉及时执行在受控制的构建过程本身之前和之后事件的插件。例如, VMware插件将在构建之前启动一个客户虚拟机,建立和然后在构建完成后关闭它。这在您可能需要访问VM以执行单元测试的情况下是非常有用的。

5、Build notifiers: 这些插件是做为作业事件发布通知的替代方式--通过Twitter 、IRC、谷歌日历活动等等。

6、Slave launchers and controllers: 这是Hudson中一个非常强大的功能,本文中没有解释从机Hudson实例扮演主机Hudson实例工作。目前在这个类别中只有一个插件:SSH从机插件,它允许从属来管理超过一个SSH的链接。

7、Build reports: 这一系列插件主要是在用您的源代码或者构件进行一些分析的基础上创建有用的报表。例如,Cobertura 插件总是通过您的构建脚本增量统计覆盖率。

8、External site integrations: 以协助Hudson整合与其他应用程序的插件,如Jira或Bugzilla 。

9、Artifact uploaders: 以协助您把构件发布到一些网络终端的插件,如java.net版本库或一个FTP服务器。

10、Page decorators: 为Hudson网页增加一些美化或者有用的装饰物,比如在Hudson中增加谷歌跟踪服务以跟踪其所有网页的谷歌分析插件。

Hudson 插件管理器允许您安装新的插件,和更新您Hudson服务器上的插件。管理者将连接到联机资料库,检索可用的和已更新的插件。如果您的Hudson服务器无法直接连接到外部资源,您可以从Hudson网站上下载您想要的插件。点击网站上的plugins文 件夹,您将看到一个可用的插件列表。这独特的插件文件以.hpi 作为扩展名。一旦您下载了该插件,复制它到Hudson主目录下的插件子目录。(Hudson主目录被称为.Hudson,将在用户的主目录下运行 Hudson服务器。)一旦文件被复制,您将需要重新启动Hudson才能使插件生效。使用Hudson插件管理器,单击控制面板上的Manage Hudson链接,然后点击Manage Plugins。插件管理器显示在图33中,它包含四个标签:

1、Updates: 清单中列示了Hudson为某些插件搜索到了可用的更新。列出的每个插件可以被选择并应用更新。

2.Available: 清单中列示了可用于安装(而不是目前已安装的)的所有插件 。列出的每个插件都可以被选择并安装。

3、Install: 清单中列示了已经安装的插件。

4、Advanced: 允许您通过设定HTTP代理的方式使Hudson与在线插件库建立连接。此外,还提供了一个上传设备,可以安装你在Hudson以外已下载的那些插件。

图 33. Hudson 插件管理器

一旦您想要的插件已经安装或者已更新,Hudson需要重新启动才能使它们生效。如果您使用的服务器是JBoss,请注意,您可以通过修饰JBoss的部 署目录下的hudson.war已恢复到您原来的已部署的状态来做到这一点。 (在更新一个文件的时间戳时,修饰是一种很实用的功能。) 这会导致JBoss重新部署Hudson服务器,从而达到重新启动的相同效果。

了解某些类型的构建报告插件的一种重要的概念是,它们并不一定为你产生很精髓的报告。 相反,它们歹为产生的增量报告而处理额外一些的任务;在某些情况下,它们会把您产生的报告重新格式化到本地Hudson的综合报告中。 例如, Cobertura插件必须依赖于您的构建脚本必须实现检测您的目标测试类、执行单元测试、并生成详细构建覆盖率报告的一系列工序。接着插件更新正在运行 的历史趋势的覆盖率报告,以便使您可以随着时间的推移查看覆盖率的变化。在图34中描述了一个这样的趋势报告的样例。

图 34. 单元测试、静态代码分析、代码覆盖的历史趋势

此外,JUnit测试结果和FindBugs的插件例子将创建Hudson本地报告并显示在作业或构建实例的主页上。 (JUnit插件实际上已经存在并且无需安装。 )图35是通过FindBugs插件产生内置的报告并显示构建实例主页上的一个例子。

图 35. 一次构建后的FindBugs即时报告

您可以实现您自己的插件,以提供你能想到的几乎任何类型的Hudson扩展。如果您有兴趣这样做,你可以在Hudson Wiki找到参考、文档和教程(见下面的资源部分)。

总结

以上就是我介绍的Hudson持续集成服务器。我想你将会发现它是一个很好的软件;多亏它的易于安装和配置,你可以体验一下它的启动和运行的速度有多快。 基于java.net网站有活力的书籍中使用Hudson开发项目的主机情况,Hudson很明显具有越来越多的趋势。我粗略地浏览了邮件列表,表明人们 接受了调查并且一贯和迅速的做出了反应,但我必须补充,这段时间我一直在使用它,我也没有遇到任何问题以促使我寻求支持。我希望你会喜欢并探索 Hudson--签出资源部分下面的更多文章,下载及相关的链接。

相关文章

为什么要做持续部署?
剖析“持续交付”:五个核心实践
集成与构建指南
持续集成工具的选择-装载
相关文档

持续集成介绍
使用Hudson持续集成
持续集成之-依赖管理
IPD集成产品开发管理
相关课程

配置管理、日构建与持续集成
软件架构设计方法、案例与实践
单元测试、重构及持续集成
基于Android的单元、性能测试
 
分享到
 
 


集成与构建指南
项目管理:Maven让事情变得简单
持续集成工具hudson
持续集成
Maven权威指南
程序集(UML中的包)之间循环
更多...   


产品发布管理
配置管理方法、实践、工具
多层次集成配置管理
使用CC与CQ进行项目实践
CVS与配置管理
Subversion管理员


海航股份 重构及持续集成
电研华源 设计原理、建模与重构
软件配置管理日构建及持续集成
单元测试、重构及持续集成
中国软件研发中心 单元测试与重构
单元测试、重构和持续集成实践
罗克韦尔 C++单元测试+重构+Gtest
更多...