持续集成:采用条件触发、定时等方式,自动化实现代码的管理、编译、测试、发布等工作
主要功能
源码管理
持续集成:定时或条件触发
自动构建:编译、单元测试、集成测试、打包
通知机制:多种方式,如e-mail IM RSS
丰富的报告:javadoc, 测试,代码质量等
web页面:一个良好的UI
强大的扩展机制:插件
原则
业界普遍认同的持续集成的原则包括:
1)需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有 IBM Rational
ClearCase、CVS、Subversion 等;
2)开发人员必须及时向版本控制库中提交代码,也必须经常性地从版本控制库中更新代码到本地;
3)需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改来直接触发,也可以定时启动,如每半个小时构建一次;
4)必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,需要手动启动一次构建。
组成内容
自动构建工具 : maven
代码存储库: svn
集成服务器: jenkin
GIT支持离线工作,更适合开源软件或者开发人员不能集中办公情况下的版本管理工作。同时,SVN和GIT可以配合使用。
SCM工具 |
江湖地位 |
控制方式 |
原子提交 |
并发冲突解决 |
权限管理 |
支持变更范围 |
CVS |
资格最老,但逐渐衰退
|
集中式 |
NO |
排它锁 |
方法有限 |
文件 |
SVN(Subversion) |
CVS的升级,目前较为主流
|
集中式 |
YES |
合并模式(通知冲突) |
支持目录级。通过工具可支持文件级 |
文件、目录 |
GIT |
Eclipse.org上使用最多
|
分布式 |
YES |
合并模式 |
权限配置较为困难 |
文件、目录 |
为什么要使用
1. 尽量实现自动化
通过配置jenkin实现:
自动编译、测试、打包、生成注释、代码质量检测、发布、邮件通知
定时持续集成
2. 将开发人员工作减少到最低
编写设计和使用文档、
编写源代码、
点击“更新”和“提交”键
3. Jar javadoc resource的自动绑定
4. 提供工程信息的一站式服务
通过使用 maven 的site站点,在网页上展示项目描述、项目文档、javadoc、源代码等信息,方便查找,也方便新人进入。如图所示:
5. 与其它工具结合的持续代码质量改进。如与CheckStyle, PMD, FindBugs, Fxcop等等等等的结合。
现在系统中引入了一个findbug,这个检查工具比较简单也比较靠谱,一般来说代码改进工具都需要根据部门情况进行定制。
6. 与测试工具或者框架结合的持续测试。如与xUnit,SilkTest, LoadRunner等等的结合。
现在系统中是与 testNG相结合,测试报告在 jenkin中可以看到,方法同上:
7. 便于Code Review。在每个build里,我们都可以知道与前一个build之间有什么改动,然后针对这些改动,我们就可以实施Code
Review了。
8. 易于定位错误。也就是当你的持续集成失败了,说明你新加的代码或者修改的代码引起了错误,这样你很容易的就可以知道到底是谁犯了错误,可以找谁来讨论。
通过查看构建日志,确认是什么问题,如:
常见流程
1. 从svn下载程序
2. 编写代码和测试,commit到svn
3. jenkin服务器根据触发条件,从svn提取最新代码,交给构建工具maven
4. maven 对代码进行编译、测试,并进行打包。如有必要,实现产品部署、发布
5. maven 插件进行集成测试、代码质量管理
6. 使用 site插件建立、管理项目开发的工作网站
环境修改
Svn修改
将svn改成英文的url,步骤如下:
某一天下班前完成代码的提交
我将代码复制到英文目录下,废弃原有svn地址
第二天其他人从新的svn地址 checkout
MAVEN_HOME/conf/settings.xml
主要修改两部分:
1. 将下载地址从远端修改为 nexus,(不要配置mirror,有些问题)
<profiles> <profile> <id>dev</id> <repositories> <repository> <id>local-nexus</id> <url>http://[ip]:8081/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>third-party</id> <url>http:// [ip]:8081/nexus/content/repositories/thirdparty/</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>snapshot</id> <url>http:// [ip]:8081/nexus/content/repositories/snapshots/</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>release</id> <url>http:// [ip]:8081/nexus/content/repositories/releases/</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> </profiles> <activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles> |
2. 当执行 mvn deploy发布共享的jar时,能发布到nexus的snapshots中
<servers> …. <server> <id>third</id> <username>admin</username> <password>pass</password> </server> <server> <id>snapshot</id> <username>admin</username> <password>pass</password> </server> <server> <id>release</id> <username>admin</username> <password>pass</password> </server> </servers> |
Project中的pom.xml
根据自己开发的项目作出相应的修改
特色功能
项目间共享
如 A项目要用到B中的代码,
在B项目下,执行deploy功能 :
配置pom.xml 的distributionManagement;
配置setting.xml的 server;
执行 mvn deploy
上传maven没有的jar
通过在pom.xml中配置为 <scope>system</scope>来实现
<dependency> <groupId>aaa</groupId> <artifactId>shareview</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/aaa-share-view.jar</systemPath> </dependency> |
Eclipse的jar加入javadoc和resource
实现步骤:
1. 运行 mvn dependency:resource下载源代码
2. 运行mvndependency:resolve -Dclassifier=javadoc 下载javadoc
3. 运行mvneclipse:eclipse –Dwtpversion=1.0 生成工程的classpath
效果如下:
生成报告
已经实现自动生成 javadoc ,描述信息,单元测试报告,网页显示源代码,设计和帮助文档,findbug、pwd报告。
其中加入设计文档比较麻烦,步骤如下:
1. 将报告转换为html或pdf格式
2. 放入src/site/resources目录下相应目录
3. 修改 src/site/site.xml文档, 建立连接指向该文档
具体参考 site plugin的网站,和scie-web-view下的site.xml文件
自动发布
Jenkin的deploy插件
Shell脚本实现
参考文档
持续集成10日谈:
http://blog.csdn.net/leijiantian/article/details/7916483
PS:条理非常清晰
开发各阶段和CI的整合
1、 需求分析阶段:
生成项目的maven站点,加入项目基本信息和需求分析相关文档
2、 系统设计阶段
向maven站点加入系统设计相关文档(功能设计、数据库设计等)
CI准备工作:确定项目的目录结构;生成SVN仓库;编写POM文件;在Jenkins上新建job
3、 开发、测试阶段:
程序员使用TDD开发方式,周期性提交源代码
CI自动进行代码编译、单元测试,在maven站点自动生成相应运行报告
测试人员可以随时进行产品新版本的界面测试
需求分析、设计文档如发生变化,也及时提交至maven站点
4、 安装部署阶段:
根据开发、测试结果,随时进行阶段性的自动(远程)部署(war/ear等文件)
5、 项目收尾阶段:
源代码存档:从SVN仓库中checkout项目各版本的源代码
项目文档存档:(如果对设计文档进行了SVN管理)从SVN仓库中checkout文档;
备份maven站点
nexus四个阶段
Nexus 主要实现两个作用:
Proxy: 代理远端的maven站点,加快下载速度;
Hosted:将内部共享的jar deploy,完成共享
四个阶段:
参考:http://books.sonatype.com/nexus-book/reference/repoman-sect-adopting.html
自动化生成版本号
思路:
建立svn仓库和release版本号的对应。在SVN\trunk中某个版本号的源代码执行构建任务成功后,利用maven的插件,将这个版本号的源代码copy到SVN\Tags中的以release
版本号命名的子目录下。
相应的操作步骤如下:
1、在pom.xml中设置maven-release-plugin(在build中的plugins;
pom中要配置 SCM)
2、建立一个Jenkins job,并进行设置
3、执行构建任务
参考 :
http://blog.csdn.net/leijiantian/article/details/7936321
http://juvenshun.iteye.com/blog/376422
tomcat下webapp的自动发布
事先需要设置tomcat的manager-script用户和密码。方法:进入tomcat的安装目录/conf下,找到tomcat-users.xml,打开,增加下列内容:
<role rolename="manager-script"/>
<user username="tomcat" password="tomcat"roles="manager-script"/> |
设置好后,在Manager user name和Managerpassword中分别填入“tomcat”、“tomcat”。如果没有设置这些用户信息,在自动构建部署时则会提示你一大堆的错误信息,呵呵。
Tomcat URL为“http://127.0.0.1:8080”或者“http://localhost:8080”,地址字符串最后千万不要加"/",不然找不到正确的manager目录哦。
修改记录
使用maven的 changelog插件
<!--changelog报告的生成需要明确指明SCM来源。若无SCM设置,其它报告可以生成
(因为Jenkins设置了源代码仓库所在位置),但changelog报告无法生成。-->
<scm>
<connection>scm:svn:https://firstlevel/svn/newdemo/trunk</connection>
<developerConnection> scm:svn:https://firstlevel/svn/newdemo/trunk</developerConnection>
</scm> |
在<developers> 配置的开发者name最好和svn中name一样,这样maven会认为这两个是同一个人!可以通过超链的方式把SVN的用户与maven的用户连接在一起。
|