Ubuntu搭建Nexus-maven私有仓库

Ubuntu搭建Nexus-maven私有仓库

背景

公司的打包系统以及平时的开发过程中,从maven仓库、谷歌仓库等等海外仓库拉取依赖的情况很多,何况海外仓库也可能被墙。每个人都开梯子倒也没多大问题,但是每个人都重复拉取一次,一来浪费带宽、二来这样子的速度也并不快。
何况还有个打包系统的存在,每次打包,都会从外网拉取大量的依赖,如果都从远端仓库拉取,流量消耗是一个问题,能不能拉取到也是个问题,那么打包系统的稳定性,就不能够保证了。
其实从一开始搭建打包工具的时候,私有仓库,也就提上了日程,也同步部署好了。只是一只没有给私有仓库配置代理,导致拉取海外依赖很不稳定,但也能将就用用。所以才有了上一篇博客Ubuntu搭建v2rayA

必须得介绍下Nexus,下面的介绍是豆包生成的,继续不保真。但是,应该问题不大🤗。
Nexus是由Sonatype公司发布的一款功能强大的仓库管理软件。以下是关于它的详细介绍:

  • 主要功能
    • 仓库管理:支持多种类型的仓库,包括宿主仓库、代理仓库、虚拟仓库和仓库组。宿主仓库用于存放组织内部的特定项目构件;代理仓库可代理远程公共仓库,缓存构件以加速构建;虚拟仓库用于适配Maven 1;仓库组则可统一管理多个仓库,简化项目构建中的仓库请求。
    • 构件管理:支持在界面上直接上传构件,也可通过API实现自动化的构件上传和下载。同时,还提供构件的索引和搜索功能,方便用户快速查找所需构件。
    • 安全控制:支持多种身份验证方式,如内置用户管理、LDAP集成等,并提供细粒度的权限管理功能,管理员可以对用户的访问权限进行严格控制。此外,还具备日志审计功能,记录所有用户的操作日志。
  • 优势特点
    • 加速构建:通过代理远程仓库,将所需构件缓存在本地,避免每次构建都从远程仓库获取,提高了构建速度,减少了网络带宽消耗。
    • 节省带宽:对于大型项目,可减少外部构件的下载次数,降低中央仓库的负荷,节省带宽资源。
    • 提高稳定性:当中央仓库出现问题时,Nexus可通过本地缓存提供所需构件,保证项目的正常构建和发布。
    • 控制和审计:管理员可以监控构件的使用情况,限制访问权限,有助于提高安全性和满足合规性要求。
  • 支持的仓库类型:除了支持Maven仓库外,还支持Docker Registry、Yum/DNF Repository、Helm Charts、APT Repository、Raw Repository、NPM Registry、PyPI Repository等多种软件包格式的仓库。

技术选型

  1. nexus官网
  2. nexus3的dockerhub页面
  3. Docker

搭建步骤

和v2rayA一样,docker容器直接就跑起来。只是要注意把缓存文件的目录映射出来到宿主机,不然重启容器之后,nexus的数据会丢失。

运行容器

要提前准备一个目录,用来存放nexus的数据,这里我选择/home/data/nexus。一定要记得,按dockerhub上的说明,把目录的所有者改为200。因为Nexus 容器内部运行的进程使用非 root 用户(默认是 nexus 用户,UID 为 200)。

1
2
mkdir /home/data/nexus && chown -R 200 /home/data/nexus
docker run -d -p 10086:8081 --name nexus -v /home/data/nexus:/nexus-data sonatype/nexus3:3.84.0

运行成功之后,访问http://127.0.0.1:10086就可以看到nexus的初始化界面了。

配置nexus

点击右上角的用户图标,弹出登录框。

可以看到,nexus提示了自动生成的admin密码存储在/nexus-data/admin.password文件中,容器内的/nexus-data这个目录,我们映射到了宿主机的/home/data/nexus目录下。到其中去查看密码。

1
2
cat admin.password 
81fda551-9efa-4840-af83-6e4b54751d6d

使用admin作为账号,文件中查看到的密码进行登录。登录成功之后,便会弹出nexus的配置界面。

第二步就是重置admin的密码,根据自己需求设置即可。

一路下一步,直到勾选是否允许匿名访问。启用匿名访问意味着,默认情况下,用户无需凭证即可从仓库搜索、浏览和下载组件。

这里根据自己的需求,选择是否开启匿名访问,如果是公司或者家里内网部署,开启匿名访问比较方便。如果是外网,记得关闭匿名访问,配置账号密码。

之后一路下一步,直到配置完成。此时,你就完成了nexus的的安装和管理员账号的配置,能够看到nexus的管理后台了。(这里我关闭了浏览器的暗黑模式,方便截图能看清楚nexus的icon之类的,后面又会是暗黑模式啦)

界面介绍

Dashboard

这是nexus的欢迎界面,这里可以查看nexus的版本信息,以及一些关于nexus的统计信息。老版本这里会展示一些警告信息。

我司在用的nexus的警告信息,版本比较老了,一直也没更新。

这里是查看当前仓库里存在的依赖库列表的,可以通过关键字或者groupid等过滤。现在我们是新搭建的仓库,里面还没有任何东西。
放一个截图,方便大家参考。

Browse


这是浏览现在有哪些仓库的,以及仓库的详细信息。nexus默认创建了一个maven-central仓库,可以看到,这个仓库的类型是proxy,说明这是一个代理仓库,它是代理了maven中央仓库。
另外还有maven-releases仓库和maven-snapshots仓库,这两个仓库都是hosted类型,是本地仓库,用于存储自己上传的库。

这里顺便贴一波豆包解释的仓库类型:

仓库类型

在Nexus Repository Manager中,仓库有多种类型,常见的包括宿主仓库(Hosted Repository)、代理仓库(Proxy Repository)、虚拟仓库(Virtual Repository)和仓库组(Repository Group) ,以下是详细介绍:

宿主仓库(Hosted Repository)

功能:主要用于存储组织内部生成的构件,比如公司开发团队自行构建的jar包、npm包等。可以将其看作是一个私有的存储区域,用来存放那些只在组织内部使用,或者准备发布到特定渠道的软件包。
区别于其他类型的特点:

  • 数据所有权:数据由本地管理,是用户自己创建和上传的内容,完全掌控数据的生命周期,包括创建、更新和删除。
  • 访问控制:可以针对不同的用户或用户组设置精细的权限,控制谁可以上传、下载和管理构件。
  • 使用场景:适合用于管理企业内部的项目依赖,如内部开发库、定制化组件等,这些内容不希望公开到公共仓库。
代理仓库(Proxy Repository)

功能:用于代理远程公共仓库,像Maven中央仓库、npm官方仓库等。它会缓存从远程仓库下载的构件,当下次有相同的请求时,直接从本地缓存获取,而不用再次访问远程仓库,从而加快构建速度,减少网络带宽消耗。
区别于其他类型的特点:

  • 缓存机制:具备缓存管理功能,能配置缓存的有效期,过期后会重新从远程仓库拉取最新版本的构件。
  • 远程仓库关联:需要指定一个远程仓库的URL,Nexus通过这个URL去获取构件。同时,还可以设置代理仓库的连接超时、重试等参数。
  • 使用场景:适用于网络不稳定,或者远程仓库访问速度较慢的情况。企业可以通过代理仓库统一管理对公共仓库的访问,减少外部网络依赖。
虚拟仓库(Virtual Repository)

功能:虚拟仓库主要是为了兼容旧版本的Maven(Maven 1.x)客户端。在现代开发中,使用频率相对较低。它本身并不存储实际的构件,只是提供了一种方式,让旧版本的客户端能够以一种兼容的方式访问Nexus中的构件。
区别于其他类型的特点:

  • 兼容性:专门为旧版客户端设计,通过模拟旧版仓库的结构和访问方式,使得旧版客户端无需进行重大改造就能使用Nexus。
  • 无实际存储:不占用磁盘空间来存储构件,只是在逻辑上提供对构件的访问接口。
  • 使用场景:在一些遗留项目中,若仍然在使用Maven 1.x客户端,且无法进行升级,此时虚拟仓库就能发挥作用。
仓库组(Repository Group)

功能:仓库组是将多个不同的仓库(宿主仓库、代理仓库等)聚合在一起,形成一个逻辑上的集合。当客户端配置仓库地址时,只需要配置仓库组的地址,就可以访问到仓库组中包含的所有仓库的构件。
区别于其他类型的特点:

  • 聚合访问:简化了客户端的配置,客户端不需要分别配置多个仓库地址,只需要配置仓库组地址,就能获取到多个仓库中的资源。
  • 顺序管理:可以设置仓库组中各个仓库的搜索顺序,当客户端请求一个构件时,Nexus会按照设定的顺序在各个仓库中查找。
  • 使用场景:适用于企业内部有多个不同用途的仓库,希望对客户端提供一个统一的访问入口,方便管理和使用。

Upload

这里可以在界面上直接手动上传自己打包的依赖库.

  • 选择一个要上传的库文件,比如:jar、aar等
  • Extension记得根据文件类型填入,如:aar
  • 填写库的groupid、artifactid、version等信息
  • 记得勾选生成pom文件(我自己试过,不勾选,在androidstudio中拉取该依赖的时候拉不到)

原因:POM(Project Object Model)文件定义了项目的构建、依赖管理等相关信息。当在 AS 中拉取 aar 库时,Gradle 需要通过 POM 文件获取该库的依赖关系、版本号等元数据。如果没有 POM 文件,Gradle 无法准确配置和解析该库,也就无法成功拉取。

Settings

Nexus Repository Manager的设置页面,可以配置Nexus的认证信息、代理、缓存、邮件通知、插件等。这里我只用到了两个,一个就是配置仓库的代理,还有一个就是http请求代理,也就是翻墙,方便仓库能拉取都谷歌等海外仓库的库。

这里最重要的就是Repositories,里面是配置代理仓库的。

点击创建仓库,Create repository,根据需要选择你要代理的仓库类型。

我这里添加的是maven的代理仓库,选择maven2(proxy)。我用阿里云的仓库举例:
填入仓库名称,这个名称可以自己定义,说明你代理的是什么仓库就行。远端仓库的地址,就是你要代理的仓库的地址,这个在各个仓库去找即可。

  • Not found cache TTL - 这是配置,如果某个库在远端仓库找不到,这个结果要缓存的时长,默认是1天(1440分钟)。如果这个仓库是自己的仓库,建议这个配置短点,不然会导致刚上传的库在一天之内可能都下载不到,如果是外部的仓库,问题倒不大。
  • HTTP - Authentication 这里是配置所代理的仓库的账号密码的,如果你代理的是合作方的私有仓库,则可以在这里配置合作方提供的账号密码。

其他的配置,使用默认的即可。最后点击底部的创建仓库按钮,即可创建成功。

使用代理

记得使用的仓库是maven-public,它是一个group类型的仓库,所以我们还缺一个步骤,就是将我们添加的代理仓库,配置到maven-public仓库中,让maven-public仓库知道它需要代理哪些仓库,我们向maven-public仓库请求资源的时候,maven-public才会在其代理的仓库列表中去寻找该资源。

将aliyun、huawei等仓库从左侧的列表中选中,点击>按钮,将其添加到右侧列表即可。还可以通过上下按钮,调整顺序。

现在你在as中使用私有仓库。

1
2
3
4
maven {
allowInsecureProtocol = true
url 'http://192.168.10.85:10086/repository/maven-public/'
}

同步一下代码,便可以在nexus后台,查看仓库状态。可以看到带来的仓库status显示的是:Online - Remote Available,这是远端仓库可用

代理仓库的状态可以是如下这些:

  • Online - Uninitialized 在线 - 未初始化
    A new proxy repository that is not yet initialized.
    一个新的代理仓库,尚未初始化。

  • Online - Ready to Connect
    在线 - 准备连接
    The proxy repository is ready to connect to remote.
    代理仓库已准备好连接到远程。

  • Online - Remote Available
    在线 - 远程可用
    The proxy repository has made successful requests to the remote.
    代理仓库已成功向远程发起请求。

  • Online - Remote Manually Blocked
    在线 - 远程手动阻止
    The proxy repository’s “blocked” configuration is set to not send requests to the remote repository.
    代理仓库的”阻止”配置设置为不向远程仓库发送请求。

  • Online - Remote Auto Blocked and Unavailable
    在线 - 远程自动阻止且不可用
    The proxy repository is not sending requests as auto-blocking is configured and the remote repository is unreachable.
    代理仓库未发送请求,因为已配置自动阻止且远程仓库无法访问。

  • Online - Remote Unavailable
    在线 - 远程不可用
    The repository is not configured to autoblock requests however the remote repository is unreachable.
    仓库未配置自动阻止请求,但远程仓库无法访问。

  • Offline - Repository Offline
    离线 - 仓库离线
    The repository’s settings does not have the online checkbox enabled.
    仓库的设置中没有启用在线复选框。

nexus官方的文档请参考这里

网络代理配置

此时,我们再添加一个代理仓库,比如谷歌的maven仓库。

配置完成后,再回到仓库列表中,可以看到新添加的仓库状态为:Online - Remote Auto Blocked and Unavailable

这是因为谷歌的仓库在海外,我们搭建的私有仓库,并不能与海外仓库连通。

这里顺便提一句:如果你的仓库Auto blocking enabled是开启的,那么当仓库无法与远程仓库连通时,仓库的状态就会变成:Online - Remote Auto Blocked and Unavailable。如果没有开启,应该是显示:Online - Remote Unavailable。这个配置自动禁用无法访问的远端仓库的连接,如果nexus轮询的时候,被代理的仓库无法连通,则会自动禁用。等待连通之后才会被启用。除非有本地缓存存在,否则该远端仓库中的库你就拉不到了。

这时候我们就需要配置网络代理了,让nexus能与谷歌的仓库连通。

在Settings->System->HTTP中设置http和https代理,ip和端口参考上一篇博客中配置的。

配置好了之后,等待一段时间,nexus就会轮询,刷新各个仓库的状态。正常的话,就可以观察到,所代理的谷歌仓库,已经显示:Online - Remote Available 了。
此时,你的as就可以通过mave-public这个仓库,拉取它所代理的所有仓库的中的三方库了。

总结

nexus的搭建和配置其实很简单,在国内来说,麻烦的还是代理海外仓库所需要的科学上网。这个nexus已经提供了非常方便的配置。
其他的使用,我也没有深入再去研究,我比较懒,已经能够支持工作当中的需求了,就没有再花时间了。😵‍💫