使用自建Nexus server作為NPM的Registry 倉庫

Paul Tang
Sep 17, 2021

--

此篇只是個人心得筆記,較為簡略,不過有附上查詢的資料來源,有興趣可以自己去深入了解

很多公司都會有自己建立自己package的需求,例如npm for JS, pip for Python,也因為安全性($$$) 考量,可能回需要自己架設registry server,此時Nexus就是一個很好的選擇,可以安裝在一般的server也可以安裝在k8s cluster內,相當方便。

不過如果寫好package要推送也會遇到一些問題,這邊做一個簡單的筆記說明一下,以npm為例

如果你寫好一包npm package,想要推送到registry的時候基本上就是使用 npm publish 這個指令,不過如果沒有選定registry,他會用預設的 npm registry,這不是我們要的,所以如果需要推到自家架的Nexus server,可能會需要用到下列cmd

npm publish --registry http://localhost:8081/repository/npm-internal/

當你開始使用這個指令的時候,系統會要你登入,你可以使用

npm adduser --registry=http://localhost:8081/repository/npm-internal/

獲得,不過可能也有一些情況是沒有辦法這樣手動登入的(例如CI/CD building),此時我們就可以把auth 資訊放在目錄下的 .npmrc file 裏面,然後就可以使用Basic Auth來做認證,用 username:password 的格式做base64後得到

## username:password
echo -n 'admin:admin123' | openssl base64 # YWRtaW46YWRtaW4xMjM=

然後你的 .npmrc 會長成這樣

email=you@example.com
always-auth=true
_auth=YWRtaW46YWRtaW4xMjM=

不過在這之前,需要先在你的nexus server上面做一些basic auth開啟的設定

然後基本上應該就可以順利的 npm publish 到你的私人registry了

如果publish遇到奇怪的問題,例如明明加上了 .npmrc 也確定 _auth 是正確的格式,結果噴錯

npm ERR! code ENEEDAUTH
npm ERR! need auth This command requires you to be logged in.
npm ERR! need auth You need to authorize this machine using `npm adduser`

可以看一下你執行 npm publish 的時候所帶的 --registry url 最後有沒有 / 如果沒有的話會失敗喔!

npm publish 
--registry http://localhost:8081/repository/npm-internal/ -> ok
npm publish
--registry http://localhost:8081/repository/npm-internal -> ERR with no auth

Source:

  1. https://help.sonatype.com/repomanager3/formats/npm-registry
  2. https://levelup.gitconnected.com/deploying-private-npm-packages-to-nexus-a16722cc8166
  3. https://stackoverflow.com/questions/57279087/authentication-error-on-publishing-to-private-npm-repository-on-nexus

--

--

Paul Tang
Paul Tang

Written by Paul Tang

初來乍到,剛到東京的菜鳥後端工程師,希望有一天能成為獨當一面的Full Stack Hacker

No responses yet