HomePostsAbout
A

通过 Github Actions 发布可审计的 npm 包

A

Asuka109

May 7, 2025 - 2 minutes

notion image
在 npm 和 GitHub 中,出处证明(Provenance)指的是软件包的来源证明,用于验证软件包是否由可信的构建流程生成。通过 GitHub Actions 和 npm 的集成,可以自动生成并附加 Provenance 信息到发布的包中,以供审计和增强软件供应链安全。核心机制涉及 GitHub Actions、npm、Sigstore 和 OIDC 技术。
Provenance 的价值在于能够保证所有构建步骤和来源信息被记录,便于排查供应链攻击。同时也能够满足融、政府等领域对软件来源的严格审计要求。

实现机制

npm 软件包出处证明通过 GitHub Actions 工作流生成可验证的出处声明,记录软件包的源代码仓库、构建指令和发布者身份。流程如下:
  1. GitHub Actions 运行构建和发布工作流,生成软件包及其出处声明,其中包括运行构建的环境、步骤等信息。
  1. Sigstore 使用加密签名确保声明不可篡改,存储起来供用户验证。
  1. 使用临时凭证机制 OIDC 验证工作流的身份,绑定发布者信息,确保声明可信。
notion image

实践方式

以下介绍如何修改 GitHub Actions 配置文件,支持出处证明。这里项目使用的是 pnpm 管理 monorepo 项目,所以还需要解决 pnpm publish 对 --provenance 参数的兼容问题,并配置生产环境及特定 tag 触发。

修改 GitHub Actions 配置文件

创建或修改 .github/workflows/publish.yml,确保在推送特定 tag(如 v1.0.0)时触发,并在配置有密钥的环境中运行流水线并发布 npm 包:
name: Publish npm Package

on:
  push:
    tags:
      - 'v*'

jobs:
  publish:
    runs-on: ubuntu-latest
    environment: production
    permissions:
      contents: read
      id-token: write
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
        with:
          version: 10
      - uses: actions/setup-node@v4
        with:
          node-version: 18
          registry-url: https://registry.npmjs.org
      - run: pnpm install
      - run: pnpm build
      - run: pnpm publish --access public
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
          NPM_CONFIG_PROVENANCE: true
yaml
关键点
  • 触发条件on.push.tags 确保仅在推送 v* 格式的 tag 时自动触发。
  • 运行环境environment: production 指定生产环境,需要在 GitHub 仓库设置中配置环境携带的密钥 secrets.NPM_TOKEN,此后每次发布需要用户授权运行。
  • OIDC 权限id-token: write 允许工作流获取 OIDC 令牌,用于出处声明。
  • pnpm 兼容性:pnpm 的 publish 命令不支持 -provenance 参数,通过设置环境变量 NPM_CONFIG_PROVENANCE=true 启用出处证明。
  • NPM 令牌NODE_AUTH_TOKEN 使用 secrets 存储 NPM 发布令牌。

工作流

为简化版本管理和 tag 推送,推荐使用基于 version-bump-prompt 修改的 bumpp。可以直接通过 npx 运行:
npx bumpp
plaintext
bumpp 会自动更新包版本、生成 git commit 和 tag,并推送至远程仓库,触发上面的 GitHub Actions 工作流。开发者需要只在 Github Actions 的网页中点击授权本次 CI 即可,然后 CI 就会根据配置构建和发布带有出处证明的 NPM 包。
最终发布在 npm 的包就会携带有官方的绿标认证信息,并能够追溯此次版本发布的所有来源信息。
notion image

参考