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 管理软件包管理器的地方。

快速调试步骤

  1. 检查 Node.js 版本: node -v (如果您看到 v16.x ,则您使用的是 Node 16;如果您看到 v18.x 或更高版本,则您使用的是 Node 18+)。
  2. 检查 Corepack 版本: corepack --version. 任何早于 0.31.0 的版本都可能没有新的密钥集。
  3. 查找条件逻辑。有些工作流程只在 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 (跳过签名检查)可以绕过错误,但也绕过了重要的安全性。只有在完全了解风险的情况下,才能使用这种方法。

摘要

  1. 检查您的 Node 和 Corepack 版本。
  2. 如果您使用的是 Node 18 以上版本,请升级到 Corepack ≥ 0.31.0 (如果您需要 Node 16,请升级到 0.20 )。
  3. 删除任何阻止 Corepack 升级在实际环境中运行的条件逻辑。
  4. 完成! 您的 CI 构建应该会成功,您也会保持安全。

更多详情,请参阅 Corepack Issue #612Corepack Releases.