使用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-msg(commit-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字段重新推送

相关推荐
IT_陈寒15 分钟前
JavaScript的闭包陷阱,这个坑我躺了三天才爬出来
前端·人工智能·后端
计算机魔术师24 分钟前
Microsoft Research 与合作者证明 31 年历史的 KLS 猜想
前端
weixin_4173968333 分钟前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电
OpsEye1 小时前
怎么实现大模型的按用户、按应用配额限流?
javascript·ai编程
林恒smileZAZ1 小时前
浏览器为什么加载不了超大图片
前端·vue.js·html5
hhwyqwqhhwy2 小时前
设备树之 provider 和 consumer
java·linux·前端
云舜言传2 小时前
Bloom 手势演示操作 · 录屏指南
javascript·深度学习·机器学习
垆边人似月.3 小时前
Python中如何使用get函数实现频次查询
服务器·前端·python
moshuying3 小时前
DeepSeek开源生产级推理框架DeepInfer:单集群一天处理155万亿token,这意味着什么?
前端
子兮曰4 小时前
PHP漏洞危机,你的网站升级了吗?
前端·后端·php