Skip to main content

Nexus

目的

本文描述 私有制品库 Nexus Repository OSS 安装部署步骤以及简单的配置与使用方法。

环境与软件

本章内容安装及运行所需软件:

项目版本说明
Nexus Repository OSS3.30.0-01私有制品库

安装部署

下载页面 下载 NEXUS REPOSITORY MANAGER OSS 3.X - UNIX,并将其解压。

得到以下目录结构:

📁 nexus-3.18.1-01
📁 etc
📃 nexus-default.properties 应用配置文件
...
📁 bin
📃 nexus Nexu 启动脚本
📃 nexus.vmoptions Java 虚拟机配置文件
...

通过 nexus-default.propertiesapplication-port 设置 Nexus 服务端口号:

application-port=8910

通过 nexus.vmoptions 设置 Java 虚拟机启动参数:

-Xms1536m
-Xmx1536m
-XX:MaxDirectMemorySize=1536m

启动 Nexus Repository Manager OSS:

$ nexus-3.18.1-01/bin/nexus start

停止 Nexus Repository Manager OSS:

$ nexus-3.18.1-01/bin/nexus stop

配置与使用

启动 Nexus Repository Manager OSS 服务后使用浏览器访问以下链接,进入首页,并通过 Sign In 按钮登录:

http://192.168.1.247:8910

首次登录会提示 admin 账号的初始密码在服务器上的保存路径,并在初次登录后要求重置密码。

通过 Server administration and configuration 标签的 Security > Users 添加用户“codelet”,并授权为 nx-admin。

使用新用户登录,通过 Repository > Repositories 创建新仓库。

仓库类型:

类型说明
hosted本地仓库
proxy代理仓库,用来代理远程公共仓库,如 Maven 中央仓库
group用于合并多个 hosted 或 proxy 仓库

版本策略:

策略说明
snapshot快照,即调试版本,同一版本号内容可能会被修改
release发布版,同一版本号内容不可修改

首先创建一个 maven2 (hosted) 类型的 Snapshot 仓库,属性如下:

属性说明
namecodelet-cloud-snapshots
Maven 2 / Version policySnapshot快照(调试)版
Maven 2 / Layout policyPermissive
Storage / Blob storedefault
Storage / Strict Content Type Validation取消不进行 Content Type 检查
Hosted / Deployment policyAllow redeploy快照版允许重新部署
Clean Policy / Available cleanup policiesNone

codelet-cloud-snapshots

再创建一个 maven2 (hosted) 类型的 Release 仓库,属性如下:

属性说明
namecodelet-cloud-releases
Maven 2 / Version policyRelease发行版
Maven 2 / Layout policyPermissive
Storage / Blob storedefault
Storage / Strict Content Type Validation取消不进行 Content Type 检查
Hosted / Deployment policyDisable redeploy发行版不允许重新部署
Clean Policy / Available cleanup policiesNone

codelet-cloud-releases

最后,创建一个 group 类型的 maven2 仓库,用来合并 codelet-cloud-snapshots、codelet-cloud-releases 和 Maven 中央库,属性如下:

属性说明
namecodelet-cloud-public
Storage / Blob storedefault
Storage / Strict Content Type Validation取消不进行 Content Type 检查
Group / Member repositoriescodelet-cloud-releases
codelet-cloud-snapshots
maven-releases
maven-snapshots
maven-central

codelet-cloud-public

创建 Maven 配置文件 ~/.m2/settings.xml 并设置以下内容:

<?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">

<pluginGroups>
<pluginGroup>org.sonatype.plugins</pluginGroup>
</pluginGroups>

<proxies/>

<servers>
<server>
<id>nexus</id>
<username>codelet</username>
<password>Pas5w0rd</password>
</server>
</servers>

<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://nexus.cloud.codelet.net:8910/repository/codelet-cloud-public/</url>
</mirror>
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>Maven Central Repository #1</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Maven Central Repository #2</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
</mirrors>

<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>

<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>

</settings>

通过以上配置,在服务器上执行 Maven 部署命令时,编译结果将被发布到 Nexus Repository Manager OSS 的 codelet-cloud-public 中:

$ mvn clean deploy

browse repositories

Nexus 会为每次提交的 Snapshot 保留历史,为避免历史版本占用过多磁盘空间,需要创建 Snapshot 清理任务。

通过 System > Tasks 创建类型为 Maven - Delete SNAPSHOT 的任务,属性如下:

属性说明
Task enabled启用
Task namecodelet-cloud-clean-snapshots
Repositorycodelet-cloud-snapshots
Minimum snapshot count1不论其他条件如何设置,都将至少保留一个 Snapshot
Snapshot retention (days)0保留最新的 Snapshot,删除所有其他 Snapshot
Task frequencyAdvanced使用 CRON 表达式设置任务的执行频率
CRON expression0 /5 * * ?每五分钟执行一次

browse repositories

通过 System > Tasks 创建类型为 Admin - Compact blob store 的任务,属性如下:

属性说明
Task enabled启用
Task namecodelet-cloud-compact-store
Blob storedefault压缩对象 Blob Store
Task frequencyAdvanced使用 CRON 表达式设置任务的执行频率
CRON expression30 /5 * * ?每五分钟执行一次

browse repositories

制品库管理规范

仓库命名

每个项目建立三个制品库,名称及类型如下表(XXX为项目名):

名称类型说明
XXX-snapshotshosted快照版,允许重新部署,用于开发、测试
XXX-releaseshosted发行版,不允许重新部署,用于版本发布
XXX-publicgroup组仓库,用于合并releases库、snapshots库、maven中央仓库

注:仓库组所包含的仓库的顺序决定了仓库组遍历其所含仓库的次序,因此最好将常用的仓库放在前面,当用户从仓库组下载构件的时候,就能够尽快地访问到包含构件的仓库。

版本号

版本号的管理使用当下被大多数软件/库使用的 语义化版本控制规范(SemVer)

摘要

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  • 主版本号:大规模升级改造, 不兼容的API修改。
  • 次版本号:向下兼容的功能性新增。
  • 修订号:向下兼容的问题修复。

先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。如下图所示:

browse repositories

上述内容出自 Semantic Versioning 2.0.0

FAQ

  1. 初始开发阶段应该怎么进行版本控制?
  • 最简单的做法是以 0.1.0 作为你的初始化开发版本,并在后续的每次发行时递增次版本号。
  1. 如何处理即将弃用的功能?
  • 应该将弃用的功能透过新的次版本号发布,在新的主版本完全移除弃用功能前,至少要有一个次版本包含这个弃用信息,这样使用者才能平顺的转移到新版API。
  1. 当我只修改了某一个接口的内部代码时,版本应该怎么变化?
  • 需要判断此次修改是否是向下兼容的,如果是向下兼容的那么这就是一个修订等级的改变。如果是不兼容的,则需要递增主版本号。
  1. 先行版本号的应用场景有哪些?
  • 先行版的优先级低于相关联的标准版本。被标上先行版本号则表示这个版本并非稳定而且可能无法满足预期的兼容性需求。范例:1.0.0-alpha、1.0.0-beta、1.0.0-rc.1。

流程

  • 程序构建时从public库下载构件。
  • master分支构建后上传到releases库。
  • 其他分支构建后上传到snapshots库。
  • 部署生产环境时从releases库获取程序包。
  • 部署开发环境、测试环境时从snapshots库获取程序包。