發佈Gitlab上的private npm package
Scenario
假設目前我有個gitlab project在一個gitlab group下
這個gitlab group叫做foobar
而我們希望將在這個project發佈一個npm package
實做方式
主要就是在跟package.json的同個目錄
建立一個.npmrc再執行npm publish
基本上使用gitlab ci設定即可
調整package.json
name
必須設定格式為: @{group-name}/{package-name}
例如: @foobar/my-package
publishConfig
package.json必須加入以下publishConfig屬性
project-id可在gitlab project首頁查詢到
{
"publishConfig": {
"@foobar:registry": "https://gitlab.com/api/v4/projects/{your-project-id}/packages/npm/"
}
}
建立Deploy Token
需要建立一個Deploy Token(需要有read/write package權限)
前往Settings > Repository > Deploy Token建立
並把這個Deploy Token的password設定至CI/CD Variable(假設為PACKAGE_DEPLOY_TOKEN)
gitlab-ci.yml設定
publish:
stage: deploy
only:
variables:
- $CI_COMMIT_TAG =~ /deploy/
script:
- cd $CI_PROJECT_DIR/app
- yarn build
- echo "@${CI_PROJECT_NAMESPACE}:registry=https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/" >> .npmrc
- echo "//gitlab.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${PACKAGE_DEPLOY_TOKEN}" >> .npmrc
- npm publish
設定好之後
使用含有deploy字串的git tag即可觸發
變數說明
CI_PROJECT_NAMESPACE: Gitlab Ci的預設變數, 為group或personal id
CI_PROJECT_ID: Gitlab project id
公開package
若希望這個package可以被任何人安裝使用
可在Gitlab project的Settings > Gerneral > Visibility設定中
將Package registry的Allow anyony to pull from package registry啟用即可
使用package(project level)
前往Packages and registries > Package registry中
即可看到前面publish成功的套件
設定.npmrc
基本上只要複製上述echo那段的command即可
若是要安裝為global套件
需要將 >> .yarnrn 改成 >> ~/.yarnrc
如果是要使用sudo yarn global add安裝
則是要切換到root身份
改為使用以下指令設定
echo \"@foobar:registry\" \"https://gitlab.com/api/v4/projects/{your-project-id}/packages/npm/\" > ~/.yarnrc
Gitlab Registry驗證設定
若這個package不是公開的
則需要經過驗證設定
# instance level
npm config set -- //your_domain_name/api/v4/packages/npm/:_authToken=your_token
# project level
npm config set -- //your_domain_name/api/v4/projects/your_project_id/packages/npm/:_authToken=your_token
安裝
設定好.npmrc之後
即可開始安裝
常見問題
403 error
通常為Package registry的版號已存在
只要更新package.json的版本號
或是刪除package registry的版本號即可