将NPM包发布到内部GitLab软件包注册表的流水线时出错,PUT 403

后端开发 2026-07-11

在使用一个集中式的软件包注册表的内部GitLab实例时,GitLab流水线因为 npm publish 而返回403 Forbidden。

按指示配置分组和项目 使用专用、按类型的注册表来管理软件包
我使用了官方推荐的认证方式,使用 "CI_JOB_TOKEN"。

设置概览:

分组 "companyname-package-reg" 包含针对每种软件包类型(npm等)的多个项目,仅用于软件包(不包含源代码)。
分组 "companyname" 包含单个项目 "lib",其中包含用于创建软件包的源代码。

每个软件包(npm等)项目都为项目 "lib" 设置了 "CI/CD作业令牌白名单"。
在作业令牌权限中将授权的分组和项目设为 "所有分组和项目" 仍然会出现相同的错误。

npm ERR! 403 403 Forbidden - PUT https://gitlab.<company>/api/v4/projects/<id>/packages/npm/@package-reg%2f<package1>
npm ERR! 403 In most cases, you or one of your dependencies are requesting
npm ERR! 403 a package version that is forbidden by your security policy, or
npm ERR! 403 on a server you do not have access to.

在Stack Overflow和 GitLab论坛 上关于类似错误的解答都没有奏效。

使用CI_DEPLOY_PASSWORD的方式流水线可以成功,但这不是一个好的解决方案,因为它会使软件包注册表中的该软件包显示为 "Manually Published",从而产生误导。

更新: 要让CI_JOB_TOKEN生效:触发流水线的用户("lib" 项目)必须是软件包注册表分组("companyname-package-reg")的成员,且具备至少 "Developer" 权限,并且在每个软件包注册表项目(npm等)中,需要启用对 "Repository" 与 "CI/CD" 的权限(不仅是对 "Package registry" 的权限)。

解决方案

这个问题通常与在使用CI_JOB_TOKEN通过GitLab软件包注册表时的权限有关。

即使已配置CI/CD作业令牌白名单,作业令牌仍然继承触发流水线的用户的权限。

为解决此问题,请确保:

  1. 触发流水线的用户是目标软件包注册表分组的成员(如companyname-package-reg)
  2. 该用户至少拥有Developer访问权限
  3. 在每个软件包注册表项目中,确保启用CI/CD权限(不仅仅是对软件包注册表的访问权限)
  4. 验证项目ID和注册表URL是否正确

之所以CI_DEPLOY_PASSWORD能工作,是因为它使用了显式凭据,而CI_JOB_TOKEN则依赖于用户权限。

一旦设定了正确的分组成员资格和权限,CI_JOB_TOKEN应该能够在没有403错误的情况下工作。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章