GitLab CI执行npm view查询包版本报401未授权错误排查
问题原因
- 笔误问题:脚本中获取包名的命令写错了路径,
require('.package.json')少了路径斜杠,应为require('./package.json'),该问题会导致读取到错误的包名,但不是触发401的核心原因。 - 认证头缺失:npm 默认仅在
publish这类写操作请求中携带配置的 authToken,执行npm view这类读元数据的GET请求时,不会主动携带认证信息,直接访问需要鉴权的GitLab包接口就会返回401。 - 路径匹配偏差:原配置中registry地址末尾带了斜杠,npm实际发起元数据请求时路径末尾无斜杠,会导致预先配置的authToken无法匹配到请求路径,相当于未传token。
- 权限配置问题:高版本GitLab默认关闭CI_JOB_TOKEN对包注册表的读权限,就算请求带了token也会被拦截返回401。
解决方法
按以下步骤修改配置即可:
- 修正包名读取的笔误,统一registry和authToken的配置路径,去掉registry地址末尾的斜杠,新增
always-auth=true配置强制npm所有请求都携带token。 - 进入GitLab项目的 设置 > CI/CD > 令牌权限 页,开启
CI_JOB_TOKEN对包注册表的访问权限。 - 替换原有脚本为修正后的版本:
npm-package: stage: build image: node:buster before_script: - git config --global user.name "${GITLAB_USER_NAME}" - git config --global user.email "${GITLAB_USER_EMAIL}" script: # 统一配置registry,去掉末尾斜杠,开启强制认证 - npm config set @${CI_PROJECT_ROOT_NAMESPACE}:registry=https://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm - npm config set //${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN} - npm config set //${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:always-auth=true # 修正包名读取的路径笔误 - NPM_PACKAGE_NAME=$(node -p "require('./package.json').name") - NPM_PACKAGE_VERSION=$(node -p "require('./package.json').version") - echo "Current package: ${NPM_PACKAGE_NAME}@${NPM_PACKAGE_VERSION}" - | # 捕获npm view的错误,首次发布时包不存在也会正常走发布流程 VERSIONS=$(npm view "${NPM_PACKAGE_NAME}" versions 2>/dev/null || echo "") if [[ $VERSIONS != *"'${NPM_PACKAGE_VERSION}'"* ]]; then npm publish echo "Successfully published version ${NPM_PACKAGE_VERSION} of ${NPM_PACKAGE_NAME} to GitLab's NPM registry: ${CI_PROJECT_URL}/-/packages" else echo "Version ${NPM_PACKAGE_VERSION} of ${NPM_PACKAGE_NAME} has already been published, skip publish step." fi
- 额外说明:脚本里给
npm view加了错误重定向,首次发布包不存在时命令会报错,重定向后不会中断流水线,会正常执行首次发布。
内容的提问来源于stack exchange,提问作者Haru
相关产品推荐
相关产品推荐

