如何让其他仓库的GitHub Actions工作流访问私有GitHub Packages NPM包
问题描述
我们正从本地部署方案迁移至GitHub,项目「pink」构建时依赖@organization作用域的NPM包,但GitHub Actions执行npm ci时始终报403 Forbidden错误,无法访问已迁移到GitHub Packages的@organization/violet包。
已完成的操作:
- 将「violet」包从本地Nexus迁移至GitHub Packages,可在GitHub Packages中正常查看
- 为「pink」仓库配置了包访问权限
- 尝试过在Actions中使用
GITHUB_TOKEN和个人访问令牌(PAT),均无法解决403问题 - 本地环境需先执行
npm login才能安装该包,直接在URL中带令牌无效
解决方案
1. 修正.npmrc的配置格式
你当前的.npmrc写入命令格式有误,令牌不应拼在registry URL后面,正确配置方式如下:
方式一:手动写入规范的.npmrc
- name: Use Node.js 16 uses: actions/setup-node@v3 with: node-version: 16.x registry-url: 'https://npm.pkg.github.com' scope: '@organization' - run: echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> ~/.npmrc - run: npm ci
方式二:利用actions/setup-node内置参数配置(更可靠)
直接通过setup-node的参数注入令牌,避免手动写入出错:
- name: Use Node.js 16 uses: actions/setup-node@v3 with: node-version: 16.x registry-url: 'https://npm.pkg.github.com' scope: '@organization' token: ${{ secrets.GITHUB_TOKEN }} - run: npm ci
2. 确认令牌的权限配置
针对默认GITHUB_TOKEN
默认的GITHUB_TOKEN权限有限,需在工作流顶部添加权限声明:
name: Build Pink Project on: [push, pull_request] permissions: packages: read # 赋予读取GitHub Packages的权限 contents: read # 拉取仓库代码所需权限
针对跨仓库访问场景(「pink」和「violet」为不同仓库)
默认GITHUB_TOKEN仅能访问当前仓库资源,此时需使用个人访问令牌(PAT),并确保PAT具备以下权限:
read:packages:允许读取GitHub Packagesrepo:若「violet」所在仓库为私有仓库,需添加该权限
将PAT存入「pink」仓库的Secrets(例如命名为ORG_PACKAGES_TOKEN),然后在工作流中替换使用:
- name: Use Node.js 16 uses: actions/setup-node@v3 with: node-version: 16.x registry-url: 'https://npm.pkg.github.com' scope: '@organization' token: ${{ secrets.ORG_PACKAGES_TOKEN }} - run: npm ci
3. 确认包的访问权限设置
进入@organization/violet包的GitHub Packages页面,检查:
- 「pink」仓库已被添加到包的访问权限列表,权限级别为「读取」
- 若使用组织级权限,确保「pink」仓库所属的团队/用户具备读取该包的权限
4. 检查项目依赖配置
- 确保「pink」的
package.json中,@organization/violet的版本号与GitHub Packages上发布的版本完全一致(部分情况下403错误会掩盖版本不存在的问题) - 不要在
package.json中为该依赖单独指定registry字段,确保依赖解析遵循.npmrc中配置的@organization作用域规则
5. 本地验证令牌有效性
在本地测试PAT是否能正常拉取包,执行命令:
npm install @organization/violet --registry=https://npm.pkg.github.com --//npm.pkg.github.com/:_authToken=你的PAT
如果本地能成功安装,说明令牌权限没问题,问题出在Actions的配置上;如果本地也失败,需检查PAT的权限或包的访问设置。
内容的提问来源于stack exchange,提问作者amorfis
相关产品推荐
相关产品推荐

