CI/CD 与发布

GitHub Actions 工作流

CI 工作流 (.github/workflows/ci.yml)

触发条件

  • pushmain 分支
  • Pull Request

矩阵策略

维度
OSubuntu-latest, macos-latest, windows-latest
Node.js22, 24, 26

共 9 个组合,fail-fast: false(一个失败不阻止其他)。

流程步骤

flowchart TD
    A["checkout"] --> B["安装 Python 3.14"]
    B --> C["安装系统依赖(macOS/Linux)"]
    C --> D["corepack enable pnpm"]
    D --> E["setup-node(含 pnpm 缓存)"]
    E --> F["npm i -g node-gyp"]
    F --> G["pnpm install --frozen-lockfile"]
    G --> H["pnpm build-test-binary"]
    H --> I["pnpm build"]
    I --> J["pnpm test"]
    J --> K{"Ubuntu + Node 24?"}
    K -->|是| L["pnpm test-coverage"]
    K -->|是| M["Maybe Release"]

并发控制

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

同一 ref 的重复运行会取消前一个(除了 main 分支的推送)。

PR 工作流 (.github/workflows/pr.yml)

仅检查 PR 标题是否符合 Conventional Commits 格式(使用 amannn/action-semantic-pull-request)。

发布流程

semantic-release

// release.config.js
module.exports = {
  branches: ['main'],
  tagFormat: '${version}',
}

发布条件(所有条件必须同时满足):

  1. Ubuntu 环境
  2. Node.js 24
  3. push 事件(不是 PR)
  4. refs/heads/main 分支

发布命令

pnpm --dir publish install --ignore-workspace --frozen-lockfile
./publish/node_modules/.bin/semantic-release

publish/ 目录包含独立的 package.json,用于安装 semantic-release 及其插件。使用 --ignore-workspace 避免与主 workspace 冲突。

发布认证

  • GitHub Token${{ secrets.GITHUB_TOKEN }}(创建 Release)
  • npm Token:通过 OIDC(id-token: write 权限)实现可信发布

版本号

package.json 中的版本是 "0.0.0-development" — 实际版本号由 semantic-release 在发布时根据 commit 消息自动确定。

标签格式

使用 ${version}(无 v 前缀),如 0.38.1

Dependabot

# .github/dependabot.yml
# 配置自动依赖更新

自动提交依赖更新 PR。

包发布配置

// package.json
{
  "name": "@vercel/ncc",
  "main": "./dist/ncc/index.js",
  "bin": { "ncc": "dist/ncc/cli.js" },
  "files": ["dist"],
  "publishConfig": { "access": "public" }
}
  • 只发布 dist/ 目录
  • CLI 入口:dist/ncc/cli.js
  • API 入口:dist/ncc/index.js
  • 作用域包公开发布

构建可复现性

  • pnpm install --frozen-lockfile:确保依赖精确
  • prepublishOnly 脚本使用 --no-cache:确保产物不受缓存影响
  • packageManager 字段锁定 pnpm 版本(含 SHA-512 校验)