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

相关推荐
吞吞07111 分钟前
浅谈前端性能指标、性能监控、以及搭建性能优化体系
前端
JiangJiang2 分钟前
5 分钟掌握 TypeScript 结构化类型系统,一次搞懂鸭子类型!
javascript·面试
arcsin12 分钟前
雨水-electron项目实战登录
前端·electron·node.js
卑微小文11 分钟前
企业级IP代理安全防护:数据泄露风险的5个关键防御点
前端·后端·算法
SameX12 分钟前
HarmonyOS Next ohpm-repo私有仓库的配置与优化
前端·harmonyos
咪库咪库咪13 分钟前
async await
前端·javascript
华科云商xiao徐14 分钟前
用TypeScript和library needle来创建视频爬虫程序
前端
养生匠15 分钟前
我写了个yapi 转化前端ts请求接口的代码,真的很好用
javascript
hahala233316 分钟前
依赖注入(DI)
javascript·node.js
任尔东西南北风18 分钟前
前端请求工具封装
前端·javascript