使用husky+commitizen+semantic-release实现项目的全自动版本管理和发布

为了从一个调包侠变成一个前端工程师,发一个npm包是必不可少的,但是手动npm publish并不方便,下面记录一种实现项目的全自动版本管理和发布的流程

安装依赖

  1. npm install -D husky @commitlint/config-conventional @commitlint/cli
  2. npm install -D commitizen cz-conventional-changelog
  3. npm install -D semantic-release @semantic-release/git @semantic-release/changelog @semantic-release/npm

初始化husky

  1. npx husky init即可(v9):

    1. 此命令会在 .husky/ 中创建 pre-commit 脚本,并更新 package.json 中的 prepare 脚本
    2. 如果要添加pre-commit钩子(比如lint操作),执行echo "pnpm run lint-staged" >> .husky/pre-commit(不要使用echo >,会覆盖文件)
  2. 使用commitlint校验commit信息(避免有人不用配置好的命令)

    1. 创建 commitlint.config.cjs并写入:

      javascript 复制代码
      module.exports = {
        extends: ["@commitlint/config-conventional"]
      };
    2. 添加钩子echo 'npx --no-install commitlint --edit "$1"' >> .husky/commit-msgcommit-msg也是一个git hook,作用在git commit 之后,但 commit 还未完成时)

初始化commitizen

  1. package.json 中添加 config.commitizen 配置:

    javascript 复制代码
    {
      "config": {
        "commitizen": {
          "path": "cz-conventional-changelog"
        }
      }
    }
  2. 此时运行pnpm cz即有交互式界面,如果想更简化,可以在package.json的scripts中添加"commit": "git add . && pnpm cz && git push origin main"

配置semantic-release

  1. 新建release.config.cjs文件,写入:

    javascript 复制代码
    module.exports = {
      branches: ["main"], // 仅在 main 分支发布
      repositoryUrl: "git@github.com:osmanthuspeace/osp-cli.git",  // 强制使用 SSH(如果不允许https链接的话)
      plugins: [
        "@semantic-release/commit-analyzer",  // 分析 commit 记录,确定版本号(major/minor/patch)
        "@semantic-release/release-notes-generator",  // 生成 release notes
        "@semantic-release/changelog",  // 更新 CHANGELOG.md
        ["@semantic-release/npm", {
          "npmPublish": true, // 修改 package.json 版本,并发布到 npm
        }],
        ["@semantic-release/git", {
          "assets": ["package.json", "CHANGELOG.md"], // 自动更新的文件
          "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
        }]
      ]
    };
  2. commit信息为feat!会触发major改变,feat触发minor,fix触发patch

使用Github Action

  1. .github/workflow**s**/release.yml 中写入(注意注释):

    yml 复制代码
    name: Release
    
    on:
      push:
        branches:
          - main
    
    jobs:
      release:
        runs-on: ubuntu-latest
        permissions:
          contents: write
          issues: write
          pull-requests: write
          id-token: write # <https://github.com/semantic-release/npm/blob/master/README.md#npm-provenance-on-github-actions>
    
        steps:
          - name: Checkout repository
            uses: actions/checkout@v4
            with:
              fetch-depth: 0 # 重要:必须获取完整的 Git 历史
    
          - name: Set up Node.js
            uses: actions/setup-node@v4
            with:
              node-version: "latest" # 需要20+
              registry-url: "<https://registry.npmjs.org/>"
    
          - name: Set up pnpm
            uses: pnpm/action-setup@v2 # 使用官方的 pnpm action
            with:
              version: 8
    
          - name: Install dependencies
            run: pnpm install
    
          - name: Run Semantic Release
            env:
              GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # 无需手动设置,GitHub 会自动注入
              NPM_TOKEN: ${{ secrets.NPM_TOKEN }} # 手动设置,使用Automation类型的Token
            run: npx semantic-release
  2. NPM_TOKEN在npm个人页面→Access Tokens→Generate New Token→Classic Token→Automation获取,

    然后放在github上Settings→Secrets and variables→Actions→Repository secret中

踩坑记录

  1. 默认生成的npm test命令会抛错,可以先用"test": "echo \"No tests yet\"",代替

  2. 根目录要有.npmrc,写入一行

    ini 复制代码
    //registry.npmjs.org/:_authToken=${NPM_TOKEN}
  3. NPM_TOKEN要使用Automation类型,其他的不行

  4. semantic-release使用git tag来分析版本号,运行git tag检查仓库中的 tag,运行git ls-remote --tags origin检查远程仓库中的tag,运行npm view project_name versions查看npm仓库中的tag

  5. 运行npx semantic-release --dry-run可以进行测试

  6. 如果之前已经发布了几版,那么可能版本会有冲突,需要删除package.json中的version字段重新推送

相关推荐
神奇的程序员5 小时前
开发了一个管理本地开发环境的软件
前端·flutter
天若有情6735 小时前
程序员原创|借鉴JS事件冒泡,根治电脑文件混乱的“冒泡整理法”
开发语言·javascript·windows·ecmascript·电脑·办公·日常
XiYang-DING6 小时前
HTML 核心标签
前端·html
Csvn6 小时前
技术选型方法论
前端
Csvn6 小时前
前端架构演进:从页面到平台的十年变革
前端
李伟_Li慢慢6 小时前
ShaderToy-山峦+蓝天+白云
前端·webgl
小码哥_常7 小时前
Android字体字重设置全攻略:XML黑科技+Kotlin动态实现,告别.ttf臃肿
前端
FYKJ_20107 小时前
springboot校园兼职平台--附源码02041
java·javascript·spring boot·python·eclipse·django·php
言萧凡_CookieBoty8 小时前
AI 编程省 Token 实战:从 Spec、上下文工程到模型分层的降本策略
前端·ai编程
DFT计算杂谈8 小时前
wannier90 参数详解大全
java·前端·css·html·css3