Skip to content

使用 changesets 的官方 github 工作流实现发包

提示

这是第二版本的发包实践。

使用该工作流,同时生成 github release 发行记录,和 changelog 变更日志文件。

想办法同时实现 github release 和 changelog 的生成

在一次提交内,实现两个 github release 的发布,并给各自的子包生成 changelog 文件。

2025-07-01-22-16-56

2025-07-02-18-04-43

总是说 404 错误

无法发包,总是说 404 错误。

log
error an error occurred while publishing @xxxx/xxx: E404 Not Found - PUT https://registry.npmjs.org/@xxxx - Not found
error npm error 404  '' is not in this registry.
yaml
- name: 在 .npmrc 内写入token
  run: |
    cat << EOF > "$HOME/.npmrc"
      //registry.npmjs.org/:_authToken=$NPM_TOKEN
    EOF
  env:
    NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

- name: 构建并发版
  id: changesets
  uses: changesets/action@v1
  with:
    commit: "chore: release package(s)"
    title: "chore: release package(s)"
    publish: pnpm release
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

配置 NODE_AUTH_TOKEN 环境变量即可,太坑了。要看官方 issue 才有相关的说明。

进度

现在确实实现了基于 changesets/action 工作流的发包,但是 github release 的报告是混杂混乱的。不是短小的增量提交。

要看看是不是非要实现完整的 pr 才能触发发包。

提交变更集

现在将变更集提交并合并到 main 分支内了,新建了分支,但是没有新建 pr。

log
Error: HttpError: Validation Failed: {"resource":"PullRequest","code":"custom","message":"No commits between main and changeset-release/main"} - https://docs.github.com/rest/pulls/pulls#create-a-pull-request
Error: Validation Failed: {"resource":"PullRequest","code":"custom","message":"No commits between main and changeset-release/main"} - https://docs.github.com/rest/pulls/pulls#create-a-pull-request

起因是我没有配置对正确的 version 命令。

整个发包的操作流程

  1. 提交变更集文件到 dev 内。
  2. 本地合并分支到主分支,生成 pr。
  3. 合并 pr,触发发包。

参考资料

基于 changesets/action 工作流和 NODE_AUTH_TOKEN 的发包工作流

发包工作流
yml
name: Release

env:
  # https://turborepo.com/docs/crafting-your-repository/constructing-ci#enabling-remote-caching
  # https://vercel.com/docs/monorepos/remote-caching#use-remote-caching-from-external-ci/cd
  TURBO_TOKEN: ${{ secrets.vercel_token }}
  TURBO_TEAM: "ruancat-projects"

permissions: write-all

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

on:
  push:
    branches:
      - main

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: 安装pnpm
        uses: pnpm/action-setup@v4
        with:
          run_install: |
            - recursive: true
            - args: [--global, "vercel", "@dotenvx/dotenvx", "tsx", "turbo"]

      - name: 安装node
        uses: actions/setup-node@v4
        with:
          node-version: 22.14.0
          cache: pnpm
          registry-url: "https://registry.npmjs.org"

      - name: corepack手动再安装一次pnpm
        run: corepack enable && corepack prepare pnpm@9.5.0 --activate

      - name: 安装整个项目的依赖
        run: pnpm i

      - name: turbo login 远程登录
        run: turbo login --token=${{env.TURBO_TOKEN}} --team=${{env.TURBO_TEAM}}

      - name: turbo link 链接远程项目
        run: turbo link --token=${{env.TURBO_TOKEN}} --scope=${{env.TURBO_TEAM}} --yes

      - name: 在 .npmrc 内写入token
        run: |
          cat << EOF > "$HOME/.npmrc"
            //registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}
          EOF
        env:
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

      - name: 构建项目
        run: pnpm run build

      - name: 构建并发版
        id: changesets
        uses: changesets/action@v1
        with:
          publish: pnpm release
          version: pnpm run version
          commit: "📢 publish: release package(s)"
          title: "📢 publish: release package(s)"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

      - name: 同步GitHub Release
        if: steps.changesets.outputs.published == 'true'
        run: tsx scripts/sync-github-release.ts
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GITHUB_REPOSITORY: ${{ github.repository }}
          PUBLISHED_PACKAGES: ${{ toJson(steps.changesets.outputs.publishedPackages) }}

      - name: 触发部署工作流
        if: steps.changesets.outputs.published == 'true'
        uses: peter-evans/repository-dispatch@v3
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          event-type: deploy-after-release
          client-payload: |
            {
              "published": true,
              "publishedPackages": ${{ toJson(steps.changesets.outputs.publishedPackages) }},
              "ref": "${{ github.ref }}",
              "sha": "${{ github.sha }}"
            }

其他尝试的记录

trigensoftware/simple-release-action

这个工作流,有点复杂,在 github action 内写的非常冗杂。

不能学。

semantic-release

这个 github action 写的比较简单,不清楚能不能完成发包。可以试试看。代替现在的发包写法。

贡献者

The avatar of contributor named as ruan-cat ruan-cat

页面历史

最近更新