私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

莫問今朝乄發表於2022-02-25
提示:本系列筆記全部存在於 Github, 可以直接在 Github 檢視全部筆記

對於個人來說,私有NPM倉庫 作用性基本很小,但是對於企業,私有NPM倉庫 可以保護程式碼暴露,具有很大的意義。

也是為了學習搭建 私有NPM倉庫,就在持續部署中整合了私有倉庫。

開源社群,有兩個廣泛使用的 私有NPM倉庫 專案:

  1. Sinopia
  2. Verdaccio

Sinopia 專案官方於2019年已經不再維護,也就是現在已經不在推薦使用此專案。

Verdaccio 專案是從 Sinopia專案 fork 出來的,官方聲稱 100% 向後相容 Sinopia

Verdaccio 目前也就成了最普遍的 私有NPM倉庫 的解決方案。

Verdaccio

Verdaccio 概述

Verdaccio 是一個 Node 建立的輕量的私有 npm proxy registry

Verdaccio 中最強大的兩個功能是 上行鏈路包身份許可權

Verdaccio 部署

Docker Compose 檔案

VerdaccioDocker Compose 檔案比較簡單,主要是配置資料掛載


version: '3.9'

services:
  verdaccio:
    image: verdaccio/verdaccio:5.5
    container_name: verdaccio
    restart: always
    ports:
      - '4873:4873'
    volumes:
      - /volumes/verdaccio/conf:/verdaccio/conf
      - /volumes/verdaccio/storage:/verdaccio/storage
      - /volumes/verdaccio/plugins:/verdaccio/plugins

config.yaml

Verdaccio 專案提供了一個配置檔案: config.yaml

預設情況下 Verdaccio 會在首次執行時建立此檔案。

但因為使用了 宿主目錄 掛載資料,所以需要預先建立此檔案。

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio
# 包儲存地址
storage: /verdaccio/storage

# 外掛儲存地址
plugins: /verdaccio/plugins

# UI相關資訊
web:
 enable: true # 開啟 Web 頁面
 title: Verdaccio  # Web 頁面標題

# 身份認證
auth:
 htpasswd:                           # 預設情況下使用的 htpasswd 外掛作為身份認證
   file: /verdaccio/conf/htpasswd # htpasswd 檔案為加密認證資訊檔案
   max_users: -1                     # 最大使用者數量, -1 表示禁用新使用者註冊

# 上行鏈路
uplinks:
 npmjs:                                    # 上行名稱,隨便定義
   url: https://registry.npmjs.org/        # 上行地址
   timeout: 30s                            # 超時時間

                         
 taobao:                                   # 上行名稱
   url: https://registry.npm.taobao.org/   # 上行地址
   timeout: 30s                          

# 包訪問設定, 可以根據名稱對包做不同許可權設定
packages:
 '@*/*':
   access: $authenticated                # 登入使用者才允許訪問
   publish: $authenticated               # 登入使用者才允許釋出
   proxy: taobao                         # 代理上行鏈路地址

 '**':
   access: $authenticated                # 登入使用者才允許訪問
   publish: $authenticated               # 登入使用者才允許釋出
   proxy: taobao                         # 代理上行鏈路地址

server:
 keepAliveTimeout: 30                    # 伺服器保持活動連結的時間,較大的包可能會消耗一定時間,此屬性就是設定活動連結時間

middlewares:
 audit:
   enabled: true

# 日誌
logs: { type: stdout, format: pretty, level: http  }

config.yaml 檔案設定了一些關鍵屬性, 至於其它屬性,請參考: verdaccio--配置檔案

auth(身份認證)

auth 是設定 使用者身份憑證的屬性

Verdaccio 專案預設使用了 htpasswd 外掛作為 使用者認證 服務。

htpasswd 外掛需要提供一個儲存使用者憑證的檔案:/verdaccio/conf/htpasswd

max_users 屬性表示最大註冊使用者, 當值為 -1 時,表示禁止使用者註冊;當值不為 -1時,可以使用 npm adduser 命令新增使用者。

禁用使用者註冊時,可以使用 htpasswd-generator工具 生成身份憑證,然後儲存在 /verdaccio/conf/htpasswd

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio 私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

PS:使用者認證 可以自定義為其它外掛

unlinks(上行鏈路)

unlinks(上行鏈路) 是設定上游代理倉庫的屬性。

unlinks(上行鏈路) 可以配置多個地址,針對每一個 unlinks(上行鏈路) 都可以做不同設定。

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

詳細請參考 verdaccio--上行鏈路

預設的 unlinks(上行鏈路)npmjs

packages(訪問許可權)

packages(訪問許可權) 是設定包訪問許可權的屬性。

可以根據名稱對一個 或 一組 包分別對 訪問、釋出、代理等操作做不同的設定。

上述配置 簡單的對所有包統一處理。

配置中訪問、釋出 許可權設定為了 $authenticated, 這個值是 Verdaccio 預設的變數值,表示登入使用者。

還可以將許可權設定為 其它變數值 或 指定使用者,詳細請參考 verdaccio--包的訪問

執行部署

配置檔案準備就緒,就可以執行部署,部署成功後就可以訪問頁面

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio 私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

PS: 注意開啟雲伺服器 4873 埠號防火牆

掛載目錄許可權

預設情況下 Verdaccio 容器不具有宿主機目錄的操作許可權。

將容器目錄掛載到宿主機後,Verdaccio 執行寫入操作時,會返回許可權錯誤。

解決這個問題,需要賦予 Verdaccio 容器 寫入宿主機目錄的許可權。

sudo chown -R 10001:65533 /volumes/verdaccio

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

測試Verdaccio倉庫

部署成功後,可以在本地建立一個測試專案,釋出到 Verdaccio 倉庫中。

對於個人來說,私有NPM倉庫 作用性基本很小,但是對於企業,私有NPM倉庫 可以保護程式碼暴露,具有很大的意義。

也是為了學習搭建 私有NPM倉庫,就在持續部署中整合了私有倉庫。

開源社群,有兩個廣泛使用的 私有NPM倉庫 專案:

  1. Sinopia
  2. Verdaccio

Sinopia 專案官方於2019年已經不再維護,也就是最好不要再使用此專案進行搭建。

Verdaccio 專案是從 Sinopia專案 fork 出來的,官方聲稱 100% 向後相容 Sinopia

Verdaccio 目前就成了普遍的 私有NPM倉庫 的解決方案。

Verdaccio

Verdaccio 概述

Verdaccio 是一個 Node 建立的輕量的私有 npm proxy registry

Verdaccio 提供了上行鏈路功能, 安裝 Verdaccio 倉庫中不存在的包時,可以配置向上遊倉庫下載。

Verdaccio 還提供了強大的身份認證系統。

Verdaccio 部署

Docker Compose 檔案

VerdaccioDocker Compose 檔案比較簡單,主要配置資料掛載


version: '3.9'

services:
  verdaccio:
    image: verdaccio/verdaccio:5.5
    container_name: verdaccio
    restart: always
    ports:
      - '4873:4873'
    volumes:
      - /volumes/verdaccio/conf:/verdaccio/conf
      - /volumes/verdaccio/storage:/verdaccio/storage
      - /volumes/verdaccio/plugins:/verdaccio/plugins

config.yaml

Verdaccio 專案提供了一個配置檔案: config.yaml

預設情況下 Verdaccio 會在首次執行時建立此檔案。

但因為使用了 宿主目錄 掛載資料,所以需要預先建立此檔案。

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio
# 包儲存地址
storage: /verdaccio/storage

# 外掛儲存地址
plugins: /verdaccio/plugins

# UI相關資訊
web:
 enable: true # 開啟 Web 頁面
 title: Verdaccio  # Web 頁面標題

# 身份認證
auth:
 htpasswd:                           # 預設情況下使用的 htpasswd 外掛作為身份認證
   file: /verdaccio/conf/htpasswd # htpasswd 檔案為加密認證資訊檔案
   max_users: -1                     # 最大使用者數量, -1 表示禁用新使用者註冊

# 上行鏈路
uplinks:
 npmjs:                                    # 上行名稱,隨便定義
   url: https://registry.npmjs.org/        # 上行地址
   timeout: 30s                            # 超時時間

                         
 taobao:                                   # 上行名稱
   url: https://registry.npm.taobao.org/   # 上行地址
   timeout: 30s                          

# 包訪問設定, 可以根據名稱對包做不同許可權設定
packages:
 '@*/*':
   access: $authenticated                # 登入使用者才允許訪問
   publish: $authenticated               # 登入使用者才允許釋出
   proxy: taobao                         # 代理上行鏈路地址

 '**':
   access: $authenticated                # 登入使用者才允許訪問
   publish: $authenticated               # 登入使用者才允許釋出
   proxy: taobao                         # 代理上行鏈路地址

server:
 keepAliveTimeout: 30                    # 伺服器保持活動連結的時間,較大的包可能會消耗一定時間,此屬性就是設定活動連結時間

middlewares:
 audit:
   enabled: true

# 日誌
logs: { type: stdout, format: pretty, level: http  }

config.yaml 檔案設定了一些關鍵屬性, 至於其它屬性,請參考: verdaccio--配置檔案

auth(身份認證)

auth 屬性是 Verdaccio 使用者身份憑證的屬性

Verdaccio 專案預設使用了 htpasswd 外掛作為 使用者認證 服務。

htpasswd 外掛需要提供一個儲存使用者憑證的檔案:/verdaccio/conf/htpasswd

max_users 屬性表示最大註冊使用者, 當值為 -1 時,表示禁止使用者註冊;當值不為 -1時,可以使用 npm adduser 命令新增使用者。

禁用使用者註冊時,可以使用 htpasswd-generator工具 生成身份憑證,然後儲存在 /verdaccio/conf/htpasswd

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio 私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

PS:使用者認證 可以自定義為其它外掛

unlinks(上行鏈路)

unlinks(上行鏈路) 屬性是 Verdaccio 配置上游代理倉庫的屬性。

unlinks(上行鏈路) 可以配置多個地址,針對每一個 unlinks(上行鏈路) 都可以做不同設定。

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

詳細請參考 verdaccio--上行鏈路

預設的 unlinks(上行鏈路)npmjs

packages(訪問許可權)

packages(訪問許可權) 屬性是 Verdaccio 配置包訪問許可權的屬性。

可以根據名稱對一個 或 一組 包對 訪問、釋出、代理等不同操作做不同設定。

上述配置 只簡單的 對所有進行了統一處理 中。

配置中訪問、釋出 許可權設定為了 $authenticated, 這個值是 Verdaccio 預設的變數值,表示登入使用者。

還可以將許可權設定為 其它變數值 或 指定使用者,詳細請參考 verdaccio--包的訪問

執行部署

配置檔案準備就緒,就可以執行部署,隨後訪問頁面

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio 私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

PS: 注意開啟雲伺服器 4873 埠號防火牆

掛載目錄許可權

預設情況下 Verdaccio 容器不具有宿主機目錄的操作許可權。

將容器容器目錄掛載到宿主機後,Verdaccio 執行寫入操作時,會返回許可權錯誤。

解決這個問題,需要賦予 Verdaccio 容器 寫入宿主機目錄的許可權。

sudo chown -R 10001:65533 /volumes/verdaccio

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

測試Verdaccio倉庫

部署成功後,可以在本地建立一個測試專案,釋出到 Verdaccio 倉庫中。

在沒有任何問題的情況下,可以成功的將專案釋出到 倉庫 中,在頁面登入時可以看到這個專案

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio 私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio 私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio 私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio 私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

閘道器配置

Verdaccio 官方文件--Reverse Proxy Setup 中給出了使用反向代理的配置。

主要是對代理頭的設定。其中至關重要的一個屬性是:proxy_set_header X-Forwarded-Proto $scheme

server {
        #SSL 訪問埠號為 443
        listen 443 ssl http2;
        #填寫繫結證書的域名
        server_name npm.mwjz.live;
        #上傳大小限制
        client_max_body_size 10M;
        #日誌
        error_log /var/log/nginx/npm/error.log;
        access_log /var/log/nginx/npm/access.log;
        #證書檔案
        ssl_certificate /etc/nginx/conf.d/ssl/npm/npm.mwjz.live_bundle.crt;
        #證書金鑰檔案
        ssl_certificate_key /etc/nginx/conf.d/ssl/npm/npm.mwjz.live.key;

        ssl_ciphers SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!3DES:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        location / {
            #   代理設定
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_read_timeout 600;
            proxy_redirect off;
            proxy_pass http://10.0.24.12:4873;
        }
        

        location ~ ^/verdaccio/(.*)$ {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_set_header X-NginX-Proxy true;
            proxy_redirect off;
            proxy_pass http://10.0.24.12:4873/$1;
        }
    }
私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio 私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

重啟 閘道器服務 和 Verdaccio 容器

docker exec -it gateway nginx -s reload

Drone 配置私有 NPM 倉庫

Drone 持續部署中整合 Verdaccio 倉庫,需要在執行時登入 倉庫。

NPM 會將登入憑證儲存在 .npmrc 檔案中。

也就是需要一個外掛執行登入操作,並將登入憑證寫入 .npmrc 檔案

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

Drone 社群中提供了一個這樣的映象外掛:robertstettner/drone-npm-auth

kind: pipeline          # 定義一個管道
type: docker            # 定義管道型別
name: build              # 定義管道名稱

volumes:                # 宣告資料卷
- name: node_modules    # 資料卷名稱
  host:                 # Host Volume
    path: /volumes/drone/volumes/web/node_modules   # 宿主機目錄

clone:
  disable: false        # 啟用程式碼拉取

steps:
  # 生成版本號標籤
  - name: build-tags  
    image: yxs970707/drone-web-tags  # 使用映象
    depends_on: [clone]   # 依賴的步驟,
    settings:
      tags:
        - latest

  # 私有 NPM 倉庫登入     
  - name: npm-login 
    image: robertstettner/drone-npm-auth
    settings:
      registry: https://npm.mwjz.live/
      username:
        from_secret: npm_username
      password:
        from_secret: npm_password
      email:
        from_secret: npm_email
  
  # 編譯專案
  - name: build-project   # 步驟名稱
    image: node:16.13.2   # 使用映象
    depends_on: [npm-login]   # 依賴的步驟,
    volumes:              # 掛載資料卷
    - name: node_modules  # 資料卷名稱
      path: /drone/src/node_modules # 容器內目錄
    commands:             # 執行命令
      - npm config set registry https://npm.mwjz.live/
      - npm config get
      - npm install       # 安裝node_modules包
      - npm run build     # 執行編譯

 # 打包Docker映象
  - name: build-image     # 步驟名稱
    image: plugins/docker # 使用映象
    depends_on: [build-tags, build-project] # 依賴步驟
    settings:             # 當前設定
      username:           # 賬號名稱
        from_secret: docker_username
      password:           # 賬號密碼
        from_secret: docker_password
      dockerfile: deploy/Dockerfile # Dockerfile地址, 注意是相對地址
      registry: docker.mwjz.live  # 私有映象倉庫地址
      repo: docker.mwjz.live/mwjz/deploy-web-demo # 映象名稱

可以將Dronenode_modules 快取清除,然後提交測試

私有化輕量級持續整合部署方案--07-私有NPM倉庫-Verdaccio

相關文章