• 使用Maven+Nexus+Jenkins+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/jswll

    image

    选择自己的系统并进入:

    image

    启动nexus

    ./nexus start

    image

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

    image

    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:

    image

    image

    配置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包,都会使用相同的版本:

    image

    接下来我们解决协作开发的问题,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项目进行编译,并执行发布命令:

    image

    image

    可以看到maven-support已经成功发布到nexus私服中:

    image

    image

    这样maven-sample就可以引用maven-support模块,而开发maven-support的人则可以继续开发,持续发布新版本。

    image

    小结

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

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

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

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

  • 相关阅读:
    How to change hostname on SLE
    How to install starDIct on suse OS?
    python logging usage
    How to reset password for unknow root
    How to use wget ?
    How to only capute sub-matched character by grep
    How to inspect who is caller of func and who is the class of instance
    How to use groovy script on jenkins
    Vim ide for shell development
    linux高性能服务器编程 (二) --IP协议详解
  • 原文地址:https://www.cnblogs.com/duyinqiang/p/5696469.html
Copyright © 2020-2023  润新知