一、背景介绍
随着互联网的普及,项目的规模不断扩大,持续集成变的相当重要。
当项目的规模变大,动辄几十个项目要维护的时候,就会给开发、部署、集成测试带来极大的挑战。
二、maven简单介绍
maven主要用途为项目构建、依赖管理、项目信息管理。
简单安装:下载maven http://maven.apache.org/download.cgi,配置环境变量 MAVEN_HOME为maven安装目录,PATH环境变量最后附加上";%MAVEN_HOME%\bin"。
打开cmd,输入mvn -v。基本用法这里不过多介绍了。
maven版本介绍:
1、快照版本(SNAPSHOT)和正式版本(RELEASE),如果是快照版本在编译打包时会自动去maven仓库上下载最新的版本,而如果是稳定版本,则不会重新下载。这也是一些项目中,定义了一些基础组件为稳定版本,在做过一些修改后没有升级版本号导致其他开发人员更新不到。通常解决办法为删除本地仓库中已有的稳定版本或者升级版本号。
2、关于选择版本的问题,SNAPSHOT版本的库是一直在变化的是一个不稳定因素,RELEASE则为不可变化的,有些人会在在maven私服设置redeploy属性为true,这样会让RELEASE版本也不在稳定,这是通常没有问题,一旦因为版本问题引发事故就会给排查带来极大的麻烦。
maven生命周期简介:
- 验证(validate) - 验证项目是否正确,所有必要的信息可用
- 编译(compile) - 编译项目的源代码
- 测试(test) - 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求代码被打包或部署
- 打包(package) - 采用编译的代码,并以其可分配格式(如JAR)进行打包。
- 验证(verify) - 对集成测试的结果执行任何检查,以确保满足质量标准
- 安装(install) - 将软件包安装到本地存储库中,用作本地其他项目的依赖项
- 部署(deploy) - 在构建环境中完成,将最终的包复制到远程存储库以与其他开发人员和项目共享。
针对不同的生命周期,maven可以加入不同的插件(自定义插件和类库中的插件)来达到特殊的功能。这个插件就让打包时,依赖和项目分离同事指定main方法,这种做法方便抽离公共依赖(对版本管理有一点要求)。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<useUniqueVersions>false</useUniqueVersions>
<addClasspath>true</addClasspath>
<classpathPrefix>dependency/</classpathPrefix>
<mainClass>com.XXXX.XXXX.XXXX</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
坐标介绍:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
1、groupId:定义当前maven项目隶属实际项目。maven项目和实际项目不一定是一对一的关系。比如spring项目。
2、artifactId:该元素定义项目中的一个模块。
3、version:该元素定义相关的版本信息。
4、还有一些其他属性就不一一列出了(如scope等)。
那么这个依赖在本地仓库中位置为:本地仓库位置\groupId\artifactId\version。比如本地仓库位置\org\springframework\spring-core\4.0.5.RELEASE
安装好maven 后需要修改对应的settings文件,这里就不介绍了。
三、maven 私服nexus
1、maven仓库:
1)本地仓库:通常在maven项目中没有传统的 lib\来存放依赖。当maven执行命令时,如果需要使用这些依赖,它会基于依赖坐标在本地仓库中查找依赖文件。
2)远程仓库:通常一个项目需要依赖很多三方类库,但是我们的本地仓库默认是空的,这个时候通常是需要一个远程仓库去下载这些依赖到本地仓库。
常用的中央仓库:http://mvnrepository.com/,http://maven.aliyun.com/nexus/content/groups/public/。
3)私服:私服是一种特殊的远程仓库,它通常架设在局域网内代理远程仓库。一些无法从远程仓库上下载到的依赖可以统一上传到私服上供项目组使用。
2、私服(nexus)介绍
1) maven的私服有很多,本文介绍nexus。私服不是maven的核心概念,使用私服可以降低中央仓库的负荷、节省外网带宽、加速构建maven、部署自己的maven构件。
2) 下载nexus https://www.sonatype.com/download-oss-sonatype windows版。版本可自行选择解压nexus-2.12.0-01-bundle.zip,另一个不是必须的在启动时会自动生成。
3) 找到安装目录D:\soft\nexus-2.12.0-01\bin\jsw\windows-x86-64以管理员身份运行start-nexus.bat,D:\soft\nexus-2.12.0-01\conf\nexus.properties可以修改启动端口等信息。
启动成功后访问localhost:8081/nexus。见到如下图:
、 4)默认登录用户名密码admin/admin123 。nexus默认包含了group(仓库组)、host(宿主)、proxy(代理)和virtual(虚拟)。每个仓库有一个policy,表示该仓库为release版本或snapshot版本。客户端会根据需要从仓库组中的不同仓库去下载对应的依赖。
画个图方便大家理解:
安装好后nexus已经为我们创建了一些默认的仓库,如release宿主仓库,我们就可以通过最后的artifact upload上传jar包,也可以通过命令
mvn deploy:deploy-file -DgroupId=坐标名-DartifactId=坐标名 -Dversion=版本 -Dpackaging=jar -Dfile=jar包位置 -Durl=http://localhost:8081/nexus/content/repositories/loan-release -DrepositoryId=仓库id
让我们看一下仓库组:右边的添加顺序决定了仓库的检索顺序,通常常用的仓库会配置在前面。
修改本地settings配置,通过镜像的方式使nexus仓库组生效:
<servers> <server> <id>nexus</id> <username>admin</username> <password>admin123</password> </server> </servers> <mirrors> <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <name>Nexus Mirror.</name> <url>http://localhost:8081/nexus/content/groups/public/</url> </mirror> </mirrors>
简单windows版的nexus就搭建好了。
四、jenkins持续构建
1、jenkins的前身为hubson,它可以为我们带来的主要功能如下:
1)持续编译:当有代码提交时(svn或git),jenkins可配置为自动触发去编译新生成的代码。
2)持续测试:现在大多项目都测试都使用JUnit之类的框架,jenkins可以在集成的过程中运行这些测试案例并生成报告。
3)持续部署:在完成集成后jenkins同时支持自动发布到指定环境。
2、下载windows版本 https://jenkins.io/download/ 直接安装即可,初始化过程中我们选择默认安装一下插件也可以后面自行添加,jenkins默认启动端口为8080可修改根目录下的jenkins.xml
安装示意图,完成后我们使用admin用户登录。
3、首先配置一些全局属性。点击系统管理->Global Tool Configuration,配置jdk,git(可以通过git version,where is git 查看安装目录),maven的安装目录。
点击系统管理->管理插件,找到并安装maven插件
安装publish over ssh插件(通过ssh的方式将项目部署到远程服务器),
4、创建maven项目
1)点击开始创建一个新任务。
2)选中构建一个maven项目。
3)选择源码管理中的git,Credentials为添加用户名密码,比如我们使用gitlab时需要输入。
4)找到build选项,输入clean package 即maven清除 打包命令,点击保存。(这里我们就不配置自动部署了通常使用publish over ssh方式)
5)点击构建按钮。
红色状态为失败,蓝色为成功,
点击控制台输出可以看到本次编译的具体信息。
构建完的项目在工作空间中,点击即可下载。
6)自动部署有很多种形式这里并没有配置,常用的有通过shell脚本和publish over ssh, 也可以在服务器上通过wget方式取到工作空间中的jar或者war进行部署。
五、总结
本文为一个简单入门,无论是maven、jenkins、nexus、git都不是可以一下学会的,都需要更多的学习和练习才能熟练使用。