如何从CircleCI向私有npm仓库发布包?发布失败求助
排查CircleCI发布npm包失败的常见遗漏点
针对你遇到的CircleCI发布npm包始终报错的问题,结合你提供的配置,以下是几个容易遗漏的排查方向:
1. YAML配置的缩进错误
你提供的第一个配置中,Build package步骤的command键缩进异常:
- run: name: Build package command: yarn build // tsc builds package to the lib directory
YAML对缩进有严格要求,command和name是同级键,缩进必须完全一致,这个错误会导致CircleCI无法正确解析配置,直接引发执行失败。
2. NPM_TOKEN的权限与环境变量验证
- 确认token类型:npm的访问令牌分「只读」「自动化」「发布」三种,必须使用Automation类型的令牌(用于CI/CD自动化发布),只读令牌无法执行publish操作。同时要确保令牌所属账号是目标npm包的所有者或拥有发布权限。
- 检查CircleCI变量配置:
- 环境变量名必须是
NPM_TOKEN,大小写完全匹配,不能有拼写错误。 - 变量需设置在当前项目的上下文里,避免选错组织或项目导致变量无法读取。
- 可以临时在CI步骤中添加
echo $NPM_TOKEN(测试完成后删除),验证变量是否能正常读取。
- 环境变量名必须是
3. .npmrc的配置细节
- 避免变量解析异常:建议用大括号包裹变量,确保shell正确解析:
echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc - 确认.npmrc生效位置:优先使用用户目录下的
~/.npmrc,而非项目目录,避免项目中已有.npmrc覆盖配置。 - 检查npm配置优先级:可以在publish前添加
npm config list,查看当前的registry和authToken配置是否正确。
4. 发布目录的合法性
执行npm publish lib时,必须确保lib目录下存在完整的package.json,且该文件中:
- 没有设置
private: true(私有包无法公开发布,若为私有包需指定--access restricted参数) name和version符合npm的规范,且版本号未在npm仓库中存在过
5. Node/npm版本兼容性
CircleCI的node executor默认版本可能与本地开发环境不一致,部分旧版本npm在处理认证时存在bug。建议指定与本地一致的Node版本,例如:
executor: node:18
修正后的参考配置
jobs: publish: executor: node:18 steps: - checkout - install - run: name: Build package command: yarn build - run: name: Authenticate with npm registry command: echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc - run: name: Verify npm config command: npm config list - run: name: Publish library command: npm publish lib
内容的提问来源于stack exchange,提问作者Marcus Ruddick
相关产品推荐
相关产品推荐

