设为首页 收藏本站
查看: 2075|回复: 1

[经验分享] 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)

[复制链接]

尚未签到

发表于 2015-9-10 09:13:33 | 显示全部楼层 |阅读模式
前言
      但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子。假如一个项目,由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
    03171013-a641f6b3a5f64873bb0215891f6dd851.jpg
  选择自己的系统并进入:
   03171016-98a43ead7c234e2b981052740919f565.jpg
  启动nexus
  ./nexus start
   03171017-facecf3b97e14073bf187fe684d7b786.jpg
  nexus启动成功,访问:http://192.168.6.204:8081/nexus/
   03171021-d0e8389a8c1d4a6794dcc13c07d95a3d.jpg
  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/ ... 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:
   141824371518975.jpg
   141824390586659.jpg
配置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包,都会使用相同的版本:
141824407618574.jpg
接下来我们解决协作开发的问题,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>节点之间添加:
<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/ ... leases/</url>

        </repository>

        <snapshotRepository>

            <id>snapshots</id>

            <name>快照版本仓库</name>

            <url>http://192.168.0.109:8081/nexus/ ... pshots/</url>

        </snapshotRepository>

    </distributionManagement>


3、对maven-support项目进行编译,并执行发布命令:
141824421674344.jpg
141824439176542.jpg
可以看到maven-support已经成功发布到nexus私服中:
141824452929555.jpg
141824464643098.jpg
这样maven-sample就可以引用maven-support模块,而开发maven-support的人则可以继续开发,持续发布新版本。
141824484641754.jpg
小结
    本文主要介绍maven和nexus的环境搭建,以及怎么使用maven和nexus统一管理库文件和版本,怎么讲自己的模块上传至nexus私服,供其他模块引用。这样我们基本解决了两个问题:
1、团队彼此协作不流畅,出现彼此阻塞的情况;
2、使用的类库版本不统一,造成难以估计的风险;


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-111775-1-1.html 上篇帖子: jenkins mave自动化构建问题 下篇帖子: centos6.5下,Jenkins自动部署nodeJS程序 Nexus
累计签到:133 天
连续签到:1 天
发表于 2015-9-10 14:06:47 | 显示全部楼层
Maven实战(Maven+Nexus建立私服【Linux系统】)中已经介绍过  这篇文章地址是什么?我也没搜到

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表