一.什么是持续集成
持续集成的核心概念
CI 过程会经常构建软件组件;在许多情况下,每当源代码存储库(比如 Subversion 或 ClearCase)中的代码发生变化时,都要构建软件组件。CI 的好处是:经常构建软件可以确保尽早遇到问题(比如代码缺陷),避免问题在软件开发周期晚期变复杂时才被发现。
工具与过程
尽管 CI 实际上是一个过程,但是持续集成 这个词常常与一个或多个工具相关联。在本教程中,讲解如何安装、配置和使用 Hudson 作为 CI 服务器,但是要记住,CI 远不只是个工具。实际上,使用的工具可能是 CI 比较次要的方面,因为 CI 工具所做的仅仅是在代码存储库中探测到修改时运行构建。构建过程本身比用来运行它的工具重要得多。
开始使用 CI
开始使用 CI 需要三个组件:
* 用 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 需要运行 Java 5。如果需要使用 Hudson 附带的嵌入式容器(Winstone)之外的其他容器,那么只需使用一种 Servlet 2.4 容器。对于大多数情况,Winstone 就足够了。
三.Hudson使用
CI 过程的最后一个方面是 CI 服务器本身。CI 服务器在整个开发过程中的主要作用是控制者:当服务器在代码存储库中探测到修改时,它将运行构建的任务委托给构建过程本身。如果构建失败了,那么 CI 服务器将通知相关方面,然后继续监视存储库。它的角色看起来是被动的;但是,它是快速反映问题的关键。
安装 Hudson
使用 Hudson 的主要好处之一是它的设置很简单。在最简单的情况下,Hudson 只需要两个步骤:
1. 下载最新的版本(它打包为一个 WAR 文件)。 hudson官方网址:https://hudson.dev.java.net/
2. 运行 java -jar hudson.war。
这样就可以了。因为下载的是一个 WAR 文件,所以如果愿意,可以将它部署在 Tomcat 或 JBoss 等容器中。这完全由您自己决定。当然,Hudson 假设在安装它的机器上运行着 Java 5,而且如果定义了 JAVA_HOME 环境变量,Hudson 就会使用它。(正如前面提到的,Hudson 需要 Java 5。)
在安装并运行 Hudson 之后(将 WAR 文件部署到 servlet 容器或从命令行执行 java -jar hudson.war),启动浏览器并访问默认安装位置。如果通过命令行运行 Hudson 而且您在本地机器上,那么可以访问 http://localhost:8080/。
如果一切正常(实际上不太可能出问题),应该会看到图 2 所示的 Hudson 启动页面。
配置 Hudson
如果访问 Hudson 主页的本地实例并单击左上角的 Manage Hudson 链接,应该会看到图 3 所示的可配置选项列表。
图 3. 配置 Hudson 非常容易
参数说明:
system.message 填写一些说明信息
Quiet period:hudson定时构建工程的时间(秒)
Enable security:设置hudson登陆的规则(默认为匿名登陆)
TCP port for JNLP slave agents:不了解JNLP不敢胡写总之就是三种方式:固定(fixed) 随机(Radom) 不使用(disabled),使用固定时可以填入JNLP信息
security realm:可以使用中间件容器,数据库,LDAP来验证安全,具体怎样用法没用过,以后会有更新,研究中.
authorized:可以设置身份的验证方法:系统用户,匿名用户,自定义用户,还有继承用户(此处也在研究中,建议使用匿名用户)
JDK installations:设置JDK的安装路径
Shell executable:设置window shell命令
Ant installation:设置ant 的安装路径
mave installation设置mave的安装路径
cvs executable:设置cvsnt执行进程的路径(cvs.exe)
.cvspass file:设置cvsnt管理员文件的路径(passwd文件)
e-mail notification:设置当发生错误时发送的邮箱地址
hudson url:就是hudson的默认地址
还可以配置服务器的其他几个方面,比如向 Hudson 提供一个电子邮件服务器的位置,以便在构建失败时接收电子邮件。根据您的组织设置电子邮件的方式,可能需要让系统管理员帮助设置这个特性。设置电子邮件并不是必需的;Hudson 还支持以 RSS 作为通知机制,对于某些人来说,这种方式比电子邮件更好。究竟选择哪些通知机制完全取决于您。(注意,这里说的是 “哪些”,也就是说,可以同时使用多种通知机制!)
在 Hudson 中配置项目
既然 Hudson 已经能够与 SCM 存储库通信了,就该配置项目了。这个示例所用的项目称为 solar-ci。在 Hudson 主页上单击左上角的 New Job 链接。这时会看到图 5 所示的屏幕:
该页面可以使我们通过hudson来管理cvs里的一个对应的工程
Project name:工程名称
Description:描述信息
Discard build:如果选择此项可以设置build记录保存的天数,或者build记录保存的数理,或者只保存最新的build记录,一般不需填写
Advance project options:可以设置hudson定时检查cvs工程的时间间隔,还可以指定cvs工程check out到本地的工程路径,一般不需要填写
Source code management:我们选择cvs将出现以下参数:
Cvsroot:将写cvs登陆字符串,格式(:protocol:user:password@host:path),例如: :pserver:cvsadmin:1@127.0.0.1:2401:/CVSNT/Repository,使用cvs必填
Modules:填写cvs仓库下的具体工程名, 使用cvs必填
Branch:填写分支名称,也可以勾选this is a tag,no a branch指定标记名称
选择subversion可以进行相应的subversion设置
Build trigger可以设置hudson自动执行的一些动作,build after others projects are built指定hudson构建完成后需要继续构建的工程名
Build periodically 根据hudson定义的语法规则来设定自动构建工程的时间间隔
Post-build actions
设置一些构建完成后的动作,如放邮件,打包,产生测试报告,产生java doc 等.
点击ok保存设置
使用hudson
进入刚配置的项目,可以在左侧build history看到历史的build记录,点击build now 可以手动执行构建动作,完成后可以通过记录标记的颜色来看是否出错,红色有错,蓝色成功.点击记录查看详细信息,如果有变化hudson将列出类信息
elipse插件应用
eclipse updatesite:http://code.google.com/p/hudson-eclipse/
重新打开eclipse在windows->preferences下将出现hudson选项,设置默认的hudson url保存.
然后选择windows->open view打开hudson view
如果你己经配置hudson项目将列出hudson的项目名称,右键菜单可以看到所有的执行菜单,使用还是很方便的.
一: 什么是Hudson.
Hudson 是一种革命性的开放源码 CI 服务器,它从以前的 CI服务器吸取了许多经验 教训。Hudson 最吸引人的特性之一是它很容易配置:很难找到更容易设置的 CI 服务器,也很难找到开箱即用特性如此丰富的CI 服务器。Hudson 容易使用的第二个原因是它具有强大的插件框架 ,所以很容易添加特性。例如,一个 Hudson 插件可以随时间的推移跟踪FindBugs 和代码覆盖。它还可以报告测试结果的趋势(来自 JUnit 或 TestNG)以及构建结果和对应的执行时间。
Hudson 需要运行 Java 5。如果需要使用 Hudson 附带的嵌入式容器(Winstone)之外的其他容器,那么只需使用一种 Servlet 2.4 容器。对于大多数情况,Winstone 就足够了。运行Hudson有两种方式: 1.可以将Hudson部署到Tomcat下面运行, 具体部署方法为......................................................................................................................2. 可以使用命令启动hudson。步骤:首先下载hudson.war(https://hudson.dev.java.net),然后可以在一个盘符下建立一个文件夹,如D:\hudson,然后将这个路径设置环境变量,Hudson_Home=D:\hudson,最后使用命令java -jar hudson.war启动hudson.
我在使用hudson的过程中使用的第二种方法来运行hudson的,下面进行逐一的介绍:
启动界面如下(http://localhost:8080)
持续集成工具之Hudson
一)首先对hudson进行整体的配置:选择Manage Hudson按钮,进入下一个界面
持续集成工具之Hudson
Configure System: 可以对hudson进行系统配置,包括全局路径和变量设置等。如下图
持续集成工具之Hudson
1):System Message 当然了这是表面的东西啦,比如你可以写成 o,hi,hello,how are you,thank you,什么什么之类的,它也支持HTMl语言,可以把这个欢迎界面弄的相当漂亮。我是比较懒的那种人,所以嘛......嘿嘿!
2):Quiet period 这个值是表示你可以让你的构建有等待时间,以防止在提交代码的过程中去开始构建。这里是全局的变量,我习惯在每个项目里面去设定,因为我使用hudson搭建的项目有SVN的还有VSS的,这个等待时间的值肯定会不一样。(如果你想在这里设置可以查看右边的“帮助”)
3):Enable security 这里是hudson权限的相应设置,选择该项后,如下图:
持续集成工具之Hudson
TCP port for JNLP slave agents:可以设定JNLP的端口,我的选择是Disable
其它选项如下:
持续集成工具之Hudson
Project-based Matrix Authorization Strategy 这里可以设置项目参与者每个人不同的权限,如Read,Delete,Configure,Create等。
4):JDKs,shell,Ant,Maven,CVS等等,这些可以在这里设定,也可以在你的XML(ant语句)配置文件里面设定。我的是在XML里面设好了的。这里就不做介绍啦,如果想了解的更深,右边的“help”会有很大的帮助。 我就不多说废话了。害羞
5):E-mail Notification 这个还要多说什么吗?什么? 发火 哦,那还是说一下吧.
SMTP server-->mail服务器地址(127.0.0.1)
Default user e-mail suffix-->邮件的后缀名(@123.com)
System Admin E-mail Address-->管理员用户的邮件帐号123@123.com
Hudson URL-->访问hudson的URL(http://127.0.0.1:8080)
Manage Plugins:可以下载hudson支持的各种插件。如可以下载CVS Tagging Plugin FTP-Publisher Plugin Visual SourceSafe Plugin等等,我就不在这里做一一的介绍了,具体这些插件有什么作用,可以在下载界面看具体描述。(当然,你也可以通过设置代理去下载这些插件,个人觉得只要选择适用于自己项目的插件即可。)
Install as Windows Service:可以将hudson加载为Windows的服务,在每次启动Windows的时候可以启动hudson,我的服务器是不关机的,所以这项我没有用到,没有实验过具体怎么实现,但是我觉得应该很简单的哦。 得意
Configure Executors Reload Configuration from Disk System Information System Log Script Console Prepare for Shutdown这几项没有玩过的,不知道具体是干什么的,只是知道大概可以干些什么事。等有时间再去研究啦 偷笑
行了吧?说的够详细了吧?还是不明白的话就找我吧,QQ:252285669
以上就是对hudson的整体的配置啦,是不是相当的简单方便?至于项目的东西一会再写。休息休息 海盗
前面说到Hudson的整体配置, 现在来说下如何通过hudson去配置一个实际的项目
打开http://localhost:8080界面,可以看到左边有三个选项,分别为New Job Manage Hudson Build History选择New Job选项, 进入一个界面
持续集成工具之Hudson
Job name取名为TestJob, 并选择Build a free-style software project,其它几个(如Build a maven2 project等)要看根据项目的需要去适当选择,我是用ant来集成的一个构建环境,然后OK.
进入下一个界面
持续集成工具之Hudson持续集成工具之Hudson
下面就又要开始一一介绍这个界面了,
一: Project Name 在你建立项目的时候已经取过名字了,TestJob.如果你哪天想改名字,就在这里改就可以了.
二: Description 这里主要是写对TestJob这个项目的描述,可以写项目的参与者,项目起止日期等等,可以说这个地方是美化界面+项目描述+提示信息等等,我对于界面美化没有太多的要求,这个就留给大家去研究啦.
三: Discard Old Builds 建议开启这个选项(hudson有一个选项,可以从SVN上check out项目,但这个项目的位置好像只能是%hudson_home%/jobs/projectname/workspace下面,本人认为这是一个不合理的方式,因为很正常的大家都会在自己的目录下建立项目后,然后再用hudson去构建环境,关于这个选项我下面再说,很讨厌的东西),有个图示如下,
持续集成工具之Hudson
Days to keep builds: 是说你每次构建后的版本(可以在%hudson_home%/jobs/projectname/builds下面找到,如果你的目录下没有这个目录,说明你的构建还没有正式开始,即不存在构建记录),会保留的时长.
Max # of builds to keep: 是说你要保留最多多少个构建出来的版本
四: This build is parameterized: 表示这个build是参数化的(目前为止我还没有用过这个选项,没有实践就没有发言权,我就不多说了),可以理解为在一个完整的构建中,这个构建过程需要依赖于某个第三方包,或者某个类,再或者某些特定的方法等.
五: Disable Build: 这个选项可以将某个构建项目临时性的停掉.比如我们有两个工程.TestJob和TestJob1,在两个工程启用一段时间后,TestJob1已经被临时性的停掉,但并不是真正意义上的废除。我们可以进入TestJob1配置界面,将此项选中即可。
六:Advanced Project Options: 这里是表示你可以对你的项目构建进行一定的设置,它下面包括两个小的选项,
1.Quiet period: 时间可以根据项目的需要来设定。哦,差点忘了,这里的这个时间是说明从构建开始到项目真正开始构建之间的时间差,比如,我将此时间设为300S,说明 TestJob在要开始构建之前会有5分钟的时间缓冲,这个是非常人性化的,因为如果有大量的代码需要提交,会需要很长时间,如果没有等待时间的话很容易出现少代码的情况导致整个构建过程的失败。
2.Use custom workspace:这个地方你可以将可以对外公布的东西放在一个特定的目录下,然后把这里的值设成该目录,如:D:\hudson\jobs\TestJob\builds这样的话,这个目录下的东西是就公共的了。
七:Source Code Management: 从名字上看就应该知道是什么意思了吧?
持续集成工具之Hudson
这个选项是源码管理,当然也有很多的源码管理工具供你选择了,如CVS,SVN还有Hudson的插件,如VSS等等,详细的可以参考上面的一项专门介绍如何使用hudson的plugin的。我们以Subversion(俗称SVN)为例,向简单说一下。
Modules Repository URL:这里是你要管理的代码在哪里的SVN库上(或者库的URL等等)。如:http;//127.0.0.1:8080/SVN/project/_test
Local module directory(optional): 这个是你要给你的项目选择一个本地的存放的目录,以我的实践经验来看。这个目录只是能在%Hudson_home%/jobs/projecct_name/下面的一个地方存储,而不能放到另外的盘符或者目录下。(如此处说明有误,本人洗耳恭听)。
Use update: 这里选项勾上后,每次检测到库上有更新,就会使用svn update命令;如果没有勾上的话,那每次使用的是svn checkout命令。熟悉SVN的人都知道,小项目的话这两个区别不大,但如果是大项目的话,update要比checkout命令省相当多的时间。
Repository browser: 我也不知道这里是干嘛使的,没研究,反正每次我都会选择(Auto)选项。
八:Build Triggers:可以理解为你想以什么样的方式去触发你的构建,以其它构建成功后为基础,还是周期性的构建,还是根据poll SCM(变更触发)来触发构建。
持续集成工具之Hudson
一般选择一项即可,我使用的是poll SCM。第一项最简单,但对于大多数项目来说不太适用。它是根据TestJob这个工程所依赖的其它项目构建成功为基础,如TestJob要依赖于Test这个项目(包括jar包啊,环境啊什么的),然后在Projects names里面填写它所依赖于的项目名称即可,如Test;第二项,是周期性构建,Hudson提供了一种语法,可以查看后面的help,要在Schedule里面使用这个语法,如我写成* * * * *,这表示每分钟要构建一次,*/30 * * * *,则表示每隔30分钟进行一次构建。当然也可以设定年月日等日期;第三项是根据检测的更新去执行构建,Schedule的语法表示跟上面一样的,就不多说了。
九:Build 这里是Hudson构建部分的正式开始,也是心脏。先看下面几个图吧。持续集成工具之Hudson
我的项目是使用ant来实现的,当然我就选择Invoke Ant选项,从这里来看,好像你可以自己在这个界面上直接定义ant语法,我的是有专门的ant文件去执行某个target, 也有一个总的build.xml将这些target连接起来,还自己写义了上些的properties文件,可以使用ant直接调用。里面定义了一些路径啊,常量啊什么的。
持续集成工具之Hudson
Targets: 当然这里我可以选择任意的啦,也可以不填写这里。(上面说了我都有一个总的build.xml啦)
Build File: 选择我的build.xml所在的位置。
Properties: 如果是自己在Hudson里面写ant的话,这里可以对一些常量进行定义,如路径名等等。
Java Options: 去定义java在运行时的一些参数,如-Xmx512m等等。
十:Post-build Actions这里也可以说是做一些发布啊,善后啊之类的,可以看到有mail, artifacts, publish之类的。
持续集成工具之Hudson
我只说我用过的几个,别的我也没资格啦。
Archive the artifacts 看下图
持续集成工具之Hudson
可以指定archive的路径,如D:\hudson\jobs\TestJob\builds, Excludes可以排除上些你不想成为archive的东西,如*.bak,*.zip之类的。
Discard all but the last successful/stable artifact to save disk space这个选项可以要也可以不要,但是如果你硬盘够大的话,这个选项还是不要勾的好,这样还可以去查看artifacts的历史。
Build other projects看下图
持续集成工具之Hudson
这里和上面的第八大节里面的Build Triggers的Build after other projects are built有一个承上启下的作用。可以定义在这个项目构建成功后去构建哪几个项目。Trigger even if the build is unstable建议项目之间依赖特别强的不要勾此选项,如果依赖不是特别强的话可以选择此项以保证构建的持续性。
E-mail Notification看下图
持续集成工具之Hudson
Recipients:填写收信的地址,下面有两个选项,建议两个都要选上,第一个是为每个不稳定的构建都要发mail通知相关的人,看来Hudson的开发者也相信no news is good news 大笑 第二个是一个比较好的想法,但是我觉得做的还不够完美,这是给两次构建之间,对project进行修改过的所有的人都发一封mail,以告诉他们当前版本构建失败,速度改正错误。