Gitlab CI安装Gitlab私有NPM包时授权失败问题排查
问题:GitLab CI中安装私有npm包出现401未授权错误
背景信息
- 两个同属
frontend组的GitLab项目:- 包发布项目:
https://gitlab.com/company/frontend/design-system-package - 依赖使用项目:
https://gitlab.com/company/frontend/design-system-app
- 包发布项目:
- 创建了权限为
read_package_registry的Deploy Token,命名为PACKAGE_ACCESS_TOKEN
当前CI配置(.gitlab-ci.yml)
image: node:16.14.2 pages: cache: paths: - node_modules/ script: - echo "//${CI_SERVER_HOST}/api/v4/projects/<projectNumber>/packages/npm/:_authToken=${PACKAGE_ACCESS_TOKEN}">.npmrc - npm install - npm run build artifacts: paths: - public only: - main
注:此处填写的
<projectNumber>是依赖使用项目的编号,而非包发布项目的编号
CI执行错误信息
$ npm config set -- //gitlab.com/api/v4/projects/XXXXXX/packages/npm/:_authToken=${PACKAGE_ACCESS_TOKEN} $ npm config set @companyName:registry=https://gitlab.com/api/v4/projects/XXXXXX/packages/npm/ $ npm install npm ERR! code E401 npm ERR! 401 Unauthorized - GET https://gitlab.com/api/v4/projects/39790545/packages/npm/@companyName/kb/-/@companyName/kb-0.0.10.tgz npm ERR! A complete log of this run can be found in: npm ERR! /root/.npm/_logs/2023-03-14T20_27_58_496Z-debug-0.log Cleaning up project directory and file based variables 00:01 ERROR: Job failed: exit code 1
本地正常工作的.npmrc配置
@company:registry=https://gitlab.com/api/v4/packages/npm/ //gitlab.com/api/v4/packages/npm/:_authToken=${PACKAGE_ACCESS_TOKEN}
本地已配置同名环境变量
PACKAGE_ACCESS_TOKEN
问题原因与解决方案
核心问题
CI配置中错误使用了依赖使用项目的编号,且配置的项目级仓库地址与私有包实际存储的包发布项目仓库不匹配;同时CI的registry配置和本地的组级仓库配置不一致,导致npm请求地址错误或权限验证失败。
解决方案
有两种可行配置方式:
方式1:使用组级npm仓库(推荐,同组项目适配性更强)
修改CI的script部分,和本地配置保持一致,使用组级registry:
script: - echo "@company:registry=https://gitlab.com/api/v4/packages/npm/" >> .npmrc - echo "//gitlab.com/api/v4/packages/npm/:_authToken=${PACKAGE_ACCESS_TOKEN}" >> .npmrc - npm install - npm run build
这种配置下,npm会自动在组级仓库中检索同组内所有项目发布的私有包,只要Deploy Token具备组级的read_package_registry权限即可正常访问。
方式2:使用项目级npm仓库(指定包发布项目)
若需使用项目级地址,必须填写包发布项目的编号(即错误日志中出现的39790545),而非依赖使用项目的编号:
script: - echo "@companyName:registry=https://gitlab.com/api/v4/projects/<包发布项目编号>/packages/npm/" >> .npmrc - echo "//gitlab.com/api/v4/projects/<包发布项目编号>/packages/npm/:_authToken=${PACKAGE_ACCESS_TOKEN}" >> .npmrc - npm install - npm run build
额外检查项
- 确认Deploy Token已勾选
read_package_registry权限 - 确认CI环境变量
PACKAGE_ACCESS_TOKEN已正确设置(可在项目Settings > CI/CD > Variables中配置,组级变量需确保项目能继承)
内容的提问来源于stack exchange,提问作者sebazelonka
相关产品推荐
相关产品推荐

