私有化輕量級持續集成部署方案–07-私有NPM倉庫-Verdaccio
提示:本系列筆記全部存在於
Github,
可以直接在
Github 查看全部筆記
對於個人來說,私有NPM倉庫 作用性基本很小,但是對於企業,私有NPM倉庫 可以保護程式碼暴露,具有很大的意義。
也是為了學習搭建 私有NPM倉庫,就在持續部署中集成了私有倉庫。
開源社區,有兩個廣泛使用的 私有NPM倉庫 項目:
Sinopia
項目官方於2019年已經不再維護,也就是現在已經不在推薦使用此項目。
Verdaccio
項目是從 Sinopia
項目 fork 出來的,官方聲稱 100% 向後兼容 Sinopia
。
Verdaccio
目前也就成了最普遍的 私有NPM倉庫 的解決方案。
Verdaccio
Verdaccio 概述
Verdaccio
是一個 Node
創建的輕量的私有 npm proxy registry
Verdaccio
中最強大的兩個功能是 上行鏈路 和 包身份許可權
Verdaccio 部署
Docker Compose 文件
Verdaccio
的 Docker 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
會在首次運行時創建此文件。
但因為使用了 宿主目錄 掛載數據,所以需要預先創建此文件。
# 包存儲地址
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: //registry.npmjs.org/ # 上行地址
timeout: 30s # 超時時間
taobao: # 上行名稱
url: //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。
PS:用戶認證 可以自定義為其它插件
unlinks(上行鏈路)
unlinks(上行鏈路) 是設置上游代理倉庫的屬性。
unlinks(上行鏈路) 可以配置多個地址,針對每一個 unlinks(上行鏈路) 都可以做不同設置。
詳細請參考 verdaccio–上行鏈路
默認的 unlinks(上行鏈路) 為 npmjs。
packages(訪問許可權)
packages(訪問許可權) 是設置包訪問許可權的屬性。
可以根據名稱對一個 或 一組 包分別對 訪問、發布、代理等操作做不同的設置。
上述配置 簡單的對所有包統一處理。
配置中訪問、發布 許可權設置為了 $authenticated, 這個值是 Verdaccio
預設的變數值,表示登錄用戶。
還可以將許可權設置為 其它變數值 或 指定用戶,詳細請參考 verdaccio–包的訪問
執行部署
配置文件準備就緒,就可以執行部署,部署成功後就可以訪問頁面
PS: 注意開啟雲伺服器 4873 埠號防火牆
掛載目錄許可權
默認情況下 Verdaccio
容器不具有宿主機目錄的操作許可權。
將容器目錄掛載到宿主機後,Verdaccio
執行寫入操作時,會返回許可權錯誤。
解決這個問題,需要賦予 Verdaccio
容器 寫入宿主機目錄的許可權。
sudo chown -R 10001:65533 /volumes/verdaccio
測試Verdaccio倉庫
部署成功後,可以在本地創建一個測試項目,發布到 Verdaccio
倉庫中。
對於個人來說,私有NPM倉庫 作用性基本很小,但是對於企業,私有NPM倉庫 可以保護程式碼暴露,具有很大的意義。
也是為了學習搭建 私有NPM倉庫,就在持續部署中集成了私有倉庫。
開源社區,有兩個廣泛使用的 私有NPM倉庫 項目:
Sinopia
項目官方於2019年已經不再維護,也就是最好不要再使用此項目進行搭建。
Verdaccio
項目是從 Sinopia
項目 fork 出來的,官方聲稱 100% 向後兼容 Sinopia
。
Verdaccio
目前就成了普遍的 私有NPM倉庫 的解決方案。
Verdaccio
Verdaccio 概述
Verdaccio
是一個 Node
創建的輕量的私有 npm proxy registry
Verdaccio
提供了上行鏈路功能, 安裝 Verdaccio
倉庫中不存在的包時,可以配置向上游倉庫下載。
Verdaccio
還提供了強大的身份認證系統。
Verdaccio 部署
Docker Compose 文件
Verdaccio
的 Docker 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
會在首次運行時創建此文件。
但因為使用了 宿主目錄 掛載數據,所以需要預先創建此文件。
# 包存儲地址
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: //registry.npmjs.org/ # 上行地址
timeout: 30s # 超時時間
taobao: # 上行名稱
url: //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。
PS:用戶認證 可以自定義為其它插件
unlinks(上行鏈路)
unlinks(上行鏈路) 屬性是 Verdaccio
配置上游代理倉庫的屬性。
unlinks(上行鏈路) 可以配置多個地址,針對每一個 unlinks(上行鏈路) 都可以做不同設置。
詳細請參考 verdaccio–上行鏈路
默認的 unlinks(上行鏈路) 為 npmjs。
packages(訪問許可權)
packages(訪問許可權) 屬性是 Verdaccio
配置包訪問許可權的屬性。
可以根據名稱對一個 或 一組 包對 訪問、發布、代理等不同操作做不同設置。
上述配置 只簡單的 對所有進行了統一處理 中。
配置中訪問、發布 許可權設置為了 $authenticated, 這個值是 Verdaccio
預設的變數值,表示登錄用戶。
還可以將許可權設置為 其它變數值 或 指定用戶,詳細請參考 verdaccio–包的訪問
執行部署
配置文件準備就緒,就可以執行部署,隨後訪問頁面
PS: 注意開啟雲伺服器 4873 埠號防火牆
掛載目錄許可權
默認情況下 Verdaccio
容器不具有宿主機目錄的操作許可權。
將容器容器目錄掛載到宿主機後,Verdaccio
執行寫入操作時,會返回許可權錯誤。
解決這個問題,需要賦予 Verdaccio
容器 寫入宿主機目錄的許可權。
sudo chown -R 10001:65533 /volumes/verdaccio
測試Verdaccio倉庫
部署成功後,可以在本地創建一個測試項目,發布到 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 //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 //10.0.24.12:4873/$1;
}
}
重啟 網關服務 和 Verdaccio
容器
docker exec -it gateway nginx -s reload
Drone 配置私有 NPM 倉庫
Drone
持續部署中集成 Verdaccio
倉庫,需要在執行時登錄 倉庫。
NPM 會將登錄憑證存儲在 .npmrc 文件中。
也就是需要一個插件執行登錄操作,並將登錄憑證寫入 .npmrc 文件
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: //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 //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 # 鏡像名稱
可以將Drone
中 node_modules
快取清除,然後提交測試