前言html
但凡一个略有规模的项目都须要一个持续集成环境的支撑,为何须要持续集成环境,咱们来看一个例子。假如一个项目,由A、B两位程序员来协做开发,A负责前端模块,B负责后端模块,前端依赖后端。A和B都习惯使用SVN做为代码管理工具,他们分别开始工做,一个功能完成后会提交到SVN,以便对方可以使用。一天B告诉A,个人某个功能完成了,提交到SVN,你更新下来试一下。A便从SVN更新下来代码,结果一试,我檫报错,因而告诉B你的代码有问题,B检查了一下确实有问题,而后B通过1个小时修改后,从新上传到SVN,A更新下来可使用了。又过了几个小时,A发现B的代码仍然有问题,B检查了半天,没找到问题所在,后来开发组长检查他们的代码发现是两我的使用不一样版本的jar包致使的,这个问题确认难以发现,A把jar包的版本弄得和B同样,A和B又开始继续工做。终于有一天项目完成了,须要发布程序,这时A从本身的开发环境上编译一个版本,把他上传到服务器上,程序运行的前几天比较稳定,后来A有点急事请假了,但服务器上的程序这时好像出现了问题,这时B只能使用本身的电脑调试、解决问题并试着发一个版本,但由于他平时作后端,对版本发布不是很熟悉,又搞了半天终于弄好了。项目上线了,稳定运行了半年,后来A、B前后离职了,新来的C负责维护这个项目,尽管A、B在离职前作了一些工做交接,但当C真正接手的时候才发现头大,我檫竟然注释都没写,有没有这么坑的,因为C开始硬着头皮看代码,发现代码中各类飘逸写法,各类为了临时需求而打的补丁,C几乎抓狂。前端
以上的例子有点夸大,但或多或少均可能遇到过,咱们须要一种规范来约束这个开发过程,使开发过程严格有序的进行。java
从问题出发linux
就以上面这个例子,咱们看其中暴露出了哪些问题:程序员
一、团队彼此协做不流畅,出现彼此阻塞的状况;web
二、使用的类库版本不统一,形成难以估计的风险;spring
三、代码未经严格测试就上传,形成不断的返工;apache
四、版本发布规范欠缺,版本质量不能保证;windows
五、代码质量低,其余人难以接手。后端
团队开发时,咱们经常约定好彼此之间的接口规范,而后开始各自开发,开发完成后,按照接口规范对接起来,这是一个理想的流程,但现实每每不那么顺利,问题经常在于,接口规范可能根据需求变化而常常变动,并且在实际对接时常常发现诸多问题。咱们没法经过工具来解决这些问题,只能要求开发人员在制定接口规范时,为可能变动的需求多一些扩展,在开发时多考虑诸多素质,尽可能将减小对接过程当中的问题。下面将讲述如何使用Maven和Nexus保证开发人员引用统一的类库版本,以及如何将本身开发的模块上传至Nexus服务器,以提供给其余模块引用。
关于Maven和Nexus的搭建在Maven实战(Maven+Nexus创建私服【Linux系统】)中已经介绍过,在此介绍下主要步骤:
一、下载maven(读:妹吻)和nexus(读:耐克色儿丝):
http://maven.apache.org/download.cgi
http://nexus.sonatype.org/downloads/
二、将下载的nexus放置到linux服务器解压并启动:
cd /data/program/nexus-2.3.1-01/bin/jswll
选择本身的系统并进入:
启动nexus
./nexus start
nexus启动成功,访问:http://192.168.6.204:8081/nexus/
三、将下载的maven解压放置在开发机上(windows),并配置conf目录下的setting.xml文件:
(1)在<settings><profiles></profiles></settings>节点之间添加配置:
<profile> <id>dev</id> <repositories> <repository> <id>local-nexus</id><url>http://192.168.6.204:8081/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots><enabled>true</enabled> </snapshots> </repository> </repositories> </profile>
接着在<settings></settings>节点之间添加配置:
<activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles>
以上配置好了链接Nexus私服。
(2)安装eclipse的m2eclipse插件,并配置maven。
m2eclipse的安装地址:http://m2eclipse.sonatype.org/sites/m2e(安装过程略)
安装完成后配置maven:
配置eclipse的maven为本地下载的maven地址。主要为了方便配置和版本管理。
至此,nexus和maven就搭建配置完成了,下面咱们要利用这个环境解决两个问题:
一、不一样的模块项目都使用统一的类库版本;如spring都使用3.1.2.RELEASE,log4j都使用1.2.17。这样避免由于jar包版本的不一样,引起的诸多问题。
二、模块开发完毕后,将编译的库文件发布到nexus私服上,以便其余模块引用。
这里说一下maven的一个特性,继承。简单来讲继承就是先创建一个父项目,其余项目若是继承这个父项目,就能够继承这个项目定义的库文件及版本。利用这个特性,咱们可让多个模块都继承一个父项目,而在父项目中定义好类库的版本,这样全部模块都使用统一的类库文件。例如:
创建名为maven-parent的父项目,pom配置为:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cnblogs.leefreeman</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<!-- junit -->
<junit.version>4.10</junit.version>
<!-- servlet -->
<servlet-api.version>2.5 </servlet-api.version>
<!-- log4j -->
<log4j.version>1.2.17 </log4j.version>
<!-- commons.codec -->
<commons.codec.version>1.7</commons.codec.version>
<!-- maven-support -->
<maven-support.version>0.0.1-SNAPSHOT</maven-support.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- commons包 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons.codec.version}</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
这个pom定义了一些类库以及它的版本。
而后再创建模块项目:maven-sample(web项目)、maven-support(支撑模块,包括一些工具类以及业务封装,提供给maven-sample引用)。
maven-sample的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.cnblogs.leefreeman</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>maven-sample</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
</dependencies>
<build>
<finalName>maven-sample</finalName>
</build>
</project>
maven-support的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.cnblogs.leefreeman</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>maven-support</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
</dependencies>
</project>
经过以上配置,maven-sample和maven-support引用的jar包,都会使用相同的版本:
接下来咱们解决协做开发的问题,maven-support开发完毕以后,将之发布到nexus服务器,以便maven-sample能够引用。咱们须要3步:
一、本地maven的conf目录下的setting.xml,在<servers></servers>节点之间添加:
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
二、在maven-support项目的pom.xml中,<project></project>节点之间添加:
<!-- 构件部署仓库 -->
<distributionManagement>
<repository>
<id>releases</id>
<name>发布版本仓库</name>
<url>http://192.168.0.109:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>快照版本仓库</name>
<url>http://192.168.0.109:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
三、对maven-support项目进行编译,并执行发布命令:
能够看到maven-support已经成功发布到nexus私服中:
这样maven-sample就能够引用maven-support模块,而开发maven-support的人则能够继续开发,持续发布新版本。
小结
本文主要介绍maven和nexus的环境搭建,以及怎么使用maven和nexus统一管理库文件和版本,怎么讲本身的模块上传至nexus私服,供其余模块引用。这样咱们基本解决了两个问题:
一、团队彼此协做不流畅,出现彼此阻塞的状况;
二、使用的类库版本不统一,形成难以估计的风险;
下一篇将使用jenkins、svn、tomcat以及sonar解决自动化测试、自动化版本发布、代码质量检查等问题。
前言
上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库文件和版本,以及怎么将本身的模块上传至nexus私服,供其余模块引用。下面将主要介绍如何利用Jenkins、SVN、Tomcat以及Sonar来完成项目的自动化编译、测试和发布,以及检查项目的代码质量。
利器Jenkins
Jenkins源于另一个持续集成工具Hudson,Hudson在oracle收购sun以前,是开源社区在开发和维护,oracle收购sun以后声明拥有hudson的商标使用权,后来开发hudson的开源力量只能从新起个名字“Jenkins”来继续开发,原Hudson则由oracle持续维护,但更新速度比较慢。
jenkins地址:http://jenkins-ci.org/
hudson地址:http://hudson-ci.org/
能够看到hudson官网右下角oracle的版权logo。咱们这里就使用Jenkins来搭建持续集成环境。
首先从官方上下载jenkins,http://mirrors.jenkins-ci.org/war/ 能够选择不一样的版本。下载完成后放置在服务器某个目录下,cd到该目录下,执行:
java -jar jenkins.war
jenkins内置一个jetty容器,默认使用8080端口,若是你的8080被占用了,请执行:
java -jar jenkins.war --httpPort=8081
固然你也能够直接把war包放到tomcat目录下启动,这样jenkins就启动起来了。
来到这个界面咱们先作一个事情:系统配置,主要是配置maven和发布插件。
一、进入“系统管理”——>“系统设置”:
新增maven,将linux上安装好的maven配置上去。
其余保持默认配置,保存!
二、进入“系统管理”——>“管理插件”——>“高级”上传插件
上传完成以后,jenkins就具有了发布web应用到tomcat各种容器的能力。
注:deploy.hpi插件是我事先从网上下载好了,你也可使用jenkins自带的插件安装功能完成插件安装,但那个比较慢。
三、配置linux服务器上的maven,跟上篇相似你也须要配置linux服务器上的maven,使之链接到nexus私服,以及支持发布模块到nexus上。
在<settings><servers></servers></settings>节点之间添加:
1: <server>
2: <id>snapshots</id>
3: <username>deployment</username>
4: <password>123456</password>
5: </server>
6: <server>
7: <id>releases</id>
8: <username>deployment</username>
9: <password>123456</password>
10: </server>
在<settings></settings>节点之间添加:
1: <profiles>
2: <profile>
3: <id>dev</id>
4: <repositories>
5: <repository>
6: <id>local-nexus</id>
7: <url>http://192.168.0.109:8081/nexus/content/groups/public/</url>
8: <releases>
9: <enabled>true</enabled>
10: </releases>
11: <snapshots>
12: <enabled>true</enabled>
13: </snapshots>
14: </repository>
15: </repositories>
16: </profile>
17: </profiles>
18:
19: <!-- activeProfiles | List of profiles that are active for all builds. | -->
20: <activeProfiles>
21: <activeProfile>dev</activeProfile>
22: </activeProfiles>
完成这些配置,咱们就能够在jenkins上新建项目了。
咱们事先在eclipse中开发的三个项目:maven-parent(父项目,用于统一类库版本)、maven-support(后端模块,支撑web项目)、maven-sample(web项目,依赖maven-support),依次来添加:
下一步进入后,主要配置两个地址,svn和maven命令。
根据提示进行SVN用户名、密码认证便可。
对于maven-parent项目,咱们执行install命令便可。保存!
接着建立maven-support项目,因为该项目是后端模块,须要发布到nexus服务器上,因此稍有不一样:
这里须要执行deploy命令,将该项目发布到nexus上。另外你最好配置该项目构建在maven-paremt执行以后开始:
最好保存!
最好建立maven-sample项目,这是个web项目,配置又稍有不一样:
执行package命令将项目打包成war包。下面作最重要的事情:将打包后的war包自动发布到tomcat下:
注意几点:
一、WAR/EAR files,必定要填写相对地址;
二、Manager username、Manager password是你安装的tomcat用户名、密码,若是没有请经过tomcat的配置文件tomcat-users.xml设置。
三、tomcat url为你安装的tomcat访问地址。
最后仍是设置下构建顺序,让它在maven-support执行完成以后构建:
保存!
jenkins首页上就出现了三个咱们建立好的项目,咱们只须要构建maven-parent就能够了,由于咱们设置了构建顺序:
查看构建信息,能够看到构建的进程,项目先从svn更新下来,而后进行编译,运行测试用例,打包,发布的过程。整个过程都由jenkins完成,
至此jenkins就实现了自动化编译、测试(本身写测试用例)、打包发布、部署。
能够看到tomcat上已经多了maven-sample应用。
部署Sonar
从http://www.sonarqube.org/官网上下载sonar安装包,解压到系统目下,进入到bin目录下,选择你的系统版本,进入后执行:
./sonar.sh start
sonar就启动起来了,默认的端口是9000,你也能够到conf/sonar.properties配置文件中修改:
sonar.web.port: 8066
在Jenkins安装sonar插件
和安装deploy插件方法相似,咱们在系统管理——插件管理中,上传sonar插件。安装完成以后,请重启jenkins。
配置jenkins的sonar插件:
进入系统配置
根据你的状况配置sonar,我这里仅仅修改过sonar的应用端口,因此只须要配置这个,其余保留默认值。
进入特定项目配置sonar:
选择下maven版本,其余保留默认值。保存!
而后开始构建项目,构建完成后,能够看到该项目的代码检查结果已经被导入到sonar平台上,经过sonar系统就能够方便查看该项目的代码质量状况:
sonar能够检查代码的复杂度、代码重复、单元测试覆盖率、是否有注释、潜在bug等代码问题,对于sonar的项目介绍,能够进一步去研究摸索,在这里仅介绍jenkins和sonar整合的方法,能够再实际工做时进一步研究。
小结
本文主要介绍如何搭建jenkins以及怎么利用maven、deploy插件打包、发布你的项目,最后使用jenkins和sonar配合进行项目的代码质量检查。完成整个过程咱们能够发现,以往的测试、打包、发布、代码检查的工做均可以由人工转化工具来完成,让程序员的宝贵时间集中在开发上。回过头看Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)开头的故事,咱们可能会有不一样的想法。