本文介紹如何將一個 Nexus 特定倉庫中的 npm 包內容遷移到另一個 Nexus 特定倉庫。此過程適用于需要重構倉庫結構或合并倉庫的場景。
遷移腳本
以下是完整的遷移腳本,它會自動完成以下操作:
- 從源倉庫獲取所有 npm 包列表
- 下載每個包的 .tgz 文件
- 解壓并重新發布到目標倉庫
#!/bin/bash# === 配置區域 ===
NEXUS_URL="https://nexus.test.com"
USERNAME="test"
PASSWORD="123456"SOURCE_REPO="npm-a"
TARGET_REPO="npm-b"SOURCE_REGISTRY="$NEXUS_URL/repository/$SOURCE_REPO/"
TARGET_REGISTRY="$NEXUS_URL/repository/$TARGET_REPO/"TMP_DIR="/tmp/npm-migrate"
mkdir -p "$TMP_DIR"
cd "$TMP_DIR" || exit 1
# =================# ? 日志處理:同時輸出到終端和日志文件
LOG_FILE="$TMP_DIR/npm-migrate.log"
exec > >(tee -a "$LOG_FILE") 2>&1log() {echo "[$(date '+%F %T')] $*"
}log "🚀 啟動 npm 倉庫遷移腳本"# 遇到錯誤不中斷腳本
set +eTOKEN=""while true; dolog "📥 獲取包列表,continuationToken=$TOKEN"RESPONSE=$(curl -s -u "$USERNAME:$PASSWORD" \"$NEXUS_URL/service/rest/v1/components?repository=$SOURCE_REPO${TOKEN:+&continuationToken=$TOKEN}")ITEM_COUNT=$(echo "$RESPONSE" | jq '.items | length')log "📦 本頁包含 $ITEM_COUNT 個包"echo "$RESPONSE" | jq -c '.items[]' | while read -r item; doname=$(echo "$item" | jq -r '.assets[0].path' | cut -d/ -f1)version=$(echo "$item" | jq -r '.version')log "?? 處理 $name@$version"tarball_url="${SOURCE_REGISTRY}${name}/-/${name}-${version}.tgz"tarball_file="${name}-${version}.tgz"log "🌐 下載包: $tarball_url"curl -s -u "$USERNAME:$PASSWORD" -O "$tarball_url"if [[ -f "$tarball_file" ]]; thentar -xzf "$tarball_file"pkg_dir="package"# 可選:檢查是否已存在(加快速度)EXISTS=$(curl -s -u "$USERNAME:$PASSWORD" "$TARGET_REGISTRY$name" | grep "\"$version\"")if [[ -n "$EXISTS" ]]; thenlog "? $name@$version 已存在于目標倉庫,跳過發布"elselog "🚀 發布 $name@$version 到 $TARGET_REPO"npm publish "$pkg_dir" --registry "$TARGET_REGISTRY" --forceif [[ $? -ne 0 ]]; thenlog "? 發布失敗:$name@$version"elselog "? 發布成功:$name@$version"fifirm -rf "$tarball_file" "$pkg_dir"elselog "? 下載失敗:$tarball_url"fidone# 分頁處理TOKEN=$(echo "$RESPONSE" | jq -r '.continuationToken')if [[ "$TOKEN" == "null" || -z "$TOKEN" ]]; thenlog "? 所有包處理完成,無更多分頁"breakelselog "?? 獲取下一頁 continuationToken=$TOKEN"fi
donelog "🏁 所有遷移已完成"
在 ~/.npmrc
中配置目標倉庫的 auth 認證信息,因為發布包要使用,內容如下示例:
registry=https://nexus.test.com/repository/npm-b/
//nexus.test.com/repository/npm-b/:_auth=c45h2312asmh3dsfYW3fassaawRAxMde=
//nexus.test.com/repository/npm-b/:always-auth=true
其中 _auth 后面的內容是對 “賬號:密碼” 進行base64之后的字符串,注意賬號密碼使用英文冒號分隔拼接在一起后統一 base64。
使用說明
-
確保已安裝
curl
,jq
,npm
和tar
工具 -
確保有源倉庫和目標倉庫的訪問權限
執行腳本:
chmod +x migrate.sh
./migrate.sh
注意事項
-
此腳本僅處理源倉庫中的第一頁數據(默認100條記錄),如需處理更多數據,需要添加分頁邏輯
-
遷移過程中會保留原始包的版本信息
-
使用
--force
參數強制發布,可能會覆蓋目標倉庫中已存在的同名包 -
腳本執行完畢后會自動清理臨時文件
(END)