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

前言

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

选择自己的系统并进入:

启动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配置为:

   1:  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   2:    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   3:    <modelVersion>4.0.0</modelVersion>
   4:    <groupId>com.cnblogs.leefreeman</groupId>
   5:    <artifactId>maven-parent</artifactId>
   6:    <version>0.0.1-SNAPSHOT</version>
   7:    <packaging>pom</packaging>
   8:    <properties>
   9:            <!-- junit -->
  10:            <junit.version>4.10</junit.version>
  11:          <!-- servlet -->
  12:          <servlet-api.version>2.5 </servlet-api.version>
  13:          <!-- log4j -->
  14:          <log4j.version>1.2.17 </log4j.version>
  15:          <!-- commons.codec -->
  16:          <commons.codec.version>1.7</commons.codec.version>
  17:      </properties>
  18:      <dependencyManagement>
  19:          <dependencies>
  20:              <!-- junit -->
  21:              <dependency>
  22:                  <groupId>junit</groupId>
  23:                  <artifactId>junit</artifactId>
  24:                  <version>${junit.version}</version>
  25:                  <scope>test</scope>
  26:              </dependency>
  27:              <!-- log4j -->
  28:              <dependency>
  29:                  <groupId>log4j</groupId>
  30:                  <artifactId>log4j</artifactId>
  31:                  <version>${log4j.version}</version>
  32:              </dependency>
  33:              <!-- commons包 -->
  34:              <dependency>
  35:                  <groupId>commons-codec</groupId>
  36:                  <artifactId>commons-codec</artifactId>
  37:                  <version>${commons.codec.version}</version>
  38:              </dependency>
  39:              <!--  servlet -->
  40:              <dependency>
  41:                  <groupId>javax.servlet</groupId>
  42:                  <artifactId>servlet-api</artifactId>
  43:                  <version>${servlet-api.version}</version>
  44:                  <scope>provided</scope>
  45:              </dependency>
  46:          </dependencies>
  47:      </dependencyManagement>
  48:  </project>

这个pom定义了一些类库以及它的版本。

然后再建立模块项目:maven-sample(web项目)、maven-support(支撑模块,包括一些工具类以及业务封装,提供给maven-sample引用)。

maven-sample的pom.xml:

   1:  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   2:      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   3:      <modelVersion>4.0.0</modelVersion>
   4:      <parent>
   5:          <groupId>com.cnblogs.leefreeman</groupId>
   6:          <artifactId>maven-parent</artifactId>
   7:          <version>0.0.1-SNAPSHOT</version>
   8:      </parent>
   9:      <artifactId>maven-sample</artifactId>
  10:      <packaging>war</packaging>
  11:      <dependencies>
  12:          <dependency>
  13:              <groupId>junit</groupId>
  14:              <artifactId>junit</artifactId>
  15:          </dependency>
  16:          <dependency>
  17:              <groupId>log4j</groupId>
  18:              <artifactId>log4j</artifactId>
  19:          </dependency>
  20:          <dependency>
  21:              <groupId>commons-codec</groupId>
  22:              <artifactId>commons-codec</artifactId>
  23:          </dependency>
  24:          <dependency>
  25:              <groupId>javax.servlet</groupId>
  26:              <artifactId>servlet-api</artifactId>
  27:          </dependency>
  28:      </dependencies>
  29:      <build>
  30:          <finalName>maven-sample</finalName>
  31:      </build>
  32:  </project>

maven-support的pom.xml:

   1:  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   2:      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   3:      <modelVersion>4.0.0</modelVersion>
   4:      <parent>
   5:          <groupId>com.cnblogs.leefreeman</groupId>
   6:          <artifactId>maven-parent</artifactId>
   7:          <version>0.0.1-SNAPSHOT</version>
   8:      </parent>
   9:      <artifactId>maven-support</artifactId>
  10:      <packaging>jar</packaging>
  11:      <dependencies>
  12:          <dependency>
  13:              <groupId>junit</groupId>
  14:              <artifactId>junit</artifactId>
  15:          </dependency>
  16:          <dependency>
  17:              <groupId>log4j</groupId>
  18:              <artifactId>log4j</artifactId>
  19:          </dependency>
  20:          <dependency>
  21:              <groupId>commons-codec</groupId>
  22:              <artifactId>commons-codec</artifactId>
  23:          </dependency>
  24:      </dependencies>
  25:  </project>

通过以上配置,maven-sample和maven-support引用的jar包,都会使用相同的版本:

接下来我们解决协作开发的问题,maven-support开发完毕之后,将之发布到nexus服务器,以便maven-sample可以引用。我们需要3步:

1、本地maven的conf目录下的setting.xml,在<servers></servers>节点之间添加:

   1:  <server> 
   2:  <id>releases</id>
   3:  <username>admin</username>
   4:  <password>admin123</password>
   5:  </server>
   6:  <server>
   7:  <id>snapshots</id>
   8:  <username>admin</username>
   9:  <password>admin123</password>
  10:  </server>

2、在maven-support项目的pom.xml中,<project></project>节点之间添加:

<!-- 构件部署仓库 -->
    <distributionManagement>
        <repository>
            <id>releases</id>
            <name>发布版本仓库</name>
            <url>http://192.168.6.204:8081/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <name>快照版本仓库</name>
            <url>http://192.168.6.204: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、使用的类库版本不统一,造成难以估计的风险;

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

时间: 2024-10-23 10:42:52

使用Maven+Nexus+Hudson+Svn+Tomcat+Sonar搭建持续集成环境(一)的相关文章

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

前言     上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库文件和版本,以及怎么将自己的模块上传至nexus私服,供其他模块引用.下面将主要介绍如何利用Jenkins.SVN.Tomcat以及Sonar来完成项目的自动化编译.测试和发布,以及检查项目的代码质量. 利器Jenkins     Jenkins源于另外一个持续集成工具Hudson,Hudson在o

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

转载:http://www.cnblogs.com/leefreeman/p/4226978.html 前言 上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库文件和版本,以及怎么将自己的模块上传至nexus私服,供其他模块引用.下面将主要介绍如何利用Jenkins.SVN.Tomcat以及Sonar来完成项目的自动化编译.测试和发布,以及检查项目的代码质量.

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

前言 但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子.假如一个项目,由A.B两位程序员来协作开发,A负责前端模块,B负责后端模块,前端依赖后端.A和B都习惯使用SVN作为代码管理工具,他们分别开始工作,一个功能完成后会提交到SVN,以便对方能够使用.一天B告诉A,我的某个功能完成了,提交到SVN,你更新下来试一下.A便从SVN更新下来代码,结果一试,我檫报错,于是告诉B你的代码有问题,B检查了一下确实有问题,然后B经过1个小时修改后,重新上传到SVN

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

http://www.infoq.com/cn/articles/MSBuild-2 作者 Mustafa Saeed Haji Ali ,译者 李剑 发布于 2012年10月23日 | 注意: 挥一挥衣袖,带走满满干货,关注活动大本营,时不时发福利呦!3 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件分享 稍后阅读 我的阅读清单 这是持续集成系列的下半部分,如果你还没看过上半部分的话,请点击这里:用MSBuild和Jenkins搭建持续集成环境(1). 与Jenkins相会

jenkins + Git 搭建持续集成环境

jenkins + Git 搭建持续集成环境 持续集成通过自动化构建.自动化测试以及自动化部署加上较高的集成频率保证了开发系统中的问题能迅速被发现和修复,降低了集成失败的风险,使得系统在开发中始终保持在一个稳定健康的集成状态.jenkins是目前广泛应用的持续集成工具,本文记录我使用jenkins+Git配置持续集成环境的整个流程以及踩到的坑(jenkins过程的坑往往不是在第一次配置,而是在配置结束后更改某些配置项的时候踩到). 总体流程如下: tomcat8.0下载地址:http://tom

基于 Jenkins 快速搭建持续集成环境

持续集成是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础.Jenkins 是一个开源软件项目,旨在提供一个开放易用的软件平台,使持续集成变成可能.本文正是从持续集成的基本概念入手,通过具体实例,介绍了如何基于 Jenkins 快速搭建持续集成环境. 持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变

Jenkins 快速搭建持续集成环境

持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要. 持续集成正是针对这一类问题的一种软件开发实践.它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成.而每次的集成都是通过自动化的构建来验证,包括自动编译.发布和测试,从而尽快地发现集成错误,让团队能够更快

[转] 基于Gitlab CI搭建持续集成环境

[From] https://blog.csdn.net/wGL3k77y9fR1k61T1aS/article/details/78798577 前言 本文是在12月12号迅雷@赵兵在前端早读课第三期Live中提到的关于CI构建的,可能这部分在不同公司由不同的岗位负责,刚好如果你没遇到你可以看看. @赵兵,来自迅雷前端团队.是一个热爱前端技术,喜欢造轮子,爱折腾的人,也是一个奉行"懒惰使人进步"的懒人工程师. 正文从这开始- 本文简单介绍了持续集成的概念并着重介绍了如何基于 Gitl

Jenkins+Maven+SVN快速搭建持续集成环境(转)

Jenkins是一个可扩展的持续集成引擎,Jenkins非常易于安装和配置,简单易用,下面看看我们是如何几分钟就快速搭建一个持续集成环境吧. 假设我们目前已经有2个maven项目:entities(JAVA类库),web(Web应用,依赖entities). 一.安装Jenkins 地址http://mirrors.jenkins-ci.org/下载适合的Jenkins版本. Windows最新稳定版的Jenkins地址为:http://mirrors.jenkins-ci.org/window