私有 npm 仓库 Nexus & 工具库配合 GitLab 自动发布
1. 搭建 Nexus
这部分内容网上有非常多的教程可以参考。
1.1 本地临时起个 docker container 用于玩耍
1 | docker pull sonatype/nexus3 # 官方镜像 |
创建 Container 设置本地端口 8000
打开后在会提示admin
的密码在这个文件里:/nexus-data/admin.password
照做后进入界面。
1.2 创建 blob 存储

之后的内容可以参考这篇文章:使用Nexus搭建npm私服
简述一下就是创建了 2 个 npm 的 Repository + 1 个 group
- local-npm 本地自己的仓库
- proxy-npm 远程仓库地址
- group-npm 将2个仓库,添加到group中
可以修改的一处是加一个淘宝的镜像 registry 的 Repository
命名为:taobao-npm
Proxy 填写:https://registry.npm.taobao.org
并且也加到刚才的 group-npm
中。
另外值得注意的是 local-npm 中,Deployment policy
的设置可以是:
- Allow redeploy
- Disable redeploy
…
用来控制 npm publish 的时候,相同的版本号是否允许发布并且覆盖原来的内容,这个根据实际策略来决定,我们最终方案选择保留两个本地仓库,一个允许覆盖,一个严格要求版本号递增。
还有一个要做的是在 Realms 中把 npm Bearer Token Realm
加到右边的 Active 列表中

2. 使用私有 npm 仓库
在 Repository 中找到 local-npm,点击 copy 可以看到本地仓库的地址
然后在实际的项目中修改 registry(仓库组的那个地址) 就可以使用了
1 | npm config set registry http://localhost:8000/repository/group-npm/ |
或者, 避免在全局修改 registry,可以在项目根目录下的 .npmrc
文件中加入:
1 | registry=http://localhost:8000/repository/group-npm/ |
如果有 401 错误,记得检查一下有没有在 Realms 中把 npm Bearer Token Realm
加到右边的 Active 列表中
也要注意 .npmrc 中是否已经配置过别的 registry
- 第一次 install 会比较缓慢,但是每次下载依赖的时候 Nexus 会缓存一份,所以下一次下载会很快
3. npm publish 发布到私有 Nexus 仓库中
在发布之前需要看一下用户权限问题。
使用
admin
用户来发布当然是没有问题,但是以后一定会分不同的权限角色,不能将admin
的权限给所有发布的人。可以在 Nexus 中创建一个用于允许
发布
的角色nx-deploy
。并且给这个角色
nx-component-upload
和nx-repository-view
的权限基于这个角色,创建一个可以发布的用户: 下图中的
deployment
有了这个用户后就可以登录了。
- npm login注意是本地仓库的地址,而不是安装时的 registry
1
2
3npm login --registry=http://localhost:8000/repository/local-npm/
username: deployment
password: xxxx
如果登录失败可以检查一下 .npmrc 中的 registry 或者 有无已经配置的用户名密码
- npm publish
1
npm publish --registry=http://localhost:8000/repository/local-npm/
4. 使用 GitLab CI 把发布自动化
自动化就要省去所有手敲命令
首先在工具库项目下的
package.json
文件中加入1
2
3"publishConfig": {
"registry": "http://localhost:8000/repository/local-npm/"
}.npmrc
文件中1
2
3registry=http://localhost:8000/repository/group-npm/
always-auth=true
_auth=ZGVwbG95bWVudDoxMjMxMjM=_auth 的生成方式是:base64Encode(<username>:<password>)
如果觉得这样写 token 不安全,可以将 token 放到 GitLab 的换进环境变量中,然后在 CI 中写入 .npmrc:
1 | - echo "http://localhost:8000/repository/group-npm/:_authToken=${NPM_TOKEN}" > .npmrc |
- 配置
.gitlab-ci.yml
简述一下步骤就是:
- build 生成发布所需的 dist/
- 执行 npm publish
可以参考:
1 | image: 一个有node环境的基础镜像即可 |
有人喜欢把 build 放在 script 里的 prepublishOnly,那这里就可以跳过 build 阶段
5. TODO: 使用 git hook 自动更新版本号
tbc…