Gitlab使用semantic-release发布私有npm仓库误访问公有仓报错
这是配置错误导致的问题,和版本兼容性无关,按以下步骤修改即可:
1. 修正 package.json 配置
首先将private字段改回false,然后修改publishConfig,补充顶层registry和access配置,避免插件读取默认公有源:
"publishConfig": { "@mygroup:registry": "https://gitlab.com/api/v4/projects/XXXXXX/packages/npm/", "registry": "https://gitlab.com/api/v4/projects/XXXXXX/packages/npm/", "access": "public" }
注意:access设为public是作用域包发布到私有仓库的必填配置,否则会被识别为私有包跳过发布
2. 修正 .npmrc 配置
你当前的配置存在两个问题:一是作用域源地址和publishConfig不一致,二是配置行多了冗余引号,修改为以下内容即可:
//gitlab.com/api/v4/projects/XXXXXX/packages/npm/:_authToken=YYYYYYYYYYYYYYYYY @mygroup:registry=https://gitlab.com/api/v4/projects/XXXXXX/packages/npm/
不需要保留组级npm源的冗余配置,统一使用项目级npm源地址即可
3. 修正 .releaserc.json 配置
- 移除
@semantic-release/gitlab插件下的空verifyConditions配置,避免跳过必要的权限校验 - 给
@semantic-release/npm插件显式指定registry地址,强制使用私有源
修改后的完整配置:
{ "branches": ["main"], "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", [ "@semantic-release/gitlab", { "gitlabUrl": "https://gitlab.com", "gitlabApiPathPrefix": "/api/v4" } ], [ "@semantic-release/npm", { "registry": "https://gitlab.com/api/v4/projects/XXXXXX/packages/npm/" } ], [ "@semantic-release/git", { "assets": ["package.json"], "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" } ] ] }
4. 修正 .gitlab-ci.yml 配置
移除冗余的git凭证配置,避免和semantic-release的自动鉴权逻辑冲突,修改后的配置:
default: image: node:14.17 stages: - publish Publish: stage: publish script: - npm ci - npm run semantic-release --debug
*不需要在CI脚本中硬编码令牌,直接在Gitlab项目后台的「设置- CI/CD -变量」中配置以下变量即可:
GL_TOKEN:勾选了api、read_repository、write_repository权限的个人访问令牌NPM_TOKEN:和GL_TOKEN使用相同的值即可*
错误原因说明
你之前的问题核心是@semantic-release/npm v7版本没有读取到正确的私有源配置:当publishConfig没有顶层registry字段时,插件会回退到npm默认的公有源https://registry.npmjs.org进行鉴权,和你配置的作用域源无关。而你将private设为true后不报错,是因为semantic-release默认会跳过私有包的npm发布步骤,没有执行鉴权逻辑而已。
本地验证方法
修改完配置后可以先执行以下命令验证配置是否生效:
- 执行
npm config get @mygroup:registry,确认返回你的私有仓库地址 - 执行
npm whoami --registry=https://gitlab.com/api/v4/projects/XXXXXX/packages/npm/,确认返回你的Gitlab用户名,代表令牌权限正常
内容的提问来源于stack exchange,提问作者jfalomir123
相关产品推荐
相关产品推荐

