用途
pypi-ops 负责 Python 包发布流水线中的“注册表发布”这一层:把包发布到 PyPI,并处理发布握手、首次发布的特殊配置以及发布失败后的恢复。资料将其定位为发布层技能,并说明它与其他技能的分工:通用 GitHub Actions 语法属于 ci-cd-ops,安装侧的蠕虫防御属于 supply-chain-defense,GitHub 发布页机制属于 github-ops。
主要能力
- 默认采用 OIDC Trusted Publishing(受信发布),配合 PEP 740 签名证明与 pypa/gh-action-pypi-publish,避免存储长期 token。
- 提供发布前预检脚本 scripts/publish-preflight.sh,检查版本一致性、版本是否已存在于 PyPI、锁文件版本、标签与版本是否匹配、发布工作流是否使用 OIDC 等;加 --build 还会实际构建并执行 twine check。
- 提供发布失败诊断脚本 scripts/diagnose-publish.sh,可读取 gh run 日志并给出原因与修复建议。
- 提供加固过的 GitHub Actions 发布模板 assets/publish.yml,包含标签触发、OIDC 无 token、environment: pypi 人工审批、构建与发布分离、uv sync --locked 与 pip-audit、twine check、SHA 固定 action、发布后到 PyPI 校验等模式。
- 提供 action 固定版本检查脚本 scripts/check-action-pins.py,支持 --offline 结构检查与 --live 解析标签检测 SHA 漂移。
- 提供参考文档:references/trusted-publishing.md(OIDC 设置、pending 与项目发布者、OIDC claim 语义、环境、TestPyPI、token 迁移)、references/recovery-playbook.md(失败分类目录与机制)、references/uv-publish.md(本地/手动发布、uv build/uv publish、twine、~/.pypirc、构建后端)。
使用方式
资料给出的推荐流程是:先用 supply-chain-defense 审查依赖,再运行发布前预检,然后由 git-ops 完成版本号提升、打标签、推送,CI 通过 OIDC 发布并在 pypi 环境门等待人工批准,最后可选由 github-ops 生成发布页。
首次发布的关键坑:项目尚不存在,无法在项目设置下配置 Trusted Publisher,需要在账号级别注册 pending publisher。资料给出的失败症状为 “invalid-publisher: valid token, but no corresponding publisher”。修复路径是 PyPI 的 https://pypi.org/manage/account/publishing/ 添加 pending publisher,并确保 PyPI Project Name、Owner、Repository name、Workflow name(文件名而非 name:)、Environment name 四项 claim 与运行的 OIDC token 完全一致。首次成功发布后,pending publisher 会自动转为普通项目发布者。
本地或手动发布可使用 uv:
uv build uv publish --trusted-publishing automatic UV_PUBLISH_TOKEN="pypi-…" uv publish
也可使用 twine 作为规范回退与元数据校验:
python -m twine check dist/* python -m twine upload dist/*
资料强调不要手写 HTTP 上传。对于全新包或高风险元数据变更,建议先在 TestPyPI 试发布,指向 repository-url: https://test.pypi.org/legacy/ 并在 TestPyPI 注册 pending publisher。
适用场景
- 通过 CI/CD 发布 Python 包到 PyPI,尤其是希望摆脱长期 token 的项目。
- 首次发布遇到 invalid-publisher 等发布者未注册问题。
- 发布失败需要按失败类别定位原因并恢复。
- 多仓库以相同方式发布时,将发布任务提升为可复用工作流(on: workflow_call),各包用小型调用方传入 dist 名称;OIDC 仍可用,因为 PyPI 匹配的是调用方 workflow_ref,需按调用方文件名(如 release.yml)注册各包的 pending publisher。
- 需要定期检查 action 固定版本是否漂移。
限制与注意事项
- 资料未提供该技能的收费、价格、平台支持范围或效果数据。
- 上传到 PyPI 的版本不可变,不能重复推送同一版本号。
- 若使用 token,应轮换为项目范围、短期有效的 token,更好的做法是迁移到 OIDC 并删除 token。
- 应定期撤销不再使用的 Trusted Publisher / OIDC 联合,避免孤立发布者成为攻击入口。
- 发布前应审查构建依赖,因为构建会在铸造 OIDC token 之前运行依赖代码。
- 资料未提供除上述脚本与模板之外的其他功能或安装命令细节。