1. 搭建 Nexus

这部分内容网上有非常多的教程可以参考。

1.1 本地临时起个 docker container 用于玩耍

1
docker pull sonatype/nexus3  # 官方镜像

创建 Container 设置本地端口 8000
本地访问 localhost:8000
打开后在会提示admin的密码在这个文件里:/nexus-data/admin.password
照做后进入界面。

1.2 创建 blob 存储

npm-hub

之后的内容可以参考这篇文章:使用Nexus搭建npm私服
简述一下就是创建了 2 个 npm 的 Repository + 1 个 group

  1. local-npm 本地自己的仓库
  2. proxy-npm 远程仓库地址
  3. group-npm 将2个仓库,添加到group中

可以修改的一处是加一个淘宝的镜像 registry 的 Repository

命名为:taobao-npm
Proxy 填写:https://registry.npm.taobao.org
并且也加到刚才的 group-npm 中。

另外值得注意的是 local-npm 中,Deployment policy 的设置可以是:

  1. Allow redeploy
  2. Disable redeploy

    用来控制 npm publish 的时候,相同的版本号是否允许发布并且覆盖原来的内容,这个根据实际策略来决定,我们最终方案选择保留两个本地仓库,一个允许覆盖,一个严格要求版本号递增。

还有一个要做的是在 Realms 中把 npm Bearer Token Realm 加到右边的 Active 列表中

Realms

2. 使用私有 npm 仓库

在 Repository 中找到 local-npm,点击 copy 可以看到本地仓库的地址
local-npm registry

然后在实际的项目中修改 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 的权限给所有发布的人。

    1. 可以在 Nexus 中创建一个用于允许发布的角色 nx-deploy

      创建 deploy 角色

      并且给这个角色 nx-component-uploadnx-repository-view 的权限

    2. 基于这个角色,创建一个可以发布的用户: 下图中的 deployment

      创建 deployment 用户

有了这个用户后就可以登录了。

  1. npm login
    1
    2
    3
    npm login --registry=http://localhost:8000/repository/local-npm/
    username: deployment
    password: xxxx
    注意是本地仓库的地址,而不是安装时的 registry

如果登录失败可以检查一下 .npmrc 中的 registry 或者 有无已经配置的用户名密码

  1. npm publish
    1
    npm publish --registry=http://localhost:8000/repository/local-npm/

4. 使用 GitLab CI 把发布自动化

自动化就要省去所有手敲命令

  1. 首先在工具库项目下的 package.json 文件中加入

    1
    2
    3
    "publishConfig": {
    "registry": "http://localhost:8000/repository/local-npm/"
    }
  2. .npmrc 文件中

    1
    2
    3
    registry=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
  1. 配置 .gitlab-ci.yml

简述一下步骤就是:

  • build 生成发布所需的 dist/
  • 执行 npm publish

可以参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
image: 一个有node环境的基础镜像即可

stages:
- build
- publish

build:
stage: build
only:
- master
before_script:
- npm i
script:
- npm run build
cache:
paths:
- node_modules/
artifacts:
paths:
- dist/

npm-publish:
stage: publish
when: manual
only:
- master
script:
- npm publish

有人喜欢把 build 放在 script 里的 prepublishOnly,那这里就可以跳过 build 阶段

5. TODO: 使用 git hook 自动更新版本号

tbc…