Skip to content

参考:semantic-release 速查

基于 semantic-release v25 · 核于 2026-07

速查

  • 心智模型下一版本 = f(上次 tag, 之后的提交);全自动、只在 CI 跑、无相关提交则不发。
  • 版本映射fix/perf→patch、feat→minor、BREAKING CHANGE(或 !)→major、其余类型不发。
  • 生命周期九步verifyConditions→analyzeCommits→verifyRelease→generateNotes→prepare→publish→addChannel→success→fail;仅 analyzeCommits 必需。
  • 默认插件commit-analyzer+release-notes-generator+npm+github;自定义 plugins覆盖非追加。
  • 全局选项八个extends/branches/repositoryUrl/tagFormat/plugins/dryRun/ci/debug
  • CI 三前提fetch-depth: 0、写权限、注入 token。
  • 凭据GITHUB_TOKEN/NPM_TOKENGITHUB_TOKEN 兼 Git 推送 + API。
  • 分支三类:正式 / 维护(1.x) / 预发布(beta);channel = npm dist-tag。
  • @semantic-release/git 回提交:默认信息带 [skip ci] 防死循环;多半不需要它。
  • 规范守门:commitlint + Husky 拦不合规提交(semantic-release 自己不校验)。
  • 运行npx semantic-release@25;本地默认 dry-run;Node ≥ 22.14。

一、全局配置项

选项默认值CLI说明
extends-e/--extends继承 shareable config
branches['+([0-9])?(.{+([0-9]),x}).x','master','main','next','next-major',{name:'beta',prerelease:true},{name:'alpha',prerelease:true}]--branches发布分支定义
repositoryUrl由 pkg/git 推断-r/--repository-url仓库地址
tagFormatv${version}-t/--tag-formattag 命名模板
pluginscommit-analyzer,release-notes-generator,npm,github-p/--plugins插件列表(覆盖非追加)
dryRunCI:false 本地:true-d/--dry-run只演练不发布
citrue--ci/--no-ci是否要求 CI 环境
debugfalse--debug详细日志

插件选项不能用 CLI 传,只能写配置文件。优先级:CLI > 配置文件 > extends

二、配置文件格式

.releaserc(YAML/JSON)· .releaserc.{yaml,yml,json,js,cjs,mjs} · release.config.{js,cjs,mjs} · package.json"release" 键。任选其一放仓库根。

三、提交类型 → 版本跳变(angular 预设)

提交跳变
fix: / perf:patch
feat:minor
feat!: / 脚注 BREAKING CHANGE:major
docs/style/chore/refactor/test/ci/build不发布

一次发布取区间内最高等级;可用 commit-analyzerpreset/releaseRules 定制。

四、生命周期与插件对照

Step必需典型插件
verifyConditionsnpm / github / git / changelog
analyzeCommitscommit-analyzer
verifyReleaseexec
generateNotesrelease-notes-generator
preparechangelog / npm / git
publishnpm / github / gitlab
addChannelnpm / github
successgithub
failgithub

多插件同 step 合并analyzeCommits 取最高;generateNotes 拼接;其余按 plugins 顺序依次执行。

五、常用插件

插件step用途
@semantic-release/commit-analyzeranalyzeCommits判定发布类型
@semantic-release/release-notes-generatorgenerateNotes生成发布说明
@semantic-release/changelogverifyConditions/prepareCHANGELOG.md
@semantic-release/npmverifyConditions/prepare/publish改版本 + 发 npm
@semantic-release/gitverifyConditions/prepare回提交(默认带 [skip ci]
@semantic-release/githubverifyConditions/publish/success/fail建 GitHub Release + 通知
@semantic-release/gitlabverifyConditions/publish建 GitLab Release
@semantic-release/exec几乎所有 step执行自定义命令(monorepo/非 JS)

六、分支属性

属性适用含义
name全部(必填)分支名 / glob
channel全部npm dist-tag(首个正式分支默认 latest)
range维护版本范围(1.xN.x/N.N.x 可省)
prerelease预发布标识(beta2.0.0-beta.1

七、凭据速查

变量用途
GITHUB_TOKEN / GH_TOKENGit 推送 + GitHub API(打 tag/建 Release/评论)
GITLAB_TOKEN / GL_TOKENGit 推送 + GitLab API
BB_TOKEN / GIT_CREDENTIALSBitbucket / 通用 Git 凭据
NPM_TOKENnpm publish(仅支持 auth-only 2FA;CI 用 automation token 或 OIDC)

八、常见坑清单

  • fetch-depth: 0 忘配 → 浅克隆算不出历史 tag,误判首发 / 版本错乱。
  • plugins 覆盖非追加 → 自定义后漏列 commit-analyzer,永远不发版。
  • GitHub Actions 权限不足 → 未设 permissions: contents: write,打 tag/建 Release 报 403。
  • 分支保护挡推送 → 目标分支要求 PR,直接 push tag/commit 被拒;需允许发布身份绕过。
  • @semantic-release/git 少了 [skip ci] → 回提交再触发 CI,无谓构建甚至死循环。
  • 中途改 tagFormat → 匹配不到旧 tag,误判首发。
  • 在矩阵/多 Job 里跑多份 → 应仅在测试全过后的单个发布 Job 跑一次。
  • 提交不规范却没守门 → 该发的没发 / 版本乱跳;配 commitlint + Husky。
  • npm publish 级 2FA → CI 无法自动发布;改 automation token 或 OIDC Trusted Publishing。
  • 误以为「没发版」是 bug → 无相关提交时不发布是设计,退出码 0。

九、权威链接