库实践-版本管理changesets

581 阅读3分钟

最近在搞一个新的库,遇到了些需求:

  • 版本发布心智成本高。得确定哪些库要发!手动发布麻烦!
  • changelog 维护麻烦
  • tag 经常忘记打
  • beta 版本发布麻烦。

最终找到了 changesets,这里分享总结给大家。

在没遇到 changesets 之前,你可能听说过。

release-please

关于 conventional commit ,见这里 www.yuque.com/liyatang/he…

第一个想到的是依赖 conventional commit 来生成 changeog.md 靠不靠谱?

个人觉得提交规范是合理的,比如 feat: xxxxx 可以生成一条 changelog 记录,同时应该发布一个 minor 版本。比如 fix: xxx 可以生成一条 changeog 记录,同时应该发布一个 patch 版本。

如果 commit 错了,那么需要通过修改 commit。

但是我日常开发是比较多 commit 的,可能一个功能我需要 commit 多次,对应 changelog只需要一个即可。

所以我认为通过 conventional commit 来生成 changelog 是理想的。不予采纳。之后没有深入了解 release-please 了。

changesets

A way to manage your versioning and changelogs with a focus on monorepos。

pnpm 和 mobx 都在用 changesets。

综合看下来,选择 changsets 的原因是

  • 不耦合 conventinoal commit,版本信息独立维护,通过 npx changeset 录入。
  • 更多控制权在用户手里,不黑盒。
  • github action。

缺点

  • 似乎维护不够积极。目前看到 issues 294 个,Pull Requests 79 个。

Demo

这是我的一个 demo,请结合看 github.com/liyatang/te…

初始化

npx changeset int

npx changeset init 生成 .changeset文件夹。其中

  • config.json 是 changeset 的配置文件
  • xxxx.md 是多个 md 文件,记录 changelog 和 version。供后面真正变更版本使用

add workflows

添加文件 .github/workflows/release.yml,内容参考 github.com/liyatang/te…

name: Release

on:
  push:
    branches:
      - main

# 并行
concurrency: ${{ github.workflow }}-${{ github.ref }}

jobs:
  release:
    name: Release
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Branch
        uses: actions/checkout@v3

      - name: Setup Node.js 18.x
        uses: actions/setup-node@v3
        with:
          node-version: 18.x

      - name: Install pnpm
        uses: pnpm/action-setup@v2
        with:
          version: 8

      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

      - uses: actions/cache@v3
        name: Setup pnpm cache
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-

      - name: Install Dependencies
        run: pnpm install

      - name: Changesets Version & Publish to npm
        id: changesets
        uses: changesets/action@v1
        with:
          version: pnpm ci:version
          publish: pnpm ci:release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

      - name: Send Notification if a publish happens
        if: steps.changesets.outputs.published == 'true'
        uses: chf007/action-wechat-work@master
        env:
          WECHAT_WORK_BOT_WEBHOOK: ${{secrets.WECHAT_WORK_BOT_WEBHOOK}}
        with:
          msgtype: text
          content: ${{steps.changesets.outputs.publishedPackages}}

add secrets.NPM_TOKEN

申请 npm token docs.npmjs.com/creating-an…

然后设置即可

设置 action 权限

设置更多权限,以便提交 tag 和 创建 PR。

工作流

1 开发

  • main 切分支 feature_xxx or hotfix_xxx
  • 日常变更
  • 记录变更 npx changeset,选择包和版本和记录 changelog。会在 .changeset 下生成 md 文件。可多个。
  • git commit 提交变更

2 发布确认

  • 提交 PR(merge into main from xxx)
    • review 日常变更
    • review 变更记录。.changeset 下的 md 文件(如果不满意需改动)
  • Merge

3 发布

  • Merge 后触发 github action,执行以下操作
    • 生成 CHANGELOG.md 和 package version
    • 提交 PR(merge into main from changeset-release/main)
  • 再次 Merge 后触发 github action,执行以下操作
    • 调整 workspace 版本依赖
    • 发布到 npm & github release
    • 打 tag 并推送到 github
    • notification

工作流思维导图如下

资料