持续化集成使用文档格式.docx
- 文档编号:21374174
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:33
- 大小:1.28MB
持续化集成使用文档格式.docx
《持续化集成使用文档格式.docx》由会员分享,可在线阅读,更多相关《持续化集成使用文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
∙用Ant或Maven等工具建立的自动构建过程
∙一个代码存储库,比如CVS或Subversion
∙一个CI服务器,比如Hudson,但是cron作业也可以满足需要
我们来详细讨论这些组件。
自动的构建
CI过程会经常集成软件,这需要通过构建来完成。
在Java环境中,Ant是常用的构建平台。
可以使用Ant可靠地自动执行编译、测试等任务,甚至可以执行软件检查和部署。
在掌握了CI的所有组件之后,您会发现构建策略是成功的CI过程最重要的方面。
如果缺少适当的构建过程,CI就难以发挥作用。
源代码管理
为了让CI正确地发挥作用,需要一个源代码管理(SCM)系统或存储库,比如Subversion或CVS。
CI服务器向SCM存储库查询代码修改。
在找到修改时,CI服务器执行签出(即更新本地沙箱)并执行构建。
除了执行得更频繁之外,构建过程与在本地环境中执行的构建相同。
CI服务器
对于成功的CI过程,需要用一个自动的过程监视SCM存储库并在探测到修改时运行构建,这也非常重要。
对于Java平台,有许多可用的CI服务器,包括开放源码软件和商业产品。
它们的基本配置都很相似,适合监视特定的SCM并在探测到修改时运行构建。
所有CI服务器都有自己的优缺点。
Hudson尤其让人感兴趣,因为它容易配置而且具有强大的插件,这些插件可以显示测试结果趋势等信息。
Hudson简介
Hudson是一种革命性的开放源码CI服务器,它从以前的CI服务器吸取了许多经验教训。
Hudson最吸引人的特性之一是它很容易配置:
很难找到更容易设置的CI服务器,也很难找到开箱即用特性如此丰富的CI服务器。
Hudson容易使用的第二个原因是它具有强大的插件框架,所以很容易添加特性。
例如,一个Hudson插件可以随时间的推移跟踪FindBugs和代码覆盖。
它还可以报告测试结果的趋势(来自JUnit或TestNG)以及构建结果和对应的执行时间。
Hudson需要运行Java5。
如果需要使用Hudson附带的嵌入式容器(Winstone)之外的其他容器,那么只需使用一种Servlet2.4容器。
对于大多数情况,Winstone就足够了。
本节讨论如何把CI过程的各个组件组合在一起,以及采用这种方式的原因。
在此之后,就可以开始编写代码了!
先决条件:
一个构建系统!
可重复的可靠构建是可预测的软件过程的基础。
正如前面提到的,Ant是Java平台上流行的构建工具,它的主要用途是自动执行编译和部署等常见任务。
Ant还有助于用JUnit和TestNG等测试框架进行单元测试,而且它可以与许多其他工具集成,比如PMD和FindBugs(用来自动执行静态代码分析)。
使用Ant编译源文件很容易,只需在命令提示下发出antcompile命令。
可靠性与可重复性
尽管Ant有助于保证可重复性,但是可重复性主要取决于开发人员自己。
在软件构建方面,可重复性意味着,不同的开发人员在发出编译或测试等命令时,会得到相同的结果。
如果由于某种原因(比如构建本身没有显式引用一个必需的库),一位开发人员无法完成编译,而另一个开发人员可以完成编译,那么构建就是不可靠的,也可以认为它是不可重复的!
可靠性和可重复性对于CI非常重要。
因为CI是一个没有人为干预的自动过程,所以CI最终调用的构建过程必须没有瑕疵。
构建过程必须是一个简单的活动,不依赖于CI服务器无法控制的东西,比如需要精确引用的库、没有明确文档记录的位置和手工刷新的数据库。
当然,某些构建操作会失败,例如某人签入了无法编译的代码;
但是构建不能由于本身的缺陷而失败。
基本的构建过程
要想让CI能够促进软件开发过程,构建的作用必须不仅仅是编译代码。
因为在每次修改代码时都会运行构建,所以这是运行测试和代码检查的好时机。
基本的构建过程包含以下任务:
∙编译源代码,包括测试
∙执行测试,包括用JUnit或TestNG编写的测试
∙运行代码检查,比如PMD
∙将最终的产品存档为JAR、WAR或一系列文件
∙部署最终的产品(假设最终产品允许部署)
请记住,这些是最基本的步骤,构建过程可能包含更高级的步骤,比如处理数据库或软件产品的其他方面。
设置目录结构
有许多种设置软件项目目录结构的策略,它们各有优缺点。
我喜欢把源代码与测试分隔开的方式,而且我总是为它们创建不同的目录结构。
处理第三方库的常用方式是创建一个lib目录。
但是,对于处理第三方依赖项,还有可管理性更好的机制,比如Ivy。
无论怎样设置项目的目录结构,目录结构越详细、组织性越强,效果就越好。
随着项目资产(比如源代码文件和测试)数量的增加,目录结构的好处会越来越明显。
图1给出一个简单的项目目录结构,其中包含一个用于第三方库的目录,以及两个用于源代码文件和相关测试的目录:
图1.一个简单的项目目录结构
注意项目根目录中的build.xml文件(见图1)。
这是项目的构建文件,它定义了一组最基本的自动操作,可以将源代码转移到可投入生产环境的状态。
CI基础:
代码编译
现在,可以开始编写代码了!
本节为软件项目设置基础结构,包括设置项目类路径和编译。
如果不执行这些预备步骤,后面的工作就不会有效果。
用Ant执行编译
创建可靠且可重复的构建的第一步是限制硬编码的值,尤其是与文件系统路径相关的值,比如目录。
因此,清单1定义了许多属性,以后可以在各种相关目标中引用它们:
清单1.在Ant中设置属性
<
propertyname="
default.target.dir"
value="
target"
/>
classes.dir"
${default.target.dir}/classes"
test.classes.dir"
${default.target.dir}/test-classes"
test.report.dir"
${default.target.dir}/test-reports"
lib.dir"
${basedir}/lib"
source.dir"
src/java"
test.source.dir"
test/java"
test.pattern"
**/**Test.java"
创建类路径
因为所有第三方库都放在lib目录中,所以可以通过扫描这个目录快速创建类路径,见清单2。
(注意,通过清单1中的lib.dir变量引用这个目录。
)
清单2.根据lib目录中的JAR文件创建类路径
targetname="
init"
>
<
mkdirdir="
${classes.dir}"
${test.classes.dir}"
pathid="
build.classpath"
filesetdir="
${lib.dir}"
includename="
**/*.jar"
/fileset>
/path>
/target>
编译源代码
定义了类路径之后,就可以创建一个编译源代码的目标,见清单3。
清单3.使用Ant的javac任务编译源代码
compile-source"
depends="
description="
compilesall.javafilesinsourcedirectory"
javacdestdir="
srcdir="
${source.dir}"
classpathref="
很容易通过一个称为javac的任务定义编译。
这个任务使用类路径编译一个目录中的代码,并将类文件放在另一个目录中。
测试、监视和存档
如果想让CI提供真正的价值,除了持续编译之外,还需要做更多的工作。
如果想提高代码质量,首先就要执行测试。
可以使用JUnit或TestNG。
具体选用哪种测试框架并不重要,重要的是要经常运行这些测试,也就是每当修改代码时都运行测试。
用JUnit进行测试
幸运的是,用Ant运行JUnit测试非常容易:
Ant允许通过junit任务运行JUnit测试。
在配置junit任务时,需要考虑寻找JUnit测试的位置以及如何获取这些测试的结果。
清单4.通过Ant运行JUnit测试
test"
compile-tests"
runsJUnittests"
${test.report.dir}"
junitdir="
${basedir}"
printSummary="
on"
fork="
true"
haltonfailure="
syspropertykey="
basedir"
formattertype="
xml"
classpath>
pathrefid="
pathelementpath="
/classpath>
batchtesttodir="
${test.source.dir}"
${test.pattern}"
/batchtest>
/junit>
在清单4中,junit任务运行在test.source.dir(在清单1中定义)目录中找到的所有测试。
XML报告写到另一个目录(test.report.dir)中。
在开始配置CI服务器时,要使用这些测试报告写到的位置。
软件检查
有了Ant这样的自动化机制,就可以以多种方法监视软件质量。
有许多种扫描源代码和二进制文件的工具,但是其中最流行的两种是PMD和FindBugs。
PMD扫描源代码文件,并根据一系列规则检查其中的代码。
如果代码有问题,它就会报告一个违规。
FindBugs的作用与PMD相似,但是它扫描二进制文件(即类文件)并报告bug。
这两个工具都能够很好地与Hudson集成。
运行PMD
通过Ant运行PMD很容易:
只需下载它并按照说明操作!
与运行JUnit测试一样,一定要指定在运行PMD时生成XML报告。
清单5.用PMD寻找代码违规
pmd"
taskdefname="
classname="
net.sourceforge.pmd.ant.PMDTask"
pmd>
ruleset>
rulesets/basic.xml<
/ruleset>
rulesets/braces.xml<
rulesets/javabeans.xml<
rulesets/unusedcode.xml<
rulesets/strings.xml<
rulesets/design.xml<
rulesets/coupling.xml<
rulesets/codesize.xml<
rulesets/imports.xml<
rulesets/naming.xml<
toFile="
${default.target.dir}/pmd_report.xml"
**/*.java"
/pmd>
PMD有许多规则,可以对自己的代码库运行这些规则。
清单5给出许多选项,但是选择运行哪些规则完全取决于您。
运行FindBugs
FindBugs扫描二进制文件,而且只扫描包含项目文件的JAR文件常常更容易。
清单6中的findbugs目标依赖于jar目标:
清单6.用FindBugs寻找bug
findbugs"
jar"
edu.umd.cs.findbugs.anttask.FindBugsTask"
findbugsclasspathref="
pluginlist="
${lib.dir}/coreplugin-1.0.jar"
output="
outputFile="
${default.target.dir}/findbugs.xml"
sourcePathpath="
classlocation="
${default.target.dir}/plainead.jar"
/findbugs>
与JUnit和PMD任务一样,应该让FindBugs创建XML文件。
将二进制文件存档进JAR
无论最终如何部署项目,都需要选择创建WAR或JAR文件。
对于这个项目,我们创建一个JAR文件。
如清单7所示,从一系列类文件创建JAR文件也很容易:
清单7.用Ant对二进制文件进行存档
jarjarfile="
basedir="
在本节和前一节中,我们只创建了几个目标,而最终结果是一个可重复且可靠的构建系统,它几乎适合任何代码库。
这个构建文件不但执行编译,而且还运行测试。
它还使用两种检查工具评估代码质量。
最后,这个构建文件将代码库打包成JAR文件。
请记住,最后一步因项目而异。
如果要构建Web应用程序,那么可能需要比清单7更多的控制;
例如,可能需要用应用程序的文件创建一个WAR文件,然后把它部署到Web容器中。
没有SCM,就没有CI
有了可靠的构建过程之后,CI过程的下一个需求是一个SCM存储库。
市场上有许多SCM存储库,包括开放源码软件和商业产品。
这些产品的基本用途都是管理源代码。
SCM系统可以进行源代码版本和历史管理,当多个开发人员在同一个文件上工作时,这两个功能十分重要。
如果当前的软件项目没有使用SCM存储库,那么您可能应该停止阅读本教程,尽快设置并运行一个SCM系统。
SCM与Hudson的集成
Hudson默认支持CVS和Subversion,这两个软件都是免费的。
Hudson还有用来集成RationalClearCase(这是一个商业产品)的插件。
使用Subversion
对于本教程,假设您使用Subversion。
如果不使用Subversion,也不必担心:
无论使用哪种SCM系统,基本原理都是一样的。
实际上,在高层面上,CI过程与SCM相关的方面是非常简单的。
CI服务器(在本教程中是Hudson)向SCM查询对特定项目的修改。
如果探测到修改,CI服务器就执行更新(也就是获取SCM中的最新副本)并运行构建。
在这个示例中,Hudson运行本教程前面定义的构建。
基于URL的访问
按照Subversion的行话来说,项目驻留在存储库中。
根据存储库的配置方式,可以通过一个URL访问项目,URL实际上是存储库的路径加上项目名称。
如果使用别的SCM系统,那么可能要使用其他机制访问存储库。
无论是哪种情况,都需要正确地配置CI服务器来访问项目存储库。
目前,假设您使用Subversion,所以只需通过URL签出所需的项目。
假设项目名称是solar-ci,存储库的URL是:
所以,项目的访问URL是:
必须根据SCM的设置方式正确地配置存储库访问;
例如,Subversion需要用户名和密码。
在设置CI过程时,为CI服务器创建一个新用户常常是有意义的。
对于这个项目,我们创建一个名为buildmaster的新用户。
在后面配置Hudson来监视项目时,为了执行签出和其他功能,需要显式地指定buildmaster的凭证。
Hudson
CI过程的最后一个方面是CI服务器本身。
CI服务器在整个开发过程中的主要作用是控制者:
当服务器在代码存储库中探测到修改时,它将运行构建的任务委托给构建过程本身。
如果构建失败了,那么CI服务器将通知相关方面,然后继续监视存储库。
它的角色看起来是被动的;
但是,它是快速反映问题的关键。
安装Hudson
使用Hudson的主要好处之一是它的设置很简单。
在最简单的情况下,Hudson只需要两个步骤:
1.下载最新的版本(它打包为一个WAR文件)。
2.运行java-jarhudson.war。
这样就可以了。
因为下载的是一个WAR文件,所以如果愿意,可以将它部署在Tomcat或JBoss等容器中。
这完全由您自己决定。
当然,Hudson假设在安装它的机器上运行着Java5,而且如果定义了JAVA_HOME环境变量,Hudson就会使用它。
(正如前面提到的,Hudson需要Java5。
)
在安装并运行Hudson之后(将WAR文件部署到servlet容器或从命令行执行java-jarhudson.war),启动浏览器并访问默认安装位置。
如果通过命令行运行Hudson而且您在本地机器上,那么可以访问http:
//localhost:
8080/。
图2.Hudson已经就绪!
如果一切正常(实际上不太可能出问题),应该会看到图2所示的Hudson启动页面。
配置Hudson
配置Hudson的第一步是让它知道在哪里可以找到构建平台的可执行文件。
在这个示例中,用Ant作为构建系统,所以需要告诉Hudson本地机器上Ant的位置。
如果使用Maven,也必须做同样的工作:
告诉HudsonMaven的位置。
请记住,并不是告诉Hudson构建文件的位置,而是指定构建系统的可执行文件的位置,让它可以调用构建文件。
在这个示例中,需要指定Ant命令的位置,这让Hudson能够执行ant-fbuild.xml命令。
如果访问Hudson主页的本地实例并单击左上角的ManageHudson链接,应该会看到图3所示的可配置选项列表。
图3.配置Hudson非常容易
在Ant部分中,需要提供安装Ant的路径,见图4:
图4.向Hudson指出Ant的位置
还可以配置服务器的其他几个方面,比如向Hudson提供一个电子邮件服务器的位置,以便在构建失败时接收电子邮件。
根据您的组织设置电子邮件的方式,可能需要让系统管理员帮助设置这个特性。
设置电子邮件并不是必需的;
Hudson还支持以RSS作为通知机制,对于某些人来说,这种方式比电子邮件更好。
究竟选择哪些通知机制完全取决于您。
(注意,这里说的是“哪些”,也就是说,可以同时使用多种通知机制!
最后,在配置项目之
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 持续 集成 使用
![提示](https://static.bdocx.com/images/bang_tan.gif)