@peiyanlu/release 1.3.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Release Project
1
+ # @peiyanlu/release
2
2
 
3
3
 
4
4
  [![module](https://img.shields.io/badge/package-ESM--only-FFE536.svg?logo=npm)](https://nodejs.org/api/esm.html)
@@ -11,408 +11,321 @@
11
11
  [![build](https://img.shields.io/github/actions/workflow/status/peiyanlu/release/test.yaml?branch=master&logo=github)](https://github.com/peiyanlu/release/actions)
12
12
  [![coverage](https://coveralls.io/repos/github/peiyanlu/release/badge.svg?branch=master)](https://coveralls.io/github/peiyanlu/release?branch=master)
13
13
 
14
- 🚀 **一个用于自动化版本管理与包发布的通用 CLI 工具**
14
+ 一个基于 [Conventional Commits](https://www.conventionalcommits.org/) 自动升级版本、生成变更日志并完成发布的工具。
15
15
 
16
- 提供完整的发布工作流自动化:
16
+ - 📄 使用 [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) 分析提交记录、计算下一个版本并生成变更日志。
17
+ - 🧩 提供通用的项目与托管扩展接口,可支持自定义项目类型、清单格式和 Git 托管平台。
18
+ - 📦 内置 `package.json`、Node.js GitHub Action 项目类型,以及 npm/pnpm 发布和 workspace monorepo 支持。
19
+ - 🚀 提供 CLI 和 [GitHub Action](https://github.com/peiyanlu/release) 两种发布入口,支持本地及 CI 自动化发布。
17
20
 
18
- - [**Bump 版本号**][1]
19
- - [**自动生成 Changelog**][2]
20
- - [**Git**:暂存 → 提交 → 打 Tag → 推送][3]
21
- - [**发布到 npm**][4]
22
- - [**GitHub**:创建 Release][5]
23
- - [**Monorepo**][6]
21
+ ## 功能与扩展点
24
22
 
25
- ## 安装
23
+ 提供通用扩展接口,并内置项目与发布实现:
26
24
 
27
- ```bash
28
- npm install -D @peiyanlu/release
29
- # 或
30
- yarn add -D @peiyanlu/release
31
- # 或
32
- pnpm add -D @peiyanlu/release
33
- ```
25
+ | 能力 | 内置实现 |
26
+ |----------------------------|------------------------------------------------------------------------------|
27
+ | 抽象扩展接口 | `Project`、`MonorepoProject`、`ProjectManifest`、`GitRepositoryHosting` |
28
+ | `package.json` 项目 | `PackageJsonProject`、`PackageJsonMonorepoProject` |
29
+ | 项目清单 | `PackageJsonManifest`、`ComposedProjectManifest` |
30
+ | GitHub 托管 | `GithubHosting` |
31
+ | npm / pnpm 发布支持 | `NpmProject`、`PnpmProject`、`NpmWorkspacesProject`、`PnpmWorkspacesProject` |
32
+ | Node.js GitHub Action 项目 | `NodeGithubActionProject` |
33
+ | 发布入口 | `ReleaserCli`、`ReleaserGithubAction` |
34
34
 
35
- ## CLI
36
-
37
- ```bash
38
- release [release-type] [options]
39
- ```
35
+ 单包项目可使用 `NpmProject` 或 `PnpmProject`;多包项目可使用对应的 workspace 实现。通过 `Project`、`MonorepoProject`、`ProjectManifest` 和 `GitRepositoryHosting`,也可扩展其他项目类型、清单格式和托管平台。
40
36
 
41
- `release-type` 用于指定版本升级类型,支持:
37
+ ## 环境要求
42
38
 
43
- - `patch`:Bug 修复版本(默认)
44
- - `minor`:向后兼容的新功能
45
- - `major`:不向后兼容的破坏性更新
39
+ - Node.js 22.18+
40
+ - Git 仓库
41
+ - npm 发布需要可用的 npm 身份验证;GitHub API 操作需要 GitHub token
46
42
 
47
- 当未传入 `release-type` 时,默认使用 `patch`
48
-
49
- ```bash
50
- pnpm release minor --ci
51
- ```
43
+ ## 安装
52
44
 
53
- ### 通用参数
54
-
55
- | 参数 | 说明 |
56
- |---------------------------------------|------------------------------------------------------------|
57
- | `-v, --version` | 输出当前 CLI 版本并退出 |
58
- | `-h, --help` | 显示帮助信息 |
59
- | `-n, --dry-run` | 空跑模式,展示将要执行的发布流程但不做任何修改 |
60
- | `--show-release` | 打印即将发布的版本号并退出 |
61
- | `--show-changelog` | 打印生成的 Changelog 并退出 |
62
- | `--ci` | 启用 CI 模式:禁用交互提示,缺少必要参数时直接失败;GitHub Actions 等 CI/CD 环境中默认启用 |
63
- | `-r, --release-count <count>` | 生成多少个版本的变更日志 |
64
- | `--include-hidden` | 生成 CHANGELOG 时包含默认隐藏的 commit 类型 |
65
- | `--only-changelog` | 仅更新 CHANGELOG |
66
- | `-C, --no-require-clean-working-tree` | 是否要求工作目录保持干净(无未提交的更改) |
67
- | `--skip-git` | 跳过 git、github 环境检查以及后续操作 |
68
- | `--skip-npm` | 跳过 npm 环境检查以及后续操作 |
69
- | `--skip-github` | 跳过 github 环境检查以及后续操作 |
70
-
71
- ### Prepare 相关参数
72
-
73
- | 参数 | 说明 |
74
- |-------------|--------------------------|
75
- | `--prepare` | 仅仅变更版本、提交代码、创建 Tag、推送到远程 |
76
-
77
- ```bash
78
- pnpm release minor --prepare --ci --package pkg-a
45
+ ```sh
46
+ pnpm add -D @peiyanlu/release
47
+ # 或 npm install --save-dev @peiyanlu/release
79
48
  ```
80
49
 
81
- > 后续可以通过 tag 进行 npm 发布和创建 GitHub release
82
-
83
- ### Monorepo / CI 相关参数
84
-
85
- | 参数 | 说明 |
86
- |-----------------------|----------------------------------|
87
- | `-m, --is-monorepo` | Monorepo 项目 |
88
- | `-p, --package <pkg>` | 指定要发布的子包名称(仅用于 Monorepo 的 CI 场景) |
50
+ ## CLI
89
51
 
90
- ```bash
91
- pnpm release minor --ci --package pkg-a
52
+ ```sh
53
+ release [release-type] [options]
92
54
  ```
93
55
 
94
- ### npm 发布相关参数
56
+ 不指定 `release-type` 时,会根据提交记录推断并预选升级类型;CI 模式下自动采用该类型。可指定 `major`、`minor`、`patch` 或 `prerelease`。
95
57
 
96
- | 参数 | 说明 |
97
- |----------------|--------------------------------|
98
- | `--otp <code>` | npm 发布时使用的一次性验证码(用于开启 2FA 的账户) |
58
+ ```sh
59
+ pnpm exec release --dry-run
60
+ pnpm exec release minor --dry-run
61
+ pnpm exec release --ci
62
+ ```
99
63
 
100
- > 当使用 **Trusted Publishing(OIDC)** 时,通常无需提供 `--otp`。
64
+ 常用选项:
101
65
 
66
+ | 选项 | 说明 |
67
+ |------------------|----------------------------------------------------|
68
+ | `-n, --dry-run` | 预览发布步骤,不写入变更 |
69
+ | `--ci` | CI 模式,关闭交互式流程 |
70
+ | `--skip-bump` | 跳过项目版本更新 |
71
+ | `--skip-git` | 跳过 Git 提交、标签、推送;版本推断仍读取 Git 历史 |
72
+ | `--skip-publish` | 跳过项目发布 |
73
+ | `--skip-release` | 跳过仓库托管服务上创建发布 |
74
+ | `-v, --version` | 显示版本 |
75
+ | `-h, --help` | 显示完整帮助 |
102
76
 
103
77
  ## 配置
104
78
 
105
- 发布流程可以通过配置文件进行自定义。
106
- 如果项目中**未提供配置文件**,工具会自动使用**内置默认配置**。
107
-
108
- 默认配置适用于 **单仓库(Single Repo)** 项目。
109
- 当项目为 **Monorepo** 结构时,**必须显式提供配置文件**,并开启 Monorepo 模式以正确识别各个子包。
110
-
111
- 支持的配置文件格式:
112
-
113
- ```
114
- release.config.{ts,mts,js,mjs}
115
- ```
79
+ CLI 会从当前项目根目录加载第一个存在的 `release.config.ts`、`.mts`、`.js` 或 `.mjs` 文件。CLI 要求配置文件提供 `project` 和 `hosting`;GitHub Action 只要求配置文件提供 `project`,提供的 `hosting` 将被忽略。
116
80
 
117
- 示例配置:
81
+ 下面的单包配置使用 pnpm 项目,并提供 GitHub 托管功能:
118
82
 
119
83
  ```ts
120
84
  // release.config.ts
121
- import { defineConfig } from '@peiyanlu/release'
85
+ import { defineConfig, GithubHosting, PnpmProject } from '@peiyanlu/release'
122
86
 
123
87
 
124
88
  export default defineConfig({
125
- isMonorepo: false,
126
- packages: [],
127
- getPkgDir: (pkg) => `.`,
128
- toTag: (pkg: string, version: string) => `v${ version }`,
129
- changelog: {
130
- tagPrefix: undefined,
131
- },
132
-
133
- git: {
134
- commit: true,
135
- tag: true,
136
- push: true,
137
- commitMessage: 'chore(release): ${tag}',
138
- tagMessage: '${tag}',
139
- },
140
- npm: {
141
- publish: true,
142
- },
143
- github: {
144
- release: true,
145
- releaseName: '${tag}',
146
- },
89
+ project: new PnpmProject(),
90
+ hosting: new GithubHosting({
91
+ token: process.env.GITHUB_TOKEN,
92
+ }),
93
+ bump: { prerelease: 'beta' },
94
+ commit: { sign: false },
95
+ publish: { tag: 'latest' },
147
96
  })
148
97
  ```
149
98
 
150
- ### Monorepo 配置
99
+ `defineConfig` 接受 `project`、可选的 `hosting`,以及 `checkout`、`bump`、`commit`、`tag`、`push`、`publish`、`release`、`pullRequest` 等步骤选项。项目和步骤选项的 TypeScript 类型可用于编辑器提示。
151
100
 
152
- 在 Monorepo 场景下,需要显式声明仓库结构、子包列表以及 Tag / Changelog 的生成规则。
101
+ ### pnpm workspace monorepo
153
102
 
154
- 示例配置:
103
+ 当 pnpm workspace 用于管理多个包时,可使用 `PnpmWorkspacesProject`。`mode` 为 `fixed` 时所有包共用版本;`independent` 时各包可单独升级。workspace 包由根目录 `pnpm-workspace.yaml` 中的 `packages` 模式发现。
155
104
 
156
105
  ```ts
157
106
  // release.config.ts
158
- import { defineConfig } from '@peiyanlu/release'
107
+ import { defineConfig, GithubHosting, PnpmWorkspacesProject } from '@peiyanlu/release'
159
108
 
160
109
 
161
110
  export default defineConfig({
162
- isMonorepo: true,
163
- packages: [ 'demo-a', 'demo-b' ],
164
- getPkgDir: (pkg) => `packages/${ pkg }`,
165
- toTag: (pkg: string, version: string) => `${ pkg }@${ version }`,
166
- changelog: {
167
- tagPrefix: (pkg: string) => `${ pkg }@`,
168
- },
169
-
170
- git: {
171
- commit: true,
172
- tag: true,
173
- push: true,
174
- commitMessage: 'chore(release): ${tag}',
175
- tagMessage: '${tag}',
176
- },
177
- npm: {
178
- publish: true,
179
- },
180
- github: {
181
- release: true,
182
- releaseName: '${tag}',
183
- },
111
+ project: new PnpmWorkspacesProject({ mode: 'fixed' }),
112
+ hosting: new GithubHosting({
113
+ token: process.env.GITHUB_TOKEN,
114
+ }),
184
115
  })
185
116
  ```
186
117
 
187
- ### 使用 CLI 生成配置文件
188
-
189
- 工具内置 `init` 子命令,可用于快速生成发布配置文件。
190
-
191
- ```bash
192
- release init
193
- ```
194
-
195
- #### init 参数说明
196
-
197
- | 参数 | 说明 |
198
- |------------------|---------------------|
199
- | `-f, --force` | 覆盖已存在的配置文件 |
200
- | `-m, --monorepo` | 生成 Monorepo 项目的配置模板 |
201
- | `-a, --add` | 自动暂存配置文件 |
202
-
203
- #### 行为说明
204
-
205
- - 自动检测项目模块类型(ESM / CJS)
206
- - 自动检测是否使用 TypeScript
207
- - 根据检测结果生成对应格式的配置文件:
208
- - `release.config.ts`
209
- - `release.config.mts`
210
- - `release.config.js`
211
- - `release.config.mjs`
212
- - 若配置文件已存在且未使用 `--force`,将终止并提示错误
213
-
214
- ## Bump 版本号
215
-
216
- 工具内置语义化版本(Semantic Versioning)管理能力,可自动更新`package.json` 中的版本号:
217
-
218
- - 支持标准版本类型:
219
- - `major`:不兼容的重大变更(1.x.x → 2.0.0)
220
- - `minor`:向后兼容的新功能(1.1.x → 1.2.0)
221
- - `patch`:向后兼容的 Bug 修复(1.1.1 → 1.1.2)
222
- - 支持**预发布版本**:
223
- - `alpha`、`beta`、`rc` 等(如 `1.2.0-alpha.1`)
224
- - 支持**自定义版本号**:
225
- - 可直接指定目标版本(如 `1.3.0`)
226
- - 支持 **--show-release** 预览:
227
- - 在不修改文件的情况下查看即将升级到的版本
228
-
229
- 版本更新后,工具会自动同步到后续的 Git Tag、GitHub Release 与 npm 发布流程。
230
-
231
- ## Changelog
232
-
233
- 基于 Git **Conventional Commits** 规范提交历史自动生成结构化 Changelog
234
-
235
- COMMIT_TYPES:
236
-
237
- - 默认:`feat | feature | fix | perf | revert | docs | style | chore | refactor | test | build | ci`
238
- - 自定义:`config | deps | security | i18n | ux | hotfix`
239
-
240
- | Effect | Types | 说明 |
241
- |-----------------|----------------------------------------------------------------|-----------------------------------|
242
- | **`bump`** | `feat`, `feature`, `fix`, `perf`, `revert` | 影响版本号(Minor/Patch),同时写入 CHANGELOG |
243
- | **`changelog`** | `docs`, `refactor`, `deps`, `security`, `hotfix`, `i18n`, `ux` | 不影响版本号,仅写入 CHANGELOG |
244
- | **`hidden`** | `style`, `chore`, `test`, `build`, `ci`, `config`, `tool` | 不影响版本号,也不会写入 CHANGELOG |
245
-
246
- 支持 **--show-changelog** 预览模式:
247
-
248
- - 仅展示用于生成 Changelog 的 Commits
249
- - 不会修改任何文件或提交历史
250
-
251
- ## Git 自动化
252
-
253
- 自动执行标准发布流程:
254
-
255
- **stage → commit → tag → push**
256
-
257
- 并支持推送到**任意 Git 远程仓库**,适配单仓库与多仓库场景。
258
-
259
-
260
- ## npm 发布(Trusted Publishing)
261
-
262
- 工具会根据 `package.json` 中的 `publishConfig` 配置,将包发布到对应的 npm 仓库。
263
-
264
- ```json
265
- {
266
- "publishConfig": {
267
- "access": "public",
268
- "registry": "https://registry.npmjs.org/"
269
- }
270
- }
271
- ```
272
-
273
- 自 **2025 年 7 月** 起,GitHub CI 已支持 npm 的 **Trusted Publishing(可信发布)** + **OIDC**:
118
+ ## GitHub Action
274
119
 
275
- - ✅ 无需长期有效的 npm Token
276
- - ✅ 使用 OpenID Connect 进行身份验证
277
- - ✅ 自动生成 provenance(来源证明)
120
+ 本仓库也可作为 Action 使用。Action 要求配置文件定义 `project`,并使用 `github-token` 访问 GitHub API。`workflow` 的默认值为 `full`。
278
121
 
279
- 适用于 CI/CD 场景下的**安全、无 Token** 自动化发布。
122
+ ```yaml
123
+ name: Release
280
124
 
281
- 支持配置发布前清理:
125
+ on:
126
+ issue_comment:
127
+ types: [ created, deleted ]
128
+ push:
129
+ branches:
130
+ - master
282
131
 
283
- - 移除 `package.json` 中对发布无意义的字段
284
- - `README.md` 只保留主要内容
132
+ permissions:
133
+ contents: write
134
+ pull-requests: write
285
135
 
286
- ```ts
287
- // 默认配置
288
- export default defineConfig({
289
- npm: {
290
- cleanup: {
291
- packageJson: true,
292
- readme: false,
293
- removeTempDir: true,
294
- }
295
- },
296
- })
136
+ jobs:
137
+ release:
138
+ runs-on: ubuntu-latest
139
+ steps:
140
+ - uses: actions/checkout@v7
141
+ with:
142
+ fetch-depth: 0
143
+ fetch-tags: true
144
+
145
+ - uses: pnpm/action-setup@v6
146
+ with:
147
+ version: 12
148
+
149
+ - uses: actions/setup-node@v7
150
+ with:
151
+ node-version: 24
152
+ registry-url: https://registry.npmjs.org/
153
+ package-manager-cache: false
154
+
155
+ - run: pnpm install --frozen-lockfile
156
+
157
+ - uses: peiyanlu/release@master
158
+ with:
159
+ workflow: full
160
+ github-token: ${{ secrets.GITHUB_TOKEN }}
161
+ npm-token: ${{ secrets.NPM_TOKEN }}
297
162
  ```
298
163
 
299
- ## GitHub Releases
300
-
301
- GitHub Release 可基于 Git Tag 自动创建,并支持附带:
302
-
303
- - **Release Notes(发布说明)**
304
- - **构建产物(Assets)**
305
-
306
- 支持两种创建方式:
307
-
308
- 1. **自动化方式**:使用 `GITHUB_TOKEN` 直接创建
309
- 2. **手动方式**:通过 GitHub Web UI 创建(工具预填充字段)
310
-
311
- ## Monorepo
312
-
313
- 工具默认配置偏向于 **单仓库(Single Repo)** 项目,但是可以通过配置使其支持 **Monorepo**
314
-
315
- ## 流程拆分
316
-
317
- ### 本地准备 Release(仅创建 Tag)
318
-
319
- 在本地完成版本确认与变更准备:
320
-
321
- - 确定下一个版本
322
- - 更新 `package.json` / `CHANGELOG`
323
- - 创建发布提交
324
- - 创建并推送 git 标签
325
-
326
- ### CI/CD 自动发布(由 Tag 触发)
327
-
328
- 当 Tag 推送到远端后,CI/CD 自动执行:
164
+ 确保仓库中已提交 `release.config.ts`,Action 会从检出的项目中加载该文件。若发布到 npm,将 `npm-token` 配置为仓库 secret;它会作为 `NODE_AUTH_TOKEN` 提供给发布步骤。也可在仓库配置 npm Trusted Publishing。
329
165
 
330
- - 发布到 npm
331
- - 创建 GitHub Release
166
+ ### npm Trusted Publishing
332
167
 
333
- ### 示例用法
168
+ [npm Trusted Publishing](https://docs.npmjs.com/trusted-publishers/) 使用 GitHub Actions 的 OIDC 身份发布 npm 包,不需要长期有效的 `NPM_TOKEN`。
334
169
 
335
- - 发布到 npm
170
+ 1. **确认条件**:包已至少发布过一个版本,使用公开 npm registry 和 GitHub 托管的 runner。Trusted Publisher 按包和 workflow 文件分别注册。
171
+ 2. **在 npm 注册发布者**:打开 [npmjs.com](https://www.npmjs.com/) 上对应包的 **Settings → Trusted Publisher → GitHub Actions**:填写 GitHub 用户或组织名、仓库名和 workflow 文件名(例如 `release.yml`)。
172
+ 如果 workflow 使用 GitHub environment,也填写相同的 environment 名称。
173
+ 3. **调整发布 job**:在发布 job 中授予 `id-token: write` 权限,使用 Node.js 22.14.0 或更高版本,以确保 npm 版本为 11.5.1 或更高版本,并从 `actions/setup-node` 移除 `registry-url`(v7 以下),从 Action step 输入中移除 `npm-token`。例如:
336
174
 
337
- ```ts
338
- // publishCI.ts
339
-
340
- import { publishTagToNpm } from '@peiyanlu/release'
341
-
342
-
343
- await publishTagToNpm({})
344
- ```
175
+ ```yaml
176
+ name: Release
345
177
 
346
- ```json5
347
- // package.json
178
+ on:
179
+ issue_comment:
180
+ types: [ created, deleted ]
181
+ push:
182
+ branches:
183
+ - master
348
184
 
349
- {
350
- "scripts": {
351
- "ci-publish": "tsx src/publishCI.ts"
352
- }
353
- }
354
- ```
355
-
356
- ```yaml
357
- # .github/workflows/publish.yml
185
+ permissions:
186
+ contents: write
187
+ pull-requests: write
188
+ id-token: write # 新增
358
189
 
359
190
  jobs:
360
- publish:
361
- name: Publish
191
+ release:
362
192
  runs-on: ubuntu-latest
363
-
364
193
  steps:
365
- - name: Publish
366
- run: npm i -g npm@^11.5.2 && pnpm run ci-publish "$REF_NAME"
367
- env:
368
- REF_NAME: ${{ github.ref_name }}
194
+ - uses: actions/checkout@v7
195
+ with:
196
+ fetch-depth: 0
197
+ fetch-tags: true
198
+
199
+ - uses: pnpm/action-setup@v6
200
+ with:
201
+ version: 12
202
+
203
+ - uses: actions/setup-node@v7
204
+ with:
205
+ node-version: 24 # npm 11.5.1+
206
+ registry-url: https://registry.npmjs.org/ # v7 以下移除
207
+ package-manager-cache: false
208
+
209
+ - run: pnpm install --frozen-lockfile
210
+
211
+ - uses: peiyanlu/release@master
212
+ with:
213
+ workflow: full
214
+ github-token: ${{ secrets.GITHUB_TOKEN }}
215
+ #npm-token: ${{ secrets.NPM_TOKEN }} # 移除
369
216
  ```
370
217
 
371
- - 创建 GitHub Release
218
+ 配置正确后,npm/pnpm 会自动通过 OIDC 认证,公开仓库发布的版本还会自动附带 provenance(来源证明),无需额外开启。
219
+
220
+ 若出现 `ENEEDAUTH`:
221
+ 核对 npm 包是否已存在、注册的仓库和 workflow 文件名、GitHub environment,以及发布 job 是否有 `id-token: write` 并使用满足版本要求的 npm CLI。
222
+
223
+ ### Snapshots
224
+
225
+ 为 `workflow_dispatch` 添加 `snapshot` 字符串输入:手动运行时输入非空值会执行快照 job;push 和 issue comment 事件没有该输入,因此仍按原有流程执行。
372
226
 
373
227
  ```yaml
374
- # .github/workflows/release.yml
228
+ name: Release
229
+
230
+ on:
231
+ issue_comment:
232
+ types: [ created, deleted ]
233
+ push:
234
+ branches:
235
+ - master
236
+ workflow_dispatch:
237
+ inputs:
238
+ snapshot:
239
+ description: Snapshot publish tag.
240
+ type: string
375
241
 
376
242
  jobs:
243
+ check:
244
+ if: inputs.snapshot == ''
245
+ # 保留现有 check job 的其余配置
246
+
247
+ pull-request:
248
+ needs: check
249
+ if: needs.check.outputs.workflow == 'pull-request'
250
+ # 保留现有 pull-request job 的其余配置
251
+
377
252
  release:
378
- name: Release
253
+ needs: check
254
+ if: needs.check.outputs.workflow == 'release'
255
+ # 保留现有 release job 的其余配置
256
+
257
+ snapshot:
258
+ if: inputs.snapshot != ''
259
+ name: Snapshot
379
260
  runs-on: ubuntu-latest
380
-
261
+ permissions:
262
+ contents: read
263
+ id-token: write
381
264
  steps:
382
- - name: Release
383
- uses: peiyanlu/release
384
- env:
385
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
265
+ - uses: actions/checkout@v7
266
+ with:
267
+ fetch-depth: 0
268
+ fetch-tags: true
269
+
270
+ - uses: pnpm/action-setup@v6
271
+ with:
272
+ version: 12
273
+
274
+ - uses: actions/setup-node@v7
386
275
  with:
387
- tag_name: ${{ github.ref_name }}
388
- release_name: Release ${{ github.ref_name }}
389
- body: |
390
- Please refer to [CHANGELOG.md](./CHANGELOG.md) for details.
391
- draft: false
276
+ node-version: 24
277
+ registry-url: https://registry.npmjs.org/
278
+ package-manager-cache: false
279
+
280
+ - run: pnpm install --frozen-lockfile
281
+
282
+ - uses: peiyanlu/release@master
283
+ with:
284
+ workflow: snapshot
285
+ github-token: ${{ secrets.GITHUB_TOKEN }}
286
+ bump-snapshot: ${{ inputs.snapshot }}
392
287
  ```
393
288
 
394
- ## Dry Run
395
-
396
- ```bash
397
- pnpm release --dry-run
398
- ```
289
+ 在 GitHub Actions 页面手动运行 workflow 并填写 snapshot 为 canary:此时 `check`、`pull-request` 和 `release` 不执行,快照 job 发布 `1.2.0-canary.<timestamp>`。
399
290
 
400
- 可以**完整展示发布流程,但不会执行任何实际修改**,适合调试和验证配置。
291
+ Trusted Publisher 注册绑定到具体 workflow 文件。要让快照发布也使用同一注册,建议将快照 job 放在已注册的 workflow 中,而不是另建 workflow。
401
292
 
293
+ ### 参数
402
294
 
403
- ## 相关链接
295
+ `workflow` 支持:
404
296
 
405
- - [npm Trusted Publishing](https://docs.npmjs.com/trusted-publishers)
406
- - [GitHub Releases 官方文档](https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases)
297
+ | 值 | 行为 |
298
+ |----------------|---------------------------------------------------|
299
+ | `full` | 创建发布 Pull Request,并在发布提交上执行发布 |
300
+ | `pull-request` | 创建或更新发布 Pull Request |
301
+ | `release` | 执行发布提交对应的发布流程 |
302
+ | `snapshot` | 发布临时快照版本 |
303
+ | `check` | 检查事件上下文,并输出是否继续及应执行的 workflow |
407
304
 
408
- [1]: #bump-版本号
305
+ 主要 Action 输入:
409
306
 
410
- [2]: #changelog
307
+ | 输入 | 说明 |
308
+ |------------------------------|-----------------------------------------------------|
309
+ | `github-token` | 必填,GitHub API token |
310
+ | `npm-token` | 可选,npm token |
311
+ | `workflow` | 工作流,默认 `full` |
312
+ | `checkout-branch` | 发布分支,默认 `release-branch` |
313
+ | `bump-version` | 指定版本号 |
314
+ | `bump-as` | 版本类型:`major`、`minor`、`patch` 或 `prerelease` |
315
+ | `bump-prerelease` | 预发布标识,如 `beta` |
316
+ | `bump-snapshot` | 快照版本标识 |
317
+ | `bump-first-release` | 是否按首次发布处理 |
318
+ | `bump-skip` | 跳过版本升级 |
319
+ | `bump-by-project` | monorepo 各项目的版本升级选项 JSON |
320
+ | `maintenance-branch-enabled` | 是否创建维护分支 |
321
+ | `publish-skip` | 跳过项目发布 |
322
+ | `publish-access` | npm access:`public` 或 `restricted` |
323
+ | `publish-tag` | npm dist-tag 或 Action 发布别名 |
411
324
 
412
- [3]: #git-自动化
325
+ ## Conventional Commits 与版本
413
326
 
414
- [4]: #npm-发布trusted-publishing
327
+ 工具根据提交历史和 Conventional Commits 生成变更日志并计算版本。通常 `feat` 触发 minor,`fix`、`perf` 等触发 patch,破坏性变更触发 major;文档、测试、构建等不一定产生版本升级。可使用 `--dry-run` 预览结果。
415
328
 
416
- [5]: #github-releases
329
+ ## 许可证
417
330
 
418
- [6]: #monorepo
331
+ [MIT](./LICENSE)