使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环
来源:未知 时间:2021-28-16 浏览次数:241次
持续集成环境和持续化构建技术是比较新的IT技术,主要借助于第三方开源组件,持续化构建技术主要解决了大型团开发的协作问题,例如,代码的冲突,代码合并,重复的代码调试与发布,甚至基本的代码测试,通过将重复的工作利用程序处理以降低开发成本,解放劳动力
一、持续化构建能解决如下问题
1、团队彼此协作不流畅,出现彼此阻塞的情况;
2、使用的类库版本不统一,造成难以估计的风险;
3、代码未经严格测试就上传,造成不断的返工;
4、版本发布规范欠缺,版本质量不能保证;
5、代码质量低,其他人难以接手。
二、使用nexus搭建maven本地仓库:
1、下载maven(读:妹吻)和nexus(读:耐克色儿丝):
http://maven.apache.org/download.cgi
http://nexus.sonatype.org/downloads/
2、将下载的nexus放置到linux服务器解压并启动:
选择自己的系统并进入:
启动nexus
./nexus start
nexus启动成功,访问:http://192.168.6.204:8081/nexus/
3、将下载的maven解压放置在开发机上(windows),并配置conf目录下的setting.xml文件:
(1)在<settings><profiles></profiles></settings>节点之间添加配置:
接着在<settings></settings>节点之间添加配置:
以上配置好了连接Nexus私服。
(2)安装eclipse的m2eclipse插件,并配置maven。
m2eclipse的安装地址:http://m2eclipse.sonatype.org/sites/m2e(安装过程略)
安装完成后配置maven:
配置eclipse的maven为本地下载的maven地址。主要为了方便配置和版本管理。
至此,nexus和maven就搭建配置完成了,下面我们要利用这个环境解决两个问题:
1、不同的模块项目都使用统一的类库版本;如spring都使用3.1.2.RELEASE,log4j都使用1.2.17。这样避免因为jar包版本的不同,引发的诸多问题。
2、模块开发完毕后,将编译的库文件发布到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步:
1、本地maven的conf目录下的setting.xml,在<servers></servers>节点之间添加:
2、在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>
3、对maven-support项目进行编译,并执行发布命令:
可以看到maven-support已经成功发布到nexus私服中:
这样maven-sample就可以引用maven-support模块,而开发maven-support的人则可以继续开发,持续发布新版本。
四、利器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和发布插件。
1、进入“系统管理”——>“系统设置”:
新增maven,将linux上安装好的maven配置上去。
其他保持默认配置,保存!
2、进入“系统管理”——>“管理插件”——>“高级”上传插件
上传完成之后,jenkins就具备了发布web应用到tomcat各类容器的能力。
注:deploy.hpi插件是我事先从网上下载好了,你也可以使用jenkins自带的插件安装功能完成插件安装,但那个比较慢。
3、配置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下:
注意几点:
1、WAR/EAR files,一定要填写相对地址;
2、Manager username、Manager password是你安装的tomcat用户名、密码,如果没有请通过tomcat的配置文件tomcat-users.xml设置。
3、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整合的方法,可以再实际工作时进一步研究。