文章目录
背景
有时候项目有保密要求,开发环境不能联网,不能从外部下载需要的包;或者团队自己开发了各种包仅内部使用,需要放在私有仓库里。这时需要一个私有的包管理工具及仓库,方案有很多种。但是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在源代码管理的地位是类似的。
仓库管理的主要的目的,是存储源代码编译之后的成果物,并对其进行版本管理,以便为开发提供稳定的依赖来源。”
很多第三方会提供官方仓库,不过大部分的公司都会选择自建仓库。主要是为了解决以下开发痛点:
- 需要存储和管理私有包
- 官方仓库访问缓慢且占用外部带宽
- 官方仓库的包可能随着官方升级和维护
- 而删除或更换地址
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)
能把多个仓库合成一个仓库来使用。把上几步创建的代理仓库和本地仓库都加入到同一仓库组中,这样可以让仓库同时支持代理和自己上传。
三、Nexus的存储:Blob Stores
3.1 Blob Stores属性
blob stores可以被一个或者多个仓库组使用。默认的Blob stores是基于文件系统的。可以简单的理解为一个文件夹。Blob Stores参数如下:
- Name:Blob Store的名称,唯一。
the name of the blob store as displayed in the repository administration - Type:类型,一般为File
the type of the blob store backend; currently only File is available representing a file system-based storage - Blob count:Blob数目
the number of blobs currently stored - Total size:现有文件夹的大小
the size of the blob store - Available space:可用空间
the overall space available for the blob store
3.2 新建Blob Store
Type默认File、Name唯一、Path选择已有的文件夹。如果需要存储到指定的路径,请新建目录。
四、配置Docker仓库
4.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。
- Storage: Blob存储/工作空间,用来存储上传到私服的等资源。 在Repository>Blob Stores新建一个。
4.2 验证使用
4.2.1 安装docker
准备一台的主机,安装好docker。
4.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
4.2.3 登录仓库
docker login -u 用户名 -p 密码 xxx.xxx.xxx.xxx:xxxx
# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。
注意:登录时,需要提供用户名和密码。认证的信息会被保存在~/.docker/config.json
文件,在后续与私有镜像仓库交互时就可以被重用,而不需要每次都进行登录认证。
4.2.4 上传镜像
这里是将本地的镜像上传到私有仓库。可以使用命令:docker images
查看本地拥有的镜像及镜像标签。
# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。
docker tag 本地镜像名称:镜像标签 xxx.xxx.xxx.xxx:xxxx/推送到私服的镜像名称:镜像标签
docker push xxx.xxx.xxx.xxx:xxxx/推送到私服的镜像名称:镜像标签
4.2.5 拉取镜像
# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。
docker pull xxx.xxx.xxx.xxx:xxxx/私服的镜像名称:镜像标签
4.2.6 搜索镜像
# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。
docker search xxx.xxx.xxx.xxx:xxxx/镜像名称关键字
五、配置Python仓库
5.1 创建一个hosted类型的python仓库
点击Repository
下面的 Repositories – Create repository – pypi(hosted)
:
- Name:定义一个名称local-pypi
- Storage: Blob存储/工作空间,用来存储上传到私服的等资源。 在Repository>Blob Stores新建一个。
- Hosted: 部署策略。可选:允许重新部署、禁用重新部署、只读
5.2 验证使用
5.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
5.2.2 全局配置
通过添加全局配置,就不需要每次执行编译的时候指定私服地址了:
- windows系统
1) 找到 pip 的配置文件,一般在 C:\Users\你的用户名\AppData\Roaming\pip\pip.ini(如果没有则新建一个文件夹 pip,并在其中新建一个文件 pip.ini)。
2) 打开 pip.ini 文件,在文件中添加如下内容:
[global]
index-url = http://xxx.xxx.xxx.xxx:xxxx/repository/local-pypi/simple # nexus私有仓库的地址
[install]
trusted-host=xxx.xxx.xxx.xxx
3) 保存文件并退出。
- linux系统
1)新建一个.pip目录:mkdir ~/.pip
2) 新建一个pip.conf文件,并且写入内容保存
cat > ~/.pip/pip.conf << EOF
[global]
timeout = 60
trusted-host = xxx.xxx.xxx.xxx
index-url = http://xxx.xxx.xxx.xxx:xxxx/repository/local-pypi/simple # nexus私有仓库的地址
EOF
保存之后,就可以直接使用pip命令安装,不需要指定pip源。例如:pip install pytest-xdist
。
六、配置npm仓库
6.1 创建一个hosted类型的npm仓库
点击Repository
下面的 Repositories – Create repository – npm(hosted)
:
- Name:定义一个名npm-pypi
- Storage: Blob存储/工作空间,用来存储上传到私服的等资源。 在Repository>Blob Stores新建一个。
- Hosted: 部署策略。可选:允许重新部署、禁用重新部署、只读
6.2 验证使用
6.2.1 安装好node环境
准备好一台主机,在node官网下载node.js
进行安装。
如下图所示是已经安装成功了:
6.2.2 创建项目
在指定目录下执行命令:npm init -y
。
如果本地已经有项目了,可以跳过该步骤。
6.2.3 安装依赖
注意:如果已经有依赖包文件,可以跳过该步骤。
我们可以使用如下命令安装依赖:npm install 依赖包名称
, 例如:npm install chart.js
。
将package.json 中的依赖 chart.js 进行下载。
- 打开 package-lock.json 文件,找到 dependencies 属性,将其下的所有依赖包依赖包,进行下载。
- 复制每个插件 resolved 属性后的链接到浏览器进行下载。
6.2.4 上传依赖
将上述下载的.tgz
包,在nexus
上传,上传后如下图所示:
6.2.5 测试npm install
我们已经将npm依赖包上传到私库了, 我们需要测试一下是否能够成功安装。
-
删除测试项目的 node_modules。
-
创建 .npmrc 文件,指定下载路径。(这个仅在当前目录下生效,不更改全局的npm源)
注意:这里的register地址就是nexus对应私有仓库的地址。
-
打开终端,执行 npm install,成功!
注意:该命令会安装npm源里面的所有依赖。
6.2.6 安装指定依赖包
npm install 依赖包名称
6.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
七、配置maven仓库
7.1 创建一个hosted类型的maven2仓库
点击Repository
下面的 Repositories – Create repository – maven2(hosted)
:
- Name:定义一个名mavel-local
- Online: 勾选。这个开关可以设置这个maven repo是在线还是离线。
- Maven2:这里有三种方式,Releases、Snapshot、Mixed。Releases: 一般是已经发布的Jar包。Snapshot: 未发布的版本。Mixed:混合的。
- Storage: Blob存储/工作空间,用来存储上传到私服的等资源。 在Repository>Blob Stores新建一个。
- Hosted: 部署策略。可选:允许重新部署、禁用重新部署、只读
7.2 验证使用
使用起来其实非常简单,就是在测试机器上安装maven工具,然后再其配置当中,将地址指向我们的私服地址,然后编译项目,这个时候就会通过私服来拉取jar包了,以后再编译的时候,就可以直接从本地私服拉取了。
7.2.1 测试主机安装jdk
7.2.2 测试主机安装maven
以下以windows系统为例:
1)maven下载地址:https://maven.apache.org/download.cgi。 选择对应系统的maven版本进行下载。
2)解压maven安装包
maven安装包下载之后,对其进行解压。
3)配置环境变量
我们使用的很多开发工具,比如jdk、tomcat等,都是需要配置环境变量的,maven也不例外。
我们在系统环境变量中,新建一个MAVEN_HOME
的系统变量名称,值是maven文件夹路径。
在path
系统变量中引用MAVEN_HOME
变量,指向MAVEN_HOME中的bin目录。
4)测试maven是否配置完毕
输入mvn -v命令,如果出现maven版本号,就表明安装成功。
5)配置本地仓库路径
更改maven/conf/settings.xml
的localRepository
。
7.2.3 更改maven的配置
更改maven/conf/settings.xml
, 将项目编译依赖地址指向改成私服的配置。
<!--私服配置-->
<mirror>
<id>nexus</id>
<name>nexus repository</name>
<url>http://xxx.xxx.xxx.xxx:xxxx/repository/maven2_local/</url>
<mirrorOf>external:local-nexus3</mirrorOf>
</mirror>
<!--nexus3-->
<profile>
<id>nexus3</id>
<repositories>
<repository>
<id>local-nexus3</id>
<url>http://xxx.xxx.xxx.xxx:xxxx/repository/maven2_local/</url>
</repository>
</repositories>
</profile>
<activeProfiles>
<activeProfile>nexus3</activeProfile>
</activeProfiles>
7.2.4 准备一个jar包
如果没有jar包,我们可以去这个地址:https://mvnrepository.com/ 下载一个。
首先搜索想要下载的jar,选择一个想要的版本
点击 view all,下载对应的jar,如下
7.2.4 上传jar包到私服
如下图所示已经上传成功了
7.2.5 在项目中实际使用
如果我们需要一个测试项目,可以在如下地址下载一个:https://start.spring.io/
在nexus私有仓库中,找到maven的jar包,复制其maven坐标
将复制的maven坐标,粘贴到pom.xml
文件中。
进入项目,在项目下输入命令:mvn install -e
即可构建项目并安装项目依赖。
八、配置raw仓库
raw 可以理解为普通类型的文件存储,就相对于一块存储,可以往里面传入任何的文件包。
8.1 创建一个hosted类型的raw仓库
点击Repository
下面的 Repositories – Create repository – raw(hosted)
:
- Name:定义一个名raw-local
- Online: 勾选。这个开关可以设置这个repo是在线还是离线。
- Storage: Blob存储/工作空间,用来存储上传到私服的等资源。 在Repository>Blob Stores新建一个。
- Hosted: 部署策略。可选:允许重新部署、禁用重新部署、只读
8.2 验证使用
我们可以直接复制nexus的raw私有仓库的地址,拼接上传的路径,下载对应的包。
如下所示已经下载成功了。