| 持续集成:采用条件触发、定时等方式,自动化实现代码的管理、编译、测试、发布等工作 主要功能 源码管理  持续集成:定时或条件触发  自动构建:编译、单元测试、集成测试、打包  通知机制:多种方式,如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的用户连接在一起。 |