有时候项目有保密要求,开发环境不能联网,不能从外部下载需要的包;或者团队自己开发了各种包仅内部使用,需要放在私有仓库里。这时需要一个私有的包管理工具及仓库,方案有很多种。但是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
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 | 组类型,能够组合多个仓库为一个地址提供服务。仓库组,将上述多个仓库聚合,对用户暴露统一的地址。 |
当PC访问中央仓库的时候,先通过Proxy下载到Nexus仓库,然后再从Nexus仓库下载到PC本地。
这样的就可以大大节约外部宽带,只要其中一个人从中央仓库下来了,以后大家都是从Nexus仓库上进行下载。
用于将第三方的包或者我们自己的包,放到自己的Nexus仓库上。
能把多个仓库合成一个仓库来使用。把上几步创建的代理仓库和本地仓库都加入到同一仓库组中,这样可以让仓库同时支持代理和自己上传。
点击Repository
下面的 Repositories – Create repository – docker(hosted)
:
准备一台的主机,安装好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
docker login -u 用户名 -p 密码 xxx.xxx.xxx.xxx:xxxx
# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。
注意:登录时,需要提供用户名和密码。认证的信息会被保存在~/.docker/config.json
文件,在后续与私有镜像仓库交互时就可以被重用,而不需要每次都进行登录认证。
这里是将本地的镜像上传到私有仓库。可以使用命令:docker images
查看本地拥有的镜像及镜像标签。
# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。
docker tag 本地镜像名称:镜像标签 xxx.xxx.xxx.xxx:xxxx/推送到私服的镜像名称:镜像标签
docker push xxx.xxx.xxx.xxx:xxxx/推送到私服的镜像名称:镜像标签
# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。
docker pull xxx.xxx.xxx.xxx:xxxx/私服的镜像名称:镜像标签
# 注意这里的端口是配置仓库时选择的端口号, 我配置仓库时HTTP端口是8082。
docker search xxx.xxx.xxx.xxx:xxxx/镜像名称关键字
点击Repository
下面的 Repositories – Create repository – pypi(hosted)
:
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
通过添加全局配置,就不需要每次执行编译的时候指定私服地址了:
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
。
点击Repository
下面的 Repositories – Create repository – npm(hosted)
:
准备好一台主机,在node官网下载node.js
进行安装。
如下图所示是已经安装成功了:
在指定目录下执行命令:npm init -y
。
如果本地已经有项目了,可以跳过该步骤。
注意:如果已经有依赖包文件,可以跳过该步骤。
我们可以使用如下命令安装依赖:npm install 依赖包名称
, 例如:npm install chart.js
。
将package.json 中的依赖 chart.js 进行下载。
将上述下载的.tgz
包,在nexus
上传,上传后如下图所示:
我们已经将npm依赖包上传到私库了, 我们需要测试一下是否能够成功安装。
删除测试项目的 node_modules。
创建 .npmrc 文件,指定下载路径。(这个仅在当前目录下生效,不更改全局的npm源)
注意:这里的register地址就是nexus对应私有仓库的地址。
打开终端,执行 npm install,成功!
注意:该命令会安装npm源里面的所有依赖。
npm install 依赖包名称
前提条件: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