@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 +239 -326
- package/dist/action.mjs +1032 -0
- package/dist/cli.mjs +858 -1420
- package/dist/index.d.mts +761 -256
- package/dist/index.mjs +2669 -153
- package/package.json +35 -20
- package/template/release.config.hbs +29 -0
- package/template/release.workflow.hbs +140 -0
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @peiyanlu/release
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
[](https://nodejs.org/api/esm.html)
|
|
@@ -11,408 +11,321 @@
|
|
|
11
11
|
[](https://github.com/peiyanlu/release/actions)
|
|
12
12
|
[](https://coveralls.io/github/peiyanlu/release?branch=master)
|
|
13
13
|
|
|
14
|
-
|
|
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
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
release [release-type] [options]
|
|
39
|
-
```
|
|
35
|
+
单包项目可使用 `NpmProject` 或 `PnpmProject`;多包项目可使用对应的 workspace 实现。通过 `Project`、`MonorepoProject`、`ProjectManifest` 和 `GitRepositoryHosting`,也可扩展其他项目类型、清单格式和托管平台。
|
|
40
36
|
|
|
41
|
-
|
|
37
|
+
## 环境要求
|
|
42
38
|
|
|
43
|
-
-
|
|
44
|
-
-
|
|
45
|
-
-
|
|
39
|
+
- Node.js 22.18+
|
|
40
|
+
- Git 仓库
|
|
41
|
+
- npm 发布需要可用的 npm 身份验证;GitHub API 操作需要 GitHub token
|
|
46
42
|
|
|
47
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
### Monorepo / CI 相关参数
|
|
84
|
-
|
|
85
|
-
| 参数 | 说明 |
|
|
86
|
-
|-----------------------|----------------------------------|
|
|
87
|
-
| `-m, --is-monorepo` | Monorepo 项目 |
|
|
88
|
-
| `-p, --package <pkg>` | 指定要发布的子包名称(仅用于 Monorepo 的 CI 场景) |
|
|
50
|
+
## CLI
|
|
89
51
|
|
|
90
|
-
```
|
|
91
|
-
|
|
52
|
+
```sh
|
|
53
|
+
release [release-type] [options]
|
|
92
54
|
```
|
|
93
55
|
|
|
94
|
-
|
|
56
|
+
不指定 `release-type` 时,会根据提交记录推断并预选升级类型;CI 模式下自动采用该类型。可指定 `major`、`minor`、`patch` 或 `prerelease`。
|
|
95
57
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
58
|
+
```sh
|
|
59
|
+
pnpm exec release --dry-run
|
|
60
|
+
pnpm exec release minor --dry-run
|
|
61
|
+
pnpm exec release --ci
|
|
62
|
+
```
|
|
99
63
|
|
|
100
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
99
|
+
`defineConfig` 接受 `project`、可选的 `hosting`,以及 `checkout`、`bump`、`commit`、`tag`、`push`、`publish`、`release`、`pullRequest` 等步骤选项。项目和步骤选项的 TypeScript 类型可用于编辑器提示。
|
|
151
100
|
|
|
152
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
276
|
-
- ✅ 使用 OpenID Connect 进行身份验证
|
|
277
|
-
- ✅ 自动生成 provenance(来源证明)
|
|
120
|
+
本仓库也可作为 Action 使用。Action 要求配置文件定义 `project`,并使用 `github-token` 访问 GitHub API。`workflow` 的默认值为 `full`。
|
|
278
121
|
|
|
279
|
-
|
|
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
|
-
|
|
284
|
-
|
|
132
|
+
permissions:
|
|
133
|
+
contents: write
|
|
134
|
+
pull-requests: write
|
|
285
135
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
```
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
import { publishTagToNpm } from '@peiyanlu/release'
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
await publishTagToNpm({})
|
|
344
|
-
```
|
|
175
|
+
```yaml
|
|
176
|
+
name: Release
|
|
345
177
|
|
|
346
|
-
|
|
347
|
-
|
|
178
|
+
on:
|
|
179
|
+
issue_comment:
|
|
180
|
+
types: [ created, deleted ]
|
|
181
|
+
push:
|
|
182
|
+
branches:
|
|
183
|
+
- master
|
|
348
184
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
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
|
-
|
|
361
|
-
name: Publish
|
|
191
|
+
release:
|
|
362
192
|
runs-on: ubuntu-latest
|
|
363
|
-
|
|
364
193
|
steps:
|
|
365
|
-
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
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
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
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
|
-
|
|
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
|
-
|
|
406
|
-
|
|
297
|
+
| 值 | 行为 |
|
|
298
|
+
|----------------|---------------------------------------------------|
|
|
299
|
+
| `full` | 创建发布 Pull Request,并在发布提交上执行发布 |
|
|
300
|
+
| `pull-request` | 创建或更新发布 Pull Request |
|
|
301
|
+
| `release` | 执行发布提交对应的发布流程 |
|
|
302
|
+
| `snapshot` | 发布临时快照版本 |
|
|
303
|
+
| `check` | 检查事件上下文,并输出是否继续及应执行的 workflow |
|
|
407
304
|
|
|
408
|
-
|
|
305
|
+
主要 Action 输入:
|
|
409
306
|
|
|
410
|
-
|
|
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
|
-
|
|
325
|
+
## Conventional Commits 与版本
|
|
413
326
|
|
|
414
|
-
|
|
327
|
+
工具根据提交历史和 Conventional Commits 生成变更日志并计算版本。通常 `feat` 触发 minor,`fix`、`perf` 等触发 patch,破坏性变更触发 major;文档、测试、构建等不一定产生版本升级。可使用 `--dry-run` 预览结果。
|
|
415
328
|
|
|
416
|
-
|
|
329
|
+
## 许可证
|
|
417
330
|
|
|
418
|
-
[
|
|
331
|
+
[MIT](./LICENSE)
|