Nexus

481 阅读6分钟

一、简介

Sonatype Nexus 软件仓库服务器,官网:help.sonatype.com/repomanager…

可以作为Maven私服,也支持npm仓库、nuget仓库、ruby仓库、docker镜像仓库等。

二、安装

2.1 Windows

  1. 下载路径:help.sonatype.com/repomanager…
  2. 解压即可
  3. bin目录下,使用nexus.exe/run启动

etc/nexus-default.properties可以修改默认配置信息,例如端口号。

  1. 访问地址:http://localhost:8081/
  • 2.x的版本,初始账户密码是adminadmin123
  • 3.x的版本,初始账户是admin,密码在sonatype-work\nexus3\admin.password文件里

2.2 Docker

  1. 创建docker-compose.yml文件
version: '3.1' # Docker Compose文件版本,使用版本3.1

services: # 定义服务列表
  nexus3: # 定义Nexus服务
    container_name: nexus3 # 指定nexus容器名称
    image: sonatype/nexus3 # 镜像
    ports:
      - 8081:8081 # 端口映射(GUI界面端口)
      - 8082:8082 # docker端口映射(如果有需要通过端口上传的仓库类型,则需要开放端口)
    environment:         # 设置环境变量,用于配置Nexus。
      - "NEXUS_CONTEXT="   # 可选,设置Nexus的上下文路径(如果有反向代理等情况时使用)。
      - "NEXUS_DATA=/nexus-data"  # 设置Nexus数据的存储路径。
      - "NEXUS_ADMIN_PASSWORD=admin123"  # 设置Nexus管理员密码(请更改为更安全的密码)。
      - "NEXUS_SECURITY_RANDOMPASSWORD=false"  # 可选,设置为false以禁止在启动时随机生成密码。
    volumes:
      - nexus-data:/nexus-data # 将数据挂载到容器路径
    restart: always
    mem_limit: 2g # 限制容器内存2GB

volumes:
  nexus-data # 定义nexus-data的数据卷
  1. 启动nexus3服务:docker-compose up -d
  2. 获取默认密码:
# 进入容器
docker-compose exec nexus3 /bin/bash

# 获取密码
cat /opt/sonatype/sonatype-work/nexus3/admin.password
  1. 访问:http://localhost:8081/

三、界面使用

3.1 仓库

3.1.1 对象存储 Blob Stores

系统默认自带 default 对象存储,可以自行添加新的对象存储,这里添加一个docker存储docker镜像。

注意:需要设置大小限制,否则容易把硬盘撑爆。

3.1.2 清理策略 Cleanup Policies

有三种规则:

  1. 按照组件上传时间,清理多少天前的组件
  2. 按照组件使用时间,也就是最后下载时间,清理多少天内没有被触发下载的组件
  3. 按照正则规则匹配asset name进行清理。

3.1.3 仓库配置 Repositories

  1. 仓库类型
  • proxy(代理):代理仓库就是对远程仓库的一种代理,从远程仓库下载构件和插件然后缓存在Nexus仓库中,这个仓库是只读的。
  • hosted(宿主/托管):宿主仓库主要用于存放项目部署的构件、或者第三方构件用于提供下载。主要存放内部系统的一些api包。
  • group(仓库组):仓库的一种组合策略,并不存在实在意义的依赖,只是作为一种中转站的作用存在。只读仓库,组合proxy、hosted等仓库。

  1. Nexus内置仓库类型
  • maven-central:代理中央仓库、策略为Release、只会下载和缓存中央仓库中的发布版本构件。
  • maven-releases:策略为Release的宿主仓库、用来部署组织内部的发布版本内容。
  • maven-snapshots:策略为Snapshot的宿主仓库、用来部署组织内部的快照版本内容。
  • maven-public:该仓库将上述所有策略为Release的仓库聚合并通过一致的地址提供服务。
  • nuget-hosted:用来部署nuget构件的宿主仓库
  • nuget.org-proxy:代理nuget远程仓库,下载和缓冲nuget构件。
  • nuget-group:该仓库组将nuget-hosted与nuget.org-proxy仓库聚合并通过一致的地址提供服务。
  • maven-public:该仓库组将maven-central,maven-releases与maven-snapshots仓库聚合并通过一致的地址提供服务。
  1. 支持的仓库内容

3.1.3.1 maven2(proxy) 仓库

代理仓库一般都是代理外部开源仓库,首次编译引用仓库中的lib时,Nexus3会通过代理仓库获取lib转发到项目,并且缓存到服务器上,下次即可直接从私服的缓存中获取。

  1. 名称,这是仓库标识。
  2. 版本策略,选择默认的Release,因为我们假定要代理的都是正经Maven仓库。必要时也可选择Mixed。
  3. 布局策略(校验maven格式),选择宽容,因为如果选择严格,有时候会出现莫名的问题。
  4. 远程存储,也就是所代理的服务器。
  5. Auto blocking enabled:✔则表示:如果检测到远程对等点不可达/无响应,则自动阻止存储库上的出站连接。
  6. Maximum component age:重新比对本地缓存和远程仓库,Release版本策略情况下默认为-1。
  7. Maximum metadata age:检测远程仓库前,缓存元数据的时间。
  8. Blob store:对象存储的位置,选择default,也就是系统默认存储。
  9. Strict Content Type Validation:验证上传到此存储库的所有内容都是适合于存储库格式的MIME类型
  10. Not found cache enabled:是否对请求不在代理仓库中响应进行缓存
  11. Not found cache TTL:缓存过期时间

3.1.3.2 maven2(hosted)仓库

用于存储公司内部服务依赖,需要配置权限。

  1. 名称,这是仓库标识。
  2. 版本策略,正式版的选择Release。如果是用来测试的仓库,则选择Snapshot。
  3. 布局策略:Strict,选择严格模式。
  4. Blob store:对象存储的位置,选择default,也就是系统默认存储。
  5. Deployment policy:发布策略,Snapshot情况下选择Allow redeploy,允许多次部署。

3.1.3.3 maven(group)

  1. Online:允许接收外来请求
  2. Strict Content Type Validation:验证上传到此存储库的所有内容都是适合于存储库格式的MIME类型
  3. Member repositories:选择分配为同组的成员,会按照顺序从上到下依次访问。

3.2 系统

3.2.1 能力配置 Capabilitied

主要是新增或修改服务器的基础URL,如果放到外网,用到反向代理的时候需要设置这个。

3.2.2 HTTP配置 HTTP

用来配置HTTP连接超时和重试的,如果网络不好,可以设置得宽松一点。

3.2.3 系统任务 Task

一些定时任务,统计磁盘,定时清理之类的。

四、上传jar包到仓库

4.1 settings配置私服

<?xml version="1.0" encoding="UTF-8"?>
<settings
  xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- 设置本地仓库路径 -->
  <localRepository></localRepository>
  <pluginGroups></pluginGroups>
  <proxies></proxies>
  <!-- 服务器 用户名密码配置 -->
  <servers>
    <server>
      <id>release</id>
      <username>账号</username>
      <password>密码</password>
    </server>
    <server>
      <id>snapshots</id>
      <username>账号</username>
      <password>密码</password>
    </server>
  </servers>
  <!-- 镜像配置,阿里云 -->
  <mirrors>
    <mirror>
      <id>nexus-aliyun</id>
      <mirrorOf>central</mirrorOf>
      <name>Nexus aliyun</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
  </mirrors>
  <!-- 环境配置,多款环境,多套配置 -->
  <profiles>
    <!-- default 环境 -->
    <profile>
      <id>default</id>
      <repositories>
        <repository>
          <id>release</id>
          <name>release</name>
          <url>http://127.0.0.1:8081/repository/maven-public/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </repository>
        <repository>
          <id>snapshots</id>
          <name>snapshots</name>
          <url>http://127.0.0.1:8081/repository/maven-snapshots/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </repository>
      </repositories>
      <properties>
        <repository.id>release</repository.id>
        <repository.name>release</repository.name>
        <repository.url>http://127.0.0.1:8081/repository/maven-public/</repository.url>
        <repository-snapshots.id>snapshots</repository-snapshots.id>
        <repository-snapshots.name>snapshots</repository-snapshots.name>
        <repository-snapshots.url>http://127.0.0.1:8081/repository/maven-snapshots/</repository-snapshots.url>
      </properties>
    </profile>
    <!-- 开发环境 -->
    <profile>
      <id>dev</id>
      <repositories>
        <repository>
          <id>release</id>
          <name>release</name>
          <url>http://127.0.0.1:8081/repository/nexus-service-dev/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </repository>
        <repository>
          <id>snapshots</id>
          <name>snapshots</name>
          <url>http://127.0.0.1:8081/repository/nexus-service-dev-snapshots/</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </repository>
      </repositories>
      <properties>
        <repository.id>release</repository.id>
        <repository.name>release</repository.name>
        <repository.url>http://127.0.0.1:8081/repository/maven-snapshots/</repository.url>
        <repository-snapshots.id>snapshots</repository-snapshots.id>
        <repository-snapshots.name>snapshots</repository-snapshots.name>
        <repository-snapshots.url>http://127.0.0.1:8081/repository/nexus-service-dev-snapshots/</repository-snapshots.url>
      </properties>
    </profile>
    <!-- 测试环境 -->
    <profile>
      <id>test</id>
      <repositories>
        <repository>
          <id>release</id>
          <name>release</name>
          <url>http://127.0.0.1:8081/repository/nexus-service-test/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </repository>
        <repository>
          <id>snapshots</id>
          <name>snapshots</name>
          <url>http://127.0.0.1:8081/repository/nexus-service-test-snapshots/</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </repository>
      </repositories>
      <properties>
        <repository.id>release</repository.id>
        <repository.name>release</repository.name>
        <repository.url>http://127.0.0.1:8081/repository/nexus-service-test/</repository.url>
        <repository-snapshots.id>snapshots</repository-snapshots.id>
        <repository-snapshots.name>snapshots</repository-snapshots.name>
        <repository-snapshots.url>http://127.0.0.1:8081/repository/nexus-service-test-snapshots/</repository-snapshots.url>
      </properties>
    </profile>
    <!-- release环境 -->
    <profile>
      <id>release</id>
      <repositories>
        <repository>
          <id>release</id>
          <name>release</name>
          <url>http://127.0.0.1:8081/repository/nexus-service-release/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </repository>
        <repository>
          <id>snapshots</id>
          <name>snapshots</name>
          <url>http://127.0.0.1:8081/repository/nexus-service-test-snapshots/</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </repository>
      </repositories>
      <properties>
        <repository.id>release</repository.id>
        <repository.name>release</repository.name>
        <repository.url>http://127.0.0.1:8081/repository/nexus-service-release/</repository.url>
        <repository-snapshots.id>snapshots</repository-snapshots.id>
        <repository-snapshots.name>snapshots</repository-snapshots.name>
        <repository-snapshots.url>http://127.0.0.1:8081/repository/nexus-service-test-snapshots/</repository-snapshots.url>
      </properties>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>default</activeProfile>
  </activeProfiles>
</settings>

4.2 手动上传

# jar包上传
mvn deploy:deploy-file -s D:\settings.xml -DgroupId=org.example -DartifactId=test-case-core -Dversion=2.8.1.RELEASE -Dpackaging=jar -DpomFile=D:\food\test-case-core-2.8.1.RELEASE.pom -Dfile=D:\food\test-case-core-2.8.1.RELEASE.jar -Durl=http://127.0.0.1:8081/repository/nexus-service-dev/ -DrepositoryId=dev -X

# pom文件上传
mvn deploy:deploy-file -s D:\settings.xml -DgroupId=org.example -DartifactId=test-case-core -Dversion=2.8.1.RELEASE -Dpackaging=pom -Dfile=D:\test-case-core-2.8.1.RELEASE.pom -Durl=http://127.0.0.1:8081/repository/nexus-service-dev-snapshots -DrepositoryId=dev -X
命令说明
-DgroupId=org.example依赖分组
-DartifactId=test-case-core组件名
-Dversion=2.8.1.RELEASE版本号
-Dpackaging=jar上传的类型是jar类型
-DpomFile=D:\food\test-case-core-2.8.1.RELEASE.pompom文件位置
-Dfile=D:\food\test-case-core-2.8.1.RELEASE.jarjar的本地磁盘位置
-Durl=http://127.0.0.1:8081/repository/nexus-service-dev/hosted资源库的地址
-DrepositoryId=devsetting.xml文件中配置的ID
-Xdebug模式

4.3 IDEA上传

<!--包依赖管理工具-->
<distributionManagement>
  <repository>
    <id>release</id>
    <name>Nexus Release Repository</name>
    <url>http://localhost:8081/repository/maven-releases/</url>
  </repository>
  <snapshotRepository>
    <id>snapshots</id>
    <name>Nexus Snapshot Repository</name>
    <url>http://localhost:8081/repository/maven-snapshots/</url>
  </snapshotRepository>
</distributionManagement>

4.4 页面上传

五、作为Docker仓库

cloud.tencent.com/developer/a…