Nexus Repository Manager 3 搭建 npm 私服

2,442 阅读3分钟
原文链接: zhuanlan.zhihu.com

前一段时间正好有一个 使用 Nexus 搭建 npm 私服的任务分配到手中。此篇记录整个过程。

关于 Nexus Repository Manager 3

其实 Sonatype 的官网上 有它每个产品很详尽的文档,整个安装配置流程并不复杂。而 Nexus Repository Manager 3 也不仅仅可以用于 npm 私服。还可以用于 maven、bower 仓库等,支持范围广泛。

英文好的同学可以直接查看 Nexus Repository Manager 3 官方文档

Repository Manager 3 官方文档

下载

官方提供了几种平台的 下载链接

我们(Linux)选择 Unix archive 即可。 执行:

$ wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz

等待下载完成(我下载的时候速度挺慢的)。会下载到当前目录 lastest-unix.tar.gz

将压缩包移动到 /opt 目录下:

$ sudo mv latest-unix.tar.gz /opt/nexus3.tar.gz

然后进入/opt目录下解压缩:

$ cd /opt
$ sudo tar -xzvf nexus3.tar.gz

该文件会解压缩到当前目录:

nexus-3.11.0-01 和 sonatype-work 为解压出来的文件夹

已下载解压完毕,进行下一步。


安装

1、环境

在运行 之前, 要确保已具备运行环境。

官网文档 安装 一项里提示 需要 JRE。

Nexus Repository Manager requires a Java 8 Runtime Environment (JRE) from Oracle.
Nexus Repository Manager 需要 Oracle 的 Java 8 运行时环境(JRE)

在安装前先检查 下 java 环境是否已安装

$ java -version

如果已有java环境 则显示如下信息(版本号可能不同):

java -version 输出

未安装 则可使用 apt-get 安装:

$ sudo apt-get install default-jre

安装完后再执行 查看版本 即可看到上面图片内容。

2、Nexus Repository Manager 3

之前我们已经下载好了 Nexus Repository Manager 3 ,并且移动到了 /opt 目录下。这个时候我们进入到 /opt/nexus-3.3.1-01/bin 目录下执行

$ sudo ./nexus run

就可以将 Nexus Repository Manager 3 跑起来了。只不过 repository manager 会在当前 shell 运行 并 输出日志,必须通过 ctrl + c 退出。这种方式运行难以管理和维护。服务器重启后还需要手动执行启动 repository manager ,不是很方便。所以我们接下来把它作为一个服务运行。


作为服务运行

为了以后方便,单独创建一个 nexus 用户用来运行和管理 Nexus Repository Manager。

# 创建用户并指定用户目录
$ sudo useradd -d /home/nexus -m nexus
# 授权
$ sudo chown -R nexus:nexus /home/nexus
$ sudo chown -R nexus:nexus /opt/nexus-3.11.0-01
$ sudo chown -R nexus:nexus /opt/sonatype-work/

然后将 /opt/nexus-3.11.0-01/bin 目录下的 nexus.rc 修改为如下内容:

官方文档列举了几个工具将 Nexus Repository Manager 作为服务运行的 示例

我们使用其中一种即可,怎么方便怎么来。

在作为服务运行之前,先更改一下 Nexus Repository Manager 运行的端口。找到 /opt/sonatype-work/nexus3/etc/ 目录下的 nexus.properties 文件进行修改:

去掉#并修改端口号

选一个不与其他程序冲突的端口号设置。此处我设置的端口号为 8090。 (记得打开服务器的对应端口)

接下来,将 Nexus Repository Manager 链接到系统启动脚本,然后使用 update-rc.d 将其作为服务启动(update-rc.d命令,是用来更新系统启动项的)

$ sudo ln -s /opt/nexus-3.11.0-01/bin/nexus /etc/init.d/nexus
$ cd /etc/init.d
$ sudo update-rc.d nexus defaults
$ sudo service nexus start

可以通过查看 log 检查是否启动成功:

$ tail -f /opt/sonatype-work/nexus3/log/nexus.log
tail 命令验证服务是否已成功启动。如果成功,您应该看到一条消息,通知您它正在侦听HTTP。

启动成功后可以使用以下等命令:

# 重启 nexus 服务
$ sudo service nexus restart
# 停止 nexus 服务
$ sudo service nexus stop
# 查看 nexus 服务状态
$ sudo service nexus status 

至此 Nexus Repository Manager 3 已经跑在我们服务器上的 8090 端口了。可以通过 ip:port 方式直接访问。

通过ip和端口直接访问

至此服务搭建部分完成!

接下来可以使用 默认的用户名密码登录后进行 npm 仓库的创建和设置:

user: admin
pwd: admin123

创建 Repository

Nexus Repository Manager 3 可以用于多种类型的包管理。此处我们要搭建的是npm包管理私服。

登录后的界面点击 下图箭头所指 设置 按钮。

设置按钮

进入设置界面:

Nexus Repository Manager 设置界面

上图中左面菜单有很多功能。可以在 Security 下的 Users 可以创建用户并设置用户权限,修改用户信息。Logging 下的 Log Viewer 可以查看运行日志。

本次配置主要用到了 Repository -> Repositories 和 Security -> Realms 两项

首先在 Repositories 创建仓库(可以看到已经有一些预置内容):

在 Repositorty -> Repositorties 下点击 Create repositorty 按钮

接下来会进入到 Repositorty 的选择:(npm 有三种)

创建npm仓库时的三种类型

第一种:代理 npm 仓库

将公共 npm 服务器的资源代理缓存,减少重复下载,加快开发人员和CI服务器的下载速度。

创建时选择 npm(proxy) ,只需填写 Name 和 Remote storage (公有库域名)即可。

代理 npm 仓库创建配置项

第二种:私有 npm 仓库

用于 上传自己的npm包 以及第三方npm包。

同样的创建步骤,只不过选择的 仓库类型为 npm(hosted)。 只填写 Name 即可。

私有 npm 仓库配置项

第三种:npm 仓库组

用于将多个内部或外部 npm 仓库统一为一个 npm仓库。被添加到 npm仓库组 中的 其他仓库内的包都能够通过该 npm仓库组 访问到。

例如:可以新建一个npm仓库组将 上面两个刚刚创建的 npm 仓库都添加进去。这样可以通过这个 npm仓库组,既可以访问 公有npm仓库 又可以访问自己的 私有npm仓库。

仓库类型为 npm(group),起一个名字 Name,然后选择需要添加到组里的 其他 npm 仓库。此处我选择的是 npm-external 和 npm-internal(我只创建了这两个)

仓库都创建完毕了。接下来需要验证一下是否可用

在 Repositories 中点击创建的 仓库。可以查看该仓库的 URL。

在项目目录下创建 .npmrc 文件。文件内容为:

将图中registry的URL替换为 npm仓库组的URL

然后随便安装一个 包 试试(日志级别设置为 info):

# 装react吧
$ npm --loglevel info install react

如图。确实是从设置的 npm 私服下载的react。成功。


发布到 npm 私服

除了从 npm 仓库安装依赖。我们还需要将公司内部的 代码打包 发布到 npm 的私服。这里没什么特殊的,就是需要设置一下 Nexus Repository Manager 的权限。这样才能使用 npm login 认证登录到我们的私服。

Realms

此处在 Realms 下。将 npm Bearer Token Realm 添加到 Active 列表内保存即可。

然后可以执行(登录 私有npm仓库):

$ npm login --registry=http://xxxx:8090/repository/npm-internal/

执行命令,提示填写账号密码和邮箱,验证通过后将会在 用户主目录下的 .npmrc 文件中插入一条 此仓库 url 和对应的 token。

箭头所指为执行命令后插入的值

在确保项目有 package.json 前提下,执行:

$ npm publish --registry=http://xxxx:8090/repository/npm-internal/
成功发布 npm-test@1.0.0 到npm-internal

如果因为用户名包含大写字母等原因无法使用 npm login 验证登录。还可以使用另一个方法,详见文档,此处不再展开。

done !

至此,使用 Nexus Repository Manager 3 搭建 npm 私服结束。整体流程并不复杂,设置权限那里可能有些小小的坑。文档很详尽,唯一的遗憾是纯英文的,直接读文档不熟悉的话可能会遗漏一些东西。


总结

之前没有过类似的搭建经验,面对英文文档着实看了很久。所幸收获颇丰,这些工作也弥补了我很多常识性知识内容。公司的搭建任务在一个月前已经完成了,这篇是反过头来的回顾总结,也算作工作文档留存。文中内容也是一边操作一边写,有错误欢迎指出。