GitHub Actions上关于“Cannot Find Matching Keyid”或“Corepack/PNPM Not Found”的错误
如何使用 GitHub 操作调试并解决此 corepack 问题。
如果你的构建突然出现 cannot find matching keyid: {"signatures":[...],"keys":[...]}
这样的失败信息,通常意味着 npm 注册表键值已被轮换,而你的旧 Corepack 无法验证 pnpm
的新版本(如 9.15.4 或 10.1.0+)。
这种情况可能发生在 GitHub Actions、GitLab、Docker 或其他使用 Corepack 管理软件包管理器的地方。
¶快速调试步骤
- 检查 Node.js 版本:
node -v
(如果您看到v16.x
,则您使用的是 Node 16;如果您看到v18.x
或更高版本,则您使用的是 Node 18+)。 - 检查 Corepack 版本:
corepack --version.
任何早于0.31.0
的版本都可能没有新的密钥集。 - 查找条件逻辑。有些工作流程只在 Node 16 上更新 Corepack。如果您在 Node 18+ 上构建,该逻辑可能会完全跳过更新。
¶如何修复
¶如果您使用的是 18+ 节点(或更新版本)
升级到最新的 Corepack (≥ 0.31.0
):steps:
- name: Use Latest Corepack
run: |
echo "Before: corepack version => $(corepack --version || echo 'not installed')"
npm install -g corepack@latest
echo "After : corepack version => $(corepack --version)"
corepack enable
pnpm --version
这将确保你拥有与 npm 注册表变更相匹配的新签名密钥。
¶如果您使用的是节点 16(无法放弃节点 16 支持)
使用 Corepack 0.20
,这是仍支持 Node 16 的最后一个版本,其中包含最新 pnpm 版本的更新密钥:steps:
- name: Pin Corepack 0.20
run: |
echo "Before: corepack => $(corepack --version || echo 'not installed')"
npm install -g corepack@0.20
echo "After : corepack => $(corepack --version)"
corepack enable
pnpm --version
在 0.20
之后,较新的 Corepack 版本将不再支持 Node 16,因此,如果你还不能放弃 Node 16,这是一个安全的 “权宜之计”。
¶避免禁用签名检查
虽然设置 COREPACK_INTEGRITY_KEYS=0
(跳过签名检查)可以绕过错误,但也绕过了重要的安全性。只有在完全了解风险的情况下,才能使用这种方法。
¶摘要
- 检查您的 Node 和 Corepack 版本。
- 如果您使用的是 Node 18 以上版本,请升级到 Corepack ≥
0.31.0
(如果您需要 Node 16,请升级到0.20
)。 - 删除任何阻止 Corepack 升级在实际环境中运行的条件逻辑。
- 完成! 您的 CI 构建应该会成功,您也会保持安全。
更多详情,请参阅 Corepack Issue #612 和 Corepack Releases.