使用 changesets 的官方 github 工作流实现发包
提示
这是第二版本的发包实践。
使用该工作流,同时生成 github release 发行记录,和 changelog 变更日志文件。
想办法同时实现 github release 和 changelog 的生成
在一次提交内,实现两个 github release 的发布,并给各自的子包生成 changelog 文件。


总是说 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 }}- https://github.com/changesets/action/issues/311#issuecomment-1666950465
- https://zhuanlan.zhihu.com/p/25771848717
配置 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 命令。
整个发包的操作流程
- 提交变更集文件到 dev 内。
- 本地合并分支到主分支,生成 pr。
- 合并 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
- https://github.com/semantic-release/semantic-release
- https://semantic-release.gitbook.io/semantic-release/recipes/ci-configurations/github-actions
这个 github action 写的比较简单,不清楚能不能完成发包。可以试试看。代替现在的发包写法。