Engineering/DevOps

npm package Nexus bulk upload

망고v 2023. 8. 30. 11:20

방안

yarn을 통한 package 다운로드

프로젝트 / 경로 .yarnrc 파일 생성

yarn-offline-mirror "./npm_packages"
yarn-offline-mirror-pruning true

우선 yarn install로 ./npm_packages 이하 dependency package들 tgz 파일 다운로드

➜ yarn install
yarn install v1.22.19
warning ../../../package.json: No license field
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
✨  Done in 30.95s.

 

Nexus Upload 

Local PC .npmrc 파일 설정

➜  echo -n 'admin:{{nexus패스워드}}' | openssl base64
{{인증값}}

➜  cat ~/.npmrc
registry=http://localhost:8081/nexus/repository/npm-private/
//localhost:8081/nexus/repository/npm-private/:_auth={{인증값}}

 

npm publish 

#bin/bash

echo "!!Nexus upload start!!"

cd npm_packages

for _i in $(ls)
do
    if [ ! -d $_i ]
    then
        echo "npm publish" $_i
        npm publish $_i
    fi
done

echo "!!Nexus upload end!!"

 

결과 확인

 

 

 

실패#1

npm 프로젝트 ./node_modules 폴더 상위 경로에서 아래 shell 수행

: 일부(?) package들이 error 발생하여 전체 package가 정상적으로 Nexus에 업로드되지 않음!!

#bin/bash

echo "!!npm upload start!!"

cd node_modules

for _i in $(ls)
do
    if [ -d $_i ]
    then
        echo "npm publish" $_i
        cd $_i
        npm publish
        cd ..
    fi
done

echo "!!npm upload end!!"

 

node_modules 폴더 이하 yallist 폴더에서 아래와 같이 publish 수행

: git 에러가 발생하지만, Nexus에 package 업로드되는 경우도 발생

 

실패#2

node_modules 이하 package들이 결국 https://registry.npmjs.org/ 에서 tgz 파일을 http GET 하는 것으로 판단

npm으로 download-tgz 설치 후, npm프로젝트 폴더에서 아래 명령 실행

➜ npm i download-tgz -g
➜ download-tgz package-json ./package.json

./tarballs 폴더 이하 package.json에 정의된 모든 package가 tgz 형태로 다운로드

Nexus에 등록된 package와 구조가 비슷하니 upload만 되면 마무리될 것으로 예상

./tarballs 폴더로 이동하여 아래 수행

: bulk-npm-publish 는 npm으로 설치 후 실행 필요

➜  npm i bulk-npm-publish -g
..생략..
➜  bulk-npm-publish \
   --storage-path . \
   --registry http://localhost:8081/nexus/repository/npm-private/

위 명령어가 실행되면 아래와 같이 npm publish 명령어가 작성된 publish.sh 파일 생성

➜  cat publish.sh
npm publish @babel/runtime/runtime-7.22.11.tgz --registry=http://localhost:8081/nexus/repository/npm-private/
npm publish @hypnosphi/create-react-context/create-react-context-0.3.1.tgz --registry=http://localhost:8081/nexus/repository/npm-private/
npm publish @loadable/component/component-5.15.3.tgz --registry=http://localhost:8081/nexus/repository/npm-private/
npm publish ajv/ajv-6.12.6.tgz --registry=http://localhost:8081/nexus/repository/npm-private/

 

이 후, publish.sh 실행하면 git 인증을 유도하면서 오류 발생