使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)

2015-01-14 20:28 by 飘扬的红领巾, 4322 阅读, 5 评论, 收藏编辑

前言

但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子。假如一个项目,由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几乎抓狂。

以上的例子有点夸大,但或多或少都可能遇到过,我们需要一种规范来约束这个开发过程,使开发过程严格有序的进行。

从问题出发

就以上面这个例子,我们看其中暴露出了哪些问题:

1、团队彼此协作不流畅,出现彼此阻塞的情况;

2、使用的类库版本不统一,造成难以估计的风险;

3、代码未经严格测试就上传,造成不断的返工;

4、版本发布规范欠缺,版本质量不能保证;

5、代码质量低,其他人难以接手。

团队开发时,我们常常约定好彼此之间的接口规范,然后开始各自开发,开发完成后,按照接口规范对接起来,这是一个理想的流程,但现实往往不那么顺利,问题常常在于,接口规范可能根据需求变化而经常变更,而且在实际对接时经常发现诸多问题。我们无法通过工具来解决这些问题,只能要求开发人员在制定接口规范时,为可能变更的需求多一些扩展,在开发时多考虑诸多素质,尽量将减少对接过程中的问题。下面将讲述如何使用Maven和Nexus保证开发人员引用统一的类库版本,以及如何将自己开发的模块上传至Nexus服务器,以提供给其他模块引用。

关于Maven和Nexus的搭建在Maven实战(Maven+Nexus建立私服【Linux系统】)中已经介绍过,在此介绍下主要步骤:

1、下载maven(读:妹吻)和nexus(读:耐克色儿丝):

http://maven.apache.org/download.cgi

http://nexus.sonatype.org/downloads/

2、将下载的nexus放置到linux服务器解压并启动:

cd /data/program/nexus-2.3.1-01/bin/jswll

选择自己的系统并进入:

启动nexus

./nexus start

nexus启动成功,访问:http://192.168.6.204:8081/nexus/

3、将下载的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就搭建配置完成了,下面我们要利用这个环境解决两个问题:

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>节点之间添加:

<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>

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的人则可以继续开发,持续发布新版本。

小结

本文主要介绍maven和nexus的环境搭建,以及怎么使用maven和nexus统一管理库文件和版本,怎么讲自己的模块上传至nexus私服,供其他模块引用。这样我们基本解决了两个问题:

1、团队彼此协作不流畅,出现彼此阻塞的情况;

2、使用的类库版本不统一,造成难以估计的风险;

下一篇将使用jenkins、svn、tomcat以及sonar解决自动化测试、自动化版本发布、代码质量检查等问题。

使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)

2015-01-19 01:22 by 飘扬的红领巾, 4030 阅读, 4 评论, 收藏编辑

前言

上一篇随笔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和发布插件。

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整合的方法,可以再实际工作时进一步研究。

小结

本文主要介绍如何搭建jenkins以及怎么利用maven、deploy插件打包、发布你的项目,最后使用jenkins和sonar配合进行项目的代码质量检查。完成整个过程我们可以发现,以往的测试、打包、发布、代码检查的工作都可以由人工转化工具来完成,让程序员的宝贵时间集中在开发上。回过头看Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)开头的故事,我们可能会有不同的想法。

Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境的更多相关文章

  1. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)

    前言     上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...

  2. Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)

    上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库文件和版本,以 ...

  3. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境

    前言 但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子.假如一个项目,由A.B两位程序员来协作开发,A负责前端模块,B负责后端模块,前端依赖后端.A和B都习 ...

  4. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)

    前言     但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子.假如一个项目,由A.B两位程序员来协作开发,A负责前端模块,B负责后端模块,前端依赖后端.A ...

  5. Docker+Jenkins+Maven+SVN搭建持续集成环境

    Docker+Jenkins+Maven+SVN搭建持续集成环境 环境拓扑图(实验项目使用PHP环境) 发布流程图 环境说明 系统:Centos 7.4 x64 Docker版本:18.09.0 Ma ...

  6. Hudson+Maven+Svn搭建持续集成环境

    Hudson+Maven+Svn搭建持续集成环境 博客分类: 配置管理 mavenSVNTomcat项目管理配置管理 一.所用开发工具 1.    Hudson: Hudson 是一种革命性的开放源码 ...

  7. 用MSBuild和Jenkins搭建持续集成环境(2)

    http://www.infoq.com/cn/articles/MSBuild-2   作者 Mustafa Saeed Haji Ali ,译者 李剑 发布于 2012年10月23日 | 注意:  ...

  8. 基于 Jenkins 快速搭建持续集成环境--转

    源地址:http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/ 持续集成是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础 ...

  9. Jenkins 快速搭建持续集成环境

    持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域 ...

随机推荐

  1. SpringBoot整合Quartz定时任务 系统job Spring Boot教程 调度任务

    原文地址:https://www.cnblogs.com/allalongx/p/8477368.html 构建工程 创建一个Springboot工程,在它的程序入口加上@EnableScheduli ...

  2. Java语言:JAVA8 十大新特性详解(zz)

    关键词: Lambda表达式.函数式接口.方法与构造函数引用.接口的默认方法 原文地址: http://www.jb51.net/article/48304.htm 本教程将Java8的新特新逐一列出 ...

  3. (十一) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  4. android 框架层 常用类介绍

    名称 功能描述 示意图 activitymanager 管理应用程序的周期并提供常用的回退功能 window manager 窗口管理者 content provider 用于访问另一个的数据,或者共 ...

  5. Eclipse里选一个变量后,这个类里的该变量不变色了

    使用“Alt+Shift+O”对该提示功能的开/关切换

  6. 什么是JSP (转)

    http://blog.csdn.net/javaloveiphone/article/details/7937170 一.什么是JSP(JavaServer Pages),原来是没有jsp的,只有s ...

  7. This is a bug I believe, and it took me 2-3 days to figure it out. Please do the following to get it working,

    This is a bug I believe, and it took me 2-3 days to figure it out. Please do the following to get it ...

  8. GPUImage API文档之GPUImageFramebuffer类

    GPUImageFramebuffer类用于管理帧缓冲对象,负责帧缓冲对象的创建和销毁,读取帧缓冲内容 属性 @property(readonly) CGSize size 说明:只读属性,在实现中, ...

  9. Auty 2017——WebMonitor接口本地检测平台

    转载:http://www.cnblogs.com/LanTianYou/p/6272484.html#_label0_0 目录 2016Auty诞生 2017一个新的开始 WebMonitor接口本 ...

  10. (纪录片)数学的故事 The Story of Maths (2008)

    简介: 导演: Robin Dashwood编剧: Marcus du Sautoy主演: Marcus du Sautoy类型: 纪录片官方网站: www.bbc.co.uk/programmes/ ...