持续化集成使用文档格式.docx

上传人:b****5 文档编号:21374174 上传时间:2023-01-30 格式:DOCX 页数:33 大小:1.28MB
下载 相关 举报
持续化集成使用文档格式.docx_第1页
第1页 / 共33页
持续化集成使用文档格式.docx_第2页
第2页 / 共33页
持续化集成使用文档格式.docx_第3页
第3页 / 共33页
持续化集成使用文档格式.docx_第4页
第4页 / 共33页
持续化集成使用文档格式.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

持续化集成使用文档格式.docx

《持续化集成使用文档格式.docx》由会员分享,可在线阅读,更多相关《持续化集成使用文档格式.docx(33页珍藏版)》请在冰豆网上搜索。

持续化集成使用文档格式.docx

∙用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作为通知机制,对于某些人来说,这种方式比电子邮件更好。

究竟选择哪些通知机制完全取决于您。

(注意,这里说的是“哪些”,也就是说,可以同时使用多种通知机制!

最后,在配置项目之

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1