持续集成
概念:
持续集成就是快速且高频率地自动构建项目的所有源码,并为项目成员提供丰富的反馈信息。
其中构建包括:编译、测试、审查、打包、部署
持续集成流程:
1.持续编译
2.持续数据库集成
3.持续测试
好的单元测试必须是自动化的、可重复执行的、不依赖于环境的,并且能够自我检查的
4.持续审查
Checkstyle和PMD之类的工具发现代码中的坏味道(Bad Smell)
5.持续部署
6.持续反馈
硬件设置:集成服务器性能越高越好
源码控制工具、自动化构建工具、自动化测试工具、持续集成软件
优秀的持续集成工具:
开源工具CruiseControl、Hudson
商业的Bamboo和TeamCity
Hudson简介
优点:
功能强大、界面易用,与主流构建工具、版本控制系统以及自动化测试框架都能很好集成
灵活的插件扩展框架
安装Hudson
下载文件为:hudson-3.0.0.war
运行:最简单启动方式为
java -jar hudson-3.0.0.war
启动后,访问 http://localhost:8080
停止:Ctrl+C
默认商品为8080,指定端口启动
java -jar hudson-3.0.0.war --httpPort=8082
也可以把war包部署到各种Web容器中
问题:用命令行启动时,遇到下列问题:
Initial setup required. Please go to the Hudson Dashboard and complete the setup.
访问hudson设置插件安装,即可(选择默认安装)
安装个插件费这么长时间。。。最后截个图
选择Install as Windows Service
准备Subversion仓库
常见版本控制工具:CVS、Subversion、Git、Mercurial
安装Subversion服务器软件(svnserve) 参考 svn应用笔记
常用命令:
1.查看svnserve安装
svnserve --version
2.创建一个Subversion仓库
mkdir svn-repos svnadmin create svn-repos\account
3.导入account项目,导入前,用mvn clean清除项目输出文件
svn import -m "initial import" . file:///d:/svn/svn-repos/account/trunk
上述命令将当前目录的全部内容提交到Subversion仓库的/account/trunk路径下
-m选项表示提交的注释
3.启动svnserve服务
svnserve -d -r svn-repos --listen-host 0.0.0.0
-d表示将svnserve服务作为守护进程运行
-r表示Subversion仓库的位置
--listen-host是为了强制将svnserve绑定到IPv4地址(有些系统,svnserve会默认绑定IPv6,当Hudson使用IPv4地址访问Subversion仓库的时候就会失败)
疑问:这个命令没有指定启动哪个库,若在svn-repos下有多个库的话,是启动哪个呢?
直接用这个命令,就明白了
svnserve -d -r d://svn/svn-repos/account --listen-host 0.0.0.0
4.检查Subversion仓库内容
svn list svn://localhost/account/trunk
Hudson的基本系统设置a在创建Hudson持续集成任务之前,用户需要对Hudson系统做一些基本的配置,包括JDK安装位置和Maven安装等在内的重要信息都 必须首先配置正确。
左侧“系统管理”--->右侧“系统设置”
1.配置JDK
Name(别名)
JAVA_HOME
2.配置Maven
Name
MAVEN_HOME
3.配置MAVEN_OPTS环境变量
参考 Maven入门实战笔记01 -Xms128m -Xmx512m
最后,点击页面正文的Save按钮保存系统设置
创建Hudson任务
创建Hudson任务来集成Maven项目
左边“新建任务”--->填写任务的名称及类型
构建一个自由风格的软件项目
构建一个Maven 2/3 (Legacy)项目
这两项,前者不公支持Maven项目,还支持其他类型的构建工具,如Ant、Shell。
对于Maven用户来说,两者最大的不同在于前者需要用户进行多一点的配置,而后者会使用Hduson自带的Maven,且从项目的POM中获取中够的信息以免去一些配置。推荐free-style
Hudson任务的基本配置
1.名称和描述,当任务比较多的时候,简洁而有意义的名称及描述就十分重要
2.Discard Old Builds:该选项配置如何抛弃旧的构建
Hudson每次构建相关的文件都会保存下来,将会渐渐耗光磁盘空间,为此Hudson提供两种方式供选择:
Days to keep builds:如果其值为非空的N,就留N天之内的构建文件
Max # of builds to keep:如果#为非空,就公保留最多#个最近构建的相关文件
上图所示配置表示最多保留10个最近的构建
3.如果有多个JDK,这里还需选择JDK版本
Hudson任务的源码仓库配置
在项目配置页面的Source Code Management部分,选择 Subversion,输入Subversion仓库地址 ,一般来说,其他选项保留默认值即可,如图:
如果Subversion仓库需要认证,Hudson会提示用户输入认证信息:
Hudson任务的构建触发配置
在Build Triggers部分配置的是触发构建的方式。
Build after other projects are built:在其它项目构建完成后构建本项目
Bukld periodically:周期性地构建本项目
Poll SCM:周期性地轮询源码仓库,发现有更新的时候构建本项目,推荐选这个
既然是轮询,就需要配置轮询的频率,Hudson使用了著名的UNIX任务高度工具Cron(http://en.wikipedia.org/wiki/Cron)所使用的配置方式。这种配置方式使用5个字段表示不同的时间单位(字段之间用空格或制表符分隔)
分 :0-59
时 :0-23
日 :1-31
月 :1-12
星期几 :0-7(0和7都表示星期天)
特殊字符:
*:星号表示匹配范围内所有值
M-N:连字符表示匹配M-N范围内的所有值,如"1-5"
A,B,...,Z:逗号表示匹配多个值,如"0,15,10"
*/X或M-N/X:范围加上斜杠表示匹配范围内能被X整除的值,如“1-10/3”,就等同于“3,6,9”
举例:
(1)****:每分钟
(2)5****:每小时中的第5分钟
(3)*/10****:每隔10分钟
(4)45 10 ** 1-5:每周一到周五的上午10点45分
(5)0,30 * 13 * 5:每月13号的每半个小时,或者每周五的每半个小时
在配置轮询的时候,还可以使用“#”添加注释,此外空白的行会被忽略。
对于一个健康的项目来说,觉见做法是:每隔10分钟轮询代码仓库(*/10 * * * *),如图
单击Build中的Add build step下三角按钮,选择Invoke Maven2(legacy)(《Maven实践》书中写的是:Invoke top-level Maven targets),如图:
完成后,单击Save
监视Hudson任务状态a
Hudson界面,了解各个任务的当前及历史状态,包括整体的列表显示、自定义视图、单个任务的具体信息,如构建日志和测试报告等
全局任务状态
默认主页显示了当前服务上所有集成任务的状态,如图:
任务状态:
S:任务当前状态;
第一列的球形颜色:
蓝色:任务最近一次的构建是成功的
红色:任务最近一次的构建是失败的
黄色:任务最近一次的构建表成功了,但不稳定(主要是因为有失败的测试)
灰色:任务从未被执行过或者被禁用了
如果图标闪烁,表示任务正在执行一次构建
W:天气
第二列,使用天气图标表示任务长期的一个状态
万里晴空:>80%成功
稍有乌云:60%-80%成功
乌云密布:40%-60%成功
阴雨绵绵:20%-40%成功
电闪雷鸣:<20%成功
自定义任务视图
用户可以单击默认视图All旁边的加号(+)以添加一个自定义视图
单个任务状态a
Maven项目测试报告
为了显示项目的测试结果信息,需要一些额外的配置。
maven-surefire-plugin会在项目的tqrget/surefire-reports目录下生成与JUnit兼容的XML格式测试报告,Hudson能够基于这种格式的文件生成图形化的测试报告。
为Hudson任务配置测试报告:
用户可以配置一个Hudson,在配置页面的Post-build Action部分选择Publish JUnit test result report选项,并且将Test report XMLs赋值为
**/target/surefire-reports/TEST-*.xml
该表达式表示匹配任意目录下target/surefire-reports/子目录中以Test-开头的XML文件,这也匹配所有maven-surefire-plugin生成的XML格式报告文件
有了上述配置后,就能在任务状态页面中看到最新的测试结果与测试结果趋势
配置构建命令忽略测试:
将Maven构建命令以改为:clean deploy -Dmaven.test.failure.ignore
这样失败的测试就不会导致构建失败
这种配置方式能够帮助用户区分失败的构建与不稳定的构建
Hudson用户管理
Subversion仓库,默认该仓库是匿名可读的,认证用户可写,
现在关闭匿名可读权限,同时添加一些用户。具体参考《Subversion与版本控制》
编辑Subersion仓库下的conf/senserve.conf文件中的[general]小节,如下:
[general] # anon-access = read # auth-access = write password-db = passwdanon-access = none:表示匿名用户没有任何权限
auth-access = write:表示经认证用户拥有读写权限
password-db = passwd:表示存储用户信息的数据位于同级目录下的passwd文件中
编辑conf/passwd文件如下:
[users] admin = admin123 yangdc = yangdc这里为仓库配置了三个用户,等号左边是用户名,右边是密码