monorepo 配置 release-please

在 Shadcn 创建的 Next.js Monorepo (使用 pnpm dlx shadcn@latest init 生成) 中配置 release-please,你需要针对 Turborepo + pnpm workspace 的结构进行特定配置。

该结构通常包含 apps/web (主应用) 和 packages/ui (组件库)。配置的核心目标是让 release-please 能够识别这两个独立的工作区,并分别(或联动)管理它们的版本和变更日志。

以下是详细的配置步骤:

1. 准备工作

确保你的提交信息遵循 Conventional Commits 规范(例如 feat: add button, fix: login bug),这是 release-please 自动生成版本号和 Changelog 的基础。

2. 创建配置文件

在项目根目录下创建两个文件:

A. release-please-config.json

这是主配置文件。我们需要告诉 release-please 有哪些包需要管理。由于是 Monorepo,我们需要使用 packages 字段映射路径。

json
1{
2  "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
3  "release-type": "node",
4  "include-component-in-tag": true,
5  "tag-separator": "@",
6  "packages": {
7    "apps/web": {
8      "release-type": "node",
9      "package-name": "web"
10    },
11    "packages/ui": {
12      "release-type": "node",
13      "package-name": "ui" 
14    }
15  },
16  "plugins": [
17    {
18      "type": "node-workspace",
19      "updateAllPackages": true,
20      "updatePeerDependencies": true
21    },
22    {
23      "type": "linked-versions",
24      "groupName": "all",
25      "components": ["web", "ui"]
26    }
27  ]
28}

B. .release-please-manifest.json

这是版本管理的“数据库”文件,用于记录当前的起始版本。

json
1{
2  "apps/web": "0.1.0",
3  "packages/ui": "0.1.0"
4}

3. 配置 GitHub Action

.github/workflows/release-please.yml 创建工作流文件:

yaml
1name: Release Please
2
3on:
4  push:
5    branches:
6      - main
7
8permissions:
9  contents: write
10  pull-requests: write
11
12jobs:
13  release-please:
14    runs-on: ubuntu-latest
15    outputs:
16      # 导出变量供后续步骤使用(例如自动部署)
17      web--release_created: ${{ steps.release.outputs['apps/web--release_created'] }}
18      ui--release_created: ${{ steps.release.outputs['packages/ui--release_created'] }}
19    steps:
20      - uses: google-github-actions/release-please-action@v4
21        id: release
22        with:
23          # 使用默认的 GITHUB_TOKEN 即可
24          token: ${{ secrets.GITHUB_TOKEN }}
25          config-file: release-please-config.json
26          manifest-file: .release-please-manifest.json
27
28  # (可选) 示例:当 web 应用发布新版本时自动打印日志或触发部署
29  deploy-web:
30    needs: release-please
31    if: ${{ needs.release-please.outputs.web--release_created }}
32    runs-on: ubuntu-latest
33    steps:
34      - uses: actions/checkout@v4
35      - name: Display release info
36        run: |
37          echo "New release created for Web!"

4. 处理 pnpm workspace:* 协议的注意事项

在 Shadcn 的 Monorepo 中,apps/web 通常通过 "ui": "workspace:*" 依赖 packages/ui

release-please 的行为:packages/ui 发布新版本(例如 0.2.0)时,release-please 会尝试更新 apps/webpackage.json

5. 验证流程

  1. 提交上述配置文件到 main 分支。
  2. 创建一个新的 Commit,例如:fix(ui): update button style
  3. 推送到 main
  4. 等待 Action 运行。release-please 会自动创建一个名为 chore: release ... 的 Pull Request。
  5. 合并该 PR:合并后,GitHub Action 会再次运行,自动打 Tag (如 ui@0.1.1) 并创建 GitHub Release。

总结 Checklist