Nexus!最受欢迎的仓库管理软件

发布时间:2023年12月28日

背景

有时候项目有保密要求,开发环境不能联网,不能从外部下载需要的包;或者团队自己开发了各种包仅内部使用,需要放在私有仓库里。这时需要一个私有的包管理工具及仓库,方案有很多种。但是Nexus3部署最简单,功能也强大。

前提:安装和启动Nexus3

官网下载nexus3,解压,CMD窗口进入安装目录,
cd H:\work\nexus-3.28.1-01-win64\nexus-3.28.1-01\bin
nexus.exe /run

等待启动完,然后浏览器进入:localhost:80

默认端口是80,可以修改IP和端口。

docker安装参考:

docker run -d --user root -p 8081:8081 -p 8082:8082 -p 8083:8083 -p 8084:8084 -v /opt/nexus-data:/nexus-data --name nexus3 sonatype/nexus3:3.14.0

#映射端口对应的用途:

8081:可以通过http访问nexus应用

8082:docker(hosted)私有仓库,可以pull和push

8083:docker(proxy)代理远程仓库,只能pull

8084:docker(group)私有仓库和代理的组,只能pull

#使用参数 -v 建立宿主机与Docker目录映射关系,/nexus-data:docker里存nexus数据目录,所以将数据目录存放到宿主机/opt/nexus-data

一、Nexus介绍

Sonatype Nexus Repository 通常被称作为Nexus, 是由 Sonatype 出品的目前世界上最流行的仓库管理软件。它在仓库管理方面的地位,和Git在源代码管理的地位是类似的。

仓库管理的主要的目的,是存储源代码编译之后的成果物,并对其进行版本管理,以便为开发提供稳定的依赖来源。”

很多第三方会提供官方仓库,不过大部分的公司都会选择自建仓库。主要是为了解决以下开发痛点:

  1. 需要存储和管理私有包
  2. 官方仓库访问缓慢且占用外部带宽
  3. 官方仓库的包可能随着官方升级和维护
  4. 而删除或更换地址

Nexus目前提供两个版本,Nexus2和Nexus3。
Nexus2主要只用来管理maven,而Nexus3默认支持了maven、docker、npm、yum、apt等多种仓库的配置。
今天我们主要以Nexus3为例介绍。

官方文档:https://help.sonatype.com/docs

二、仓库类型

仓库按照类型区分,可以分为三种:代理仓库(Proxy)、本地仓库(Hosted)、仓库组(Group)。

项目具体说明
hosted本地存储。像官方仓库一样提供本地私库功能。用户可以 deploy 到 hosted 中,也可以手工上传构件到 hosted 里,在 central repository 是获取不到的,就需要手工上传到hosted里。
proxy提供代理其它仓库的类型。远程仓库的代理,当用户向这个仓库请求一个 artifact,他会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户。
group组类型,能够组合多个仓库为一个地址提供服务。仓库组,将上述多个仓库聚合,对用户暴露统一的地址。

2.1 代理仓库(Proxy)

当PC访问中央仓库的时候,先通过Proxy下载到Nexus仓库,然后再从Nexus仓库下载到PC本地。

这样的就可以大大节约外部宽带,只要其中一个人从中央仓库下来了,以后大家都是从Nexus仓库上进行下载。

2.2 本地仓库(Hosted)

用于将第三方的包或者我们自己的包,放到自己的Nexus仓库上。

2.3 仓库组(Group)

能把多个仓库合成一个仓库来使用。把上几步创建的代理仓库和本地仓库都加入到同一仓库组中,这样可以让仓库同时支持代理和自己上传。

三、配置Docker仓库

3.1 创建一个hosted类型的docker仓库

点击Repository下面的 Repositories – Create repository – docker(hosted)

  • Name:定义一个名称docker-local
  • Online: 勾选。这个开关可以设置这个Docker repo是在线还是离线。
  • Repository Connectors:包含HTTP和HTTPS两种类型的port。这里需要注意的是,此处的HTTP端口(此处的值为8082)很重要,后续拉取和推送进行是使用此端口进行的,而不是nexus本身对外暴露的端口。
  • Allow anonymous docker pull: 不勾选。这样的话就不允许匿名访问了,执行docker pull或 docker push之前,都要先登录:docker login
  • Docker Registry API Support: Docker registry默认使用的是API v2, 但是为了兼容性,我们可以勾选启用API v1。

3.2 验证使用

3.2.1 安装docker

准备一台的主机,安装好docker。

3.2.2 修改docker配置

在/etc/docker/daemon.json文件中添加下面的内容:
命令参考:cat /etc/docker/daemon.json。 如果文件不存在则创建一个:vim /etc/docker/daemon.json

注意:这里的xxx.xxx.xxx.xxx:xxxx指的是nexus平台的IP:docker私有仓库配置的HTTP host, 例如:192.168.100.129:8083


{

    "insecure-registries":["xxx.xxx.xxx.xxx:xxxx"]

}

重载配置文件以及重启docker,使得配置生效。

systemctl daemon-reload
systemctl restart docker

3.2.3 登录仓库

docker login -u 用户名 -p 密码 xxx.xxx.xxx.xxx:xxxx
# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。

注意:登录时,需要提供用户名和密码。认证的信息会被保存在~/.docker/config.json文件,在后续与私有镜像仓库交互时就可以被重用,而不需要每次都进行登录认证。

3.2.4 上传镜像

这里是将本地的镜像上传到私有仓库。可以使用命令:docker images查看本地拥有的镜像及镜像标签。

# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。
docker tag 本地镜像名称:镜像标签 xxx.xxx.xxx.xxx:xxxx/推送到私服的镜像名称:镜像标签
docker push xxx.xxx.xxx.xxx:xxxx/推送到私服的镜像名称:镜像标签

3.2.5 拉取镜像

# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。
docker pull xxx.xxx.xxx.xxx:xxxx/私服的镜像名称:镜像标签 

3.2.6 搜索镜像
# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。
docker search xxx.xxx.xxx.xxx:xxxx/镜像名称关键字

四、配置Python仓库

4.1 创建一个hosted类型的python仓库

点击Repository下面的 Repositories – Create repository – pypi(hosted)

  • Name:定义一个名称local-pypi
  • Storage: 这里默认,不需要更改
  • Hosted: 部署策略。可选:允许重新部署、禁用重新部署、只读

4.2 验证使用

4.2.1 指定配置

1)新建一台环境干净的主机,安装好Python的pip环境。

2)然后通过命令行随便安装一个包,安装的时候,将代理指向我们的私服来。这个地方遇到了两个坑,这里用两个注意来进行提醒。

注意:在指定刚刚配置的私服时,需要在统一对外的地址最后加上一个simple。例如复制的本地仓库地址是:http://xxx.xxx.xxx.xxx:xxxx/repository/test-pypi/, 我们在实际使用的时候需要用:http://xxx.xxx.xxx.xxx:xxxx/repository/test-pypi/simple

注意: 在第一次进行安装测试的时候,一定要指定测试包的版本,否则可能会报如下错误:

ERROR: Could not find a version that satisfies the requirement execnet>=1.1 (from pytest-xdist) (from versions: none)
ERROR: No matching distribution found for execnet>=1.1

3)下载包
参考命令:pip install --trusted-host xxx.xxx.xxx.xxx -i http://xxx.xxx.xxx.xxx:xxxx/repository/test-pypi/simple pytest-xdist

4.2.2 全局配置

通过添加全局配置,就不需要每次执行编译的时候指定私服地址了:

mkdir ~/.pip
cat > ~/.pip/pip.conf << EOF
[global]
timeout = 60
trusted-host = xxx.xxx.xxx.xxx
index-url = http://xxx.xxx.xxx.xxx:xxxx/repository/test-pypi/simple
EOF

保存之后,就可以直接使用pip命令安装,不需要指定pip源。例如:pip install pytest-xdist

五、配置npm仓库

5.1 创建一个hosted类型的npm仓库

点击Repository下面的 Repositories – Create repository – npm(hosted)

  • Name:定义一个名npm-pypi
  • Storage: 这里默认,不需要更改
  • Hosted: 部署策略。可选:允许重新部署、禁用重新部署、只读

5.2 验证使用

5.2.1 安装好node环境

准备好一台主机,在node官网下载node.js进行安装。

如下图所示是已经安装成功了:

5.2.2 创建项目

在指定目录下执行命令:npm init -y
如果本地已经有项目了,可以跳过该步骤。

5.2.3 安装依赖

注意:如果已经有依赖包文件,可以跳过该步骤。

我们可以使用如下命令安装依赖:npm install 依赖包名称, 例如:npm install chart.js

将package.json 中的依赖 chart.js 进行下载。

  • 打开 package-lock.json 文件,找到 dependencies 属性,将其下的所有依赖包依赖包,进行下载。
  • 复制每个插件 resolved 属性后的链接到浏览器进行下载。
5.2.4 上传依赖

将上述下载的.tgz 包,在nexus上传,上传后如下图所示:

5.2.5 测试npm install

我们已经将npm依赖包上传到私库了, 我们需要测试一下是否能够成功安装。

  • 删除测试项目的 node_modules。

  • 创建 .npmrc 文件,指定下载路径。(这个仅在当前目录下生效,不更改全局的npm源)
    注意:这里的register地址就是nexus对应私有仓库的地址。

  • 打开终端,执行 npm install,成功!
    注意:该命令会安装npm源里面的所有依赖。

5.2.6 安装指定依赖包

npm install 依赖包名称

5.2.6.7 推送本地包到私有仓库

前提条件:nexus需要做如下配置

假如我们有一个项目想推送到nexus私有仓库,我们需要在package.json文件配置如下:

{
  ......,
  "publishConfig": {
    "registry": "http://xxx.xxx.xxx.xxx:xxxx/repository/node_local/"  # 注意:这里的register地址就是nexus对应私有仓库的地址。
  }
}

之后,我们可以登录,然后发布项目。

# 配置npm源地址,配置为nexus私有仓库地址
npm config set registry http://xxx.xxx.xxx.xxx:xxxx/repository/xxxx/

# 向npm注册表添加用户, 用户名和密码是nexus的登录的用户名和密码,邮箱可以随意填写
npm adduser

# 推送本地包到私有仓库
npm publish

文章来源:https://blog.csdn.net/FloraCHY/article/details/135273723
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。