发布流程:提交、打 Tag、GitHub Release、PyPI¶
本文档说明从代码提交到打 tag、创建 GitHub Release、以及发布 PyPI 包的操作步骤与命令。适用于维护者每次发版时按顺序执行。
重要说明¶
PyPI 包名与链接¶
- 本项目的 PyPI 包名是
openclaw-py(在pyproject.toml的name = "openclaw-py")。 - 正确链接:https://pypi.org/project/openclaw-py/
- 若访问的是 https://pypi.org/project/pyclaw/ ,那是另一个项目,不是本仓库的包。本仓库的 CLI 入口叫
pyclaw,但发布到 PyPI 的包名是openclaw-py。
GitHub Release 与 Tag 的关系¶
- GitHub Release 由“推送到远程的 tag”自动触发,由
.github/workflows/release.yml执行。 - 若只在本机打了 tag 但未
git push origin <tag>,则不会触发 Release 和 PyPI 发布。 - 若之前只推送过
v0.1.2,则 GitHub 的 Releases 页面只会看到 v0.1.2;tag 为v0.1.6时,需要推送该 tag 才会生成 v0.1.6 的 Release。 - 版本号必须一致:
pyproject.toml里的version应与要打的 tag 去掉前缀v后一致(例如 tagv0.1.7对应version = "0.1.7")。
一、发布前检查¶
-
确认当前分支(一般为
master或main): -
确认版本号:编辑
pyproject.toml,将version改为本次要发布的版本(如0.1.7): -
本地跑通检查与测试(与 CI 一致):
二、提交并推送到 GitHub¶
-
提交版本号变更(若有其他改动一并提交):
-
推送到远程:
(若默认分支是main,则改为git push origin main。)
三、打 Tag 并推送(触发 Release 与 PyPI)¶
-
创建带注释的 tag(推荐,便于在 Releases 里看到说明):
-
推送该 tag 到远程(推送后会自动触发
.github/workflows/release.yml): -
若之前误打了同版本 tag 需要删除(慎用):
四、自动流程说明(push tag 之后)¶
推送 v* tag 后,GitHub Actions 会依次执行:
| 步骤 | 说明 |
|---|---|
| preflight | 安装依赖、lint(ruff)、mypy、pytest、python -m build,并上传 dist/ 为 artifact。 |
| release-notes | 用 scripts/generate-release-notes.sh 生成 Release 说明,并创建 GitHub Release,附带 dist/* 中的 sdist 与 wheel。 |
| publish-testpypi | 将包发布到 TestPyPI(需在仓库中配置 testpypi environment,可选)。 |
| publish-pypi | 将包发布到 PyPI(需在仓库中配置 PyPI Trusted Publisher 和 pypi environment)。 |
| publish-docker | 构建并推送 Docker 镜像到 Docker Hub 与 GHCR(需配置 DOCKERHUB_USERNAME / DOCKERHUB_TOKEN)。 |
- 若 PyPI 没有出现新版本:检查 Actions 里
publish-pypi是否失败;若使用 Trusted Publisher,需在 PyPI 账户的 Publishing 设置 中添加对应 GitHub 仓库与 workflow。若 tag 已推送但 Release 未生成:多半是 preflight 失败(例如测试因缺依赖失败),Release 与 PyPI 都不会执行;修好代码/工作流后需重新触发该 tag 的 Release 工作流(见下文「补发」)。 - 若 GitHub Release 没有出现:检查是否真的执行了
git push origin v0.1.7,以及 Actions 中release-notes是否成功;若 preflight 失败,Release 不会创建。
五、PyPI 未看到包时的排查¶
- 确认链接:应打开 https://pypi.org/project/openclaw-py/ ,不是
pyclaw。 - 确认 Trusted Publisher:在 PyPI Publishing 中为该仓库配置 Trusted Publisher,并确保 workflow 名为
release.yml、job 名为publish-pypi,且仓库 environment 使用pypi。 - 查看 Actions:在 GitHub 仓库的 Actions 里打开由 tag 触发的 “Release” workflow,查看
publish-pypi的日志是否报错(如 403、包名/版本已存在等)。
六、tag 已推送但 Release/PyPI 未生成时(补发)¶
若 tag(如 v0.1.7)已推送到 GitHub,但 GitHub Release 或 PyPI 没有对应版本,通常是 Release 工作流的 preflight 曾失败(例如测试失败、缺依赖等)。修好原因后需要重新触发该 tag 的发布:
- 确保修复已合并并推送到默认分支(如
master)。 - 删除远程 tag(GitHub 上已有的 Release 若存在可先手动删掉):
- 在要发版的提交上重新打 tag 并推送(一般用当前 master 的 commit,且该 commit 的
pyproject.toml中version已为该版本): - 推送后 Release 工作流会再次运行,preflight 通过后会自动创建 GitHub Release 并发布 PyPI。
七、常用命令速查¶
# 1. 改版本号后提交
vim pyproject.toml # version = "0.1.7"
git add pyproject.toml && git commit -m "chore: bump version to 0.1.7"
git push origin master
# 2. 打 tag 并推送(触发 Release + PyPI)
git tag -a v0.1.7 -m "Release v0.1.7"
git push origin v0.1.7
# 3. 查看已有 tag
git tag -l
# 4. 本地生成 Release 说明(不发布)
./scripts/generate-release-notes.sh
# 或自上次 tag 到当前:./scripts/generate-release-notes.sh
# 或两 tag 之间:./scripts/generate-release-notes.sh v0.1.6 v0.1.7
八、参考¶
- PyPI: Publishing package distribution releases using GitHub Actions
- 本仓库 Release 工作流:
.github/workflows/release.yml - 发布说明脚本:
scripts/generate-release-notes.sh