1 Nexus安装配置

1.1 Nexus介绍

Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,常用来搭建 Maven 私仓,所以也有人将 Nexus 称为“Maven仓库管理器”。

Maven 私仓其实并不是 Maven 的核心概念,它仅仅是一种衍生出来的特殊的仓库,但这并不代表它不重要,相反由于私仓具有降低中央仓库负荷、节省外网带宽、以及提高项目稳定性等优点,使得私仓在实际开发过程中得到了相当普遍地使用。能够帮助我们建立私仓的软件被称为 Maven 仓库管理器,主要有以下 3 种:

  • · Apache Archiva
  • · JFrog Artifactory
  • · Sonatype Nexus

其中,Sonatype Nexus 是当前最流行,使用最广泛的 Maven 仓库管理器。Nexus 分为开源版和专业版,其中开源版足以满足大部分 Maven 用户的需求。Nexus 开源版具有以下特性:

  • · 占用内存小(28 M 左右)
  • · 具有基于 ExtJs 得操作界面,用户体验较好
  • · 使用基于 Restlet 的完全 REST API
  • · 支持代理仓库、宿主仓库和仓库组
  • · 基于文件系统,不需要依赖数据库
  • · 支持仓库索引以及搜索
  • · 支持在界面上上传构件
  • · 安全控制

1.2 Nexus安装

目前 Nexus 分为 Nexus 2.x 和 Nexus 3.x 两个大版本,它们是并行的关系
官网地址https://www.sonatype.com/

tar -xf nexus-3.19.1-01-unix.tar.gz -C /app/module/
ln -s /app/module/nexus-3.19.1-01/ /app/module/nexus

修改配置
vim /app/module/nexus/bin/nexus.rc
run_as_user="root"   #nexus进程运行用户

vim /app/module/nexus/etc/nexus-default.properties
#nexus监听端口
application-port=80
#nexus监听地址
application-host=0.0.0.0

1.3 Nexus启动

  • /app/module/nexus/bin/nexus start

Jenkins集成Nexus_vim

1.4 Nexus访问

http://192.168.137.130/

Jenkins集成Nexus_maven_02

初始化四部曲

Jenkins集成Nexus_vim_03

Jenkins集成Nexus_vim_04

Jenkins集成Nexus_推送_05

Jenkins集成Nexus_推送_06

1.5 Nexus报错处理

Jenkins集成Nexus_maven_07

vim /etc/security/limits.conf
添加
root soft nofile 65536
root hard nofile 65536

#重启nexus
/app/module/nexus/bin/nexus restart

1.6 配置Nexus仓库代理

配置nexus的中央仓库(加速jar包的下载以及缓存jar包)

Jenkins集成Nexus_推送_08

Jenkins集成Nexus_vim_09

滚动到最后面SAVE

2 Maven配置Nexus

2.1 修改setings.xml

#将原来的备份
cp /app/module/maven/conf/settings.xml{,.bk}

修改配置
vim /app/module/maven/conf/settings.xml
#配置nexus认证
  <servers>
    <server>
      <id>maven-snapshots</id>
      <username>admin</username>
      <password>123456</password>
    </server>
    <server>
      <id>maven-releases</id>
      <username>admin</username>
      <password>123456</password>
    </server>
    <server>
      <id>maven-central</id>
      <username>admin</username>
      <password>123456</password>
    </server>
  </servers>
#配置nexus仓库,将原先阿里云那些配置删掉
  <mirrors>
    <mirror>
      <id>maven-central</id>
      <mirrorOf>*</mirrorOf>
      <url>http://192.168.137.130/repository/maven-central/</url>
    </mirror>
    <mirror>
      <id>maven-snapshots</id>
      <mirrorOf>*</mirrorOf>
      <url>http://192.168.137.130/repository/maven-snapshots/</url>
    </mirror>
    <mirror>
      <id>maven-releases</id>
      <mirrorOf>*</mirrorOf>
      <url>http://192.168.137.130/repository/maven-releases/</url>
    </mirror>
  </mirrors>

2.2 测试打包

打包完以后,私仓已经出现依赖包

Jenkins集成Nexus_vim_10

3 上传war包到Nexus

3.1 手动上传

进入项目job目录
cd /app/jenkins/workspace/test03

上一步测试maven连接Nexus已经做过maven编译打包操作
mvn deploy:deploy-file \
-DgroupId=com.itheima \
-DartifactId=web_demo \
-Dversion=1.0 \
-Dpackaging=war \
-Dfile=target/web_demo-1.0-SNAPSHOT.war \
-Durl=http://192.168.137.130/repository/maven-releases/ \
-DrepositoryId=maven-releases \
-DgeneratePom=true
#这些配置基本上都可以在pom里面看到

特别注意
-Dversion=1.0,如果pom里面写的有中文比如<version>1.0-SNAPSHOT</version>,也要只保留数字和点
-Dversion中带着-SNAPSHOT无法上传到releases仓库,会直接报错

Jenkins集成Nexus_maven_11

3.1.1 解决releases同版本只能推送一次

snapshots推送多次相同版本的会覆盖,releases同一版本只允许推送一次

再次推送就会报错

Jenkins集成Nexus_推送_12

Jenkins集成Nexus_推送_13

保存退出,再次推送就会覆盖掉

3.2 配置pom打包自动推送

可不可以构建完自动上传

配置放在打包的pom.xml里面,注意放在project里面
  <distributionManagement>
    <repository>
      <id>maven-releases</id>
      <url>http://192.168.137.130/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
      <id>maven-snapshots</id>
      <url>http://192.168.137.130/repository/maven-snapshots/</url>
    </snapshotRepository>
  </distributionManagement>
  
打包命令
mvn clean package deploy

Jenkins集成Nexus_推送_14

解释:
<distributionManagement> 中的 <repository> 和 <snapshotsrepository>各自的含义
maven仓库分为两种 release发布仓库(<repository>) 和 snapshot快照仓库(<snapshotsrepository>)。
snapshot快照仓库用于保存开发过程中的不稳定版本。
release正式仓库用来保存稳定的发行版本。
定义一个组件/模块为快照版本  只需要在pom文件中的该模板的版本号后面加上 -SNAPSHOT就可以了。 
注意:必须是大写。
maven会根据模块的版本号(pom文件中的<version>版本号</version>)中是否带有-SNAPSHOT来判断这个是快照版本还是正式版本。

如果是快照版本:
在mvn deploy时会自动发布到快照版本库中。
而使用快照版本的模块,在不更改版本号的情况下,直接编译打包时,maven会自动从镜像服务器上下载最新的快照版本。
如果是正式发布版本:
那么在mvn deploy时会自动发布到正式版本库中。
而使用正式版本的模块,在不更改版本号的情况下,编译打包时,如果本地已经存在该版本的模块则使用本地的而不是主动去镜像服务器上下载。

3.2.1 正式版本

pom中  <version>1.0</version>

Jenkins集成Nexus_vim_15

Jenkins集成Nexus_vim_16

3.2.2 快照版本

pom中  <version>1.0-SNAPSHOT</version>

Jenkins集成Nexus_maven_17

Jenkins集成Nexus_vim_18

如果推送多次

Jenkins集成Nexus_推送_19

4 Nexus下载war包

wget --http-user=admin --http-passwd=123456 http://192.168.137.130/repository/maven-releases/com/itheima/web_demo/1.0/web_demo-1.0.war

5 Jenkins集成Nexus

5.1 Jenkins推送war包到Nexus

mkdir /app/module/script

vim /app/module/script/push_war.sh
#!/bin/bash
#通过pom获取信息
groupId=$(mvn help:evaluate -Dexpression=project.groupId | egrep -v "[INFO]")
artifactId=$(mvn help:evaluate -Dexpression=project.artifactId | egrep -v "[INFO]")
version=$(mvn help:evaluate -Dexpression=project.version | egrep -v "[INFO]")
packaging=$(mvn help:evaluate -Dexpression=project.packaging | egrep -v "[INFO]")

#上传至nexus
mvn deploy:deploy-file \
-DgroupId=${groupId} \
-DartifactId=${artifactId} \
-Dversion=${version} \
-Dpackaging=${packaging} \
-Dfile=target/${artifactId}-${version}.${packaging} \
-Durl=http://192.168.137.130/repository/maven-releases/ \
-DrepositoryId=maven-releases \
-DgeneratePom=true

chmod a+x /app/module/script/push_war.sh

Jenkins集成Nexus_vim_20

5.2 Jenkins从Nexus下载war包

5.2.1 安装插件

安装Maven Artifact ChoiceListProvider (Nexus)插件

5.2.2 创建Nexus凭据

Jenkins集成Nexus_推送_21

5.2.3 Jenkins配置参数化构建

Jenkins集成Nexus_maven_22

Jenkins集成Nexus_推送_23

Jenkins集成Nexus_vim_24

Jenkins集成Nexus_vim_25

Jenkins集成Nexus_vim_26

Jenkins集成Nexus_vim_27