PyPI 发布前的手工准备
整理日期:2026-10-01。本文面向维护者,说明在生成库代码之前可以完成的账户注册、发布身份配置和资料准备。构建、质量检查和实际发布流程见 CI/CD 落地参考。
现在可以注册 PyPI 与 TestPyPI 账户、验证邮箱、启用双因素认证,并预先配置 GitHub 发布环境和 pending publisher(待启用发布者)。 后者允许首次通过 CI 上传时创建项目,但不预留包名。PyPI 新项目发布说明
当前已建立包构建、主分支 CI 和同批候选制品验收工作流。TestPyPI 显式手动发布可使用维护者提供的 API token,操作与验收见 CI/CD 落地参考,首次测试发布记录见 Issue #26。下文的 Trusted Publishing 仍是自动发布配置方案;建议值不表示账户、权限或发布者已经配置成功。
可以提前做什么
| 手工事项 | 何时可以做 | 完成依据 |
|---|---|---|
| 注册 PyPI 与 TestPyPI 账户 | 现在 | 两个站点分别可以登录 |
| 验证邮箱、配置 2FA 和保存恢复码 | 注册后 | 两个站点的账户设置分别显示已完成 |
| 确定拟用包名、公开署名与联系资料 | 现在 | 已选定资料;包名仍需服务端接受 |
| 创建 GitHub 发布环境 | 拥有仓库设置权限且套餐支持时 | 环境及允许的分支规则可见 |
| 添加 pending publisher | 发布仓库、工作流文件名和环境名确定后 | 两个站点分别显示待启用发布者 |
| 创建 PyPI 项目、验证上传与安装 | 有通过验收的真实制品后 | 首次上传成功,完成发布后检查 |
账户与环境准备可独立于代码生成进行;现在不需要上传空包来启动流程。
1. 注册两个独立账户
| 平台 | 注册入口 | 登录后的设置入口 | 用途 |
|---|---|---|---|
| PyPI | 注册正式账户 | 账户设置 | 正式分发 |
| TestPyPI | 注册测试账户 | 账户设置 | 演练上传和安装 |
分别准备用户名、可长期访问的邮箱和密码;已有账户可直接使用。PyPI 用户名不需要与 GitHub 用户名或包名相同。TestPyPI 的账户和项目数据独立,不会从正式站同步;测试站数据也不适合用作长期发布记录。TestPyPI 官方说明
在每个站点完成以下操作:
- 点击验证邮件中的链接,确认邮箱已验证。
- 在账户设置启用双因素认证(2FA),使用认证器或支持的安全设备完成验证。
- 生成恢复码并保存在自己的密码管理器或其他安全位置,确保更换设备后仍可恢复账户。
正式 PyPI 要求账户启用 2FA,创建项目或上传还需要已验证的邮箱。本项目在测试站也执行同样的准备步骤。PyPI 账户与认证帮助
密码、认证器密钥、恢复码及令牌均由维护者自行保管,不填入本文、GitHub Issue 或聊天。下面的交接内容只需要非敏感配置。
2. 确定包名与公开资料
以下值用于后续表单和 pyproject.toml,目前无需手写构建配置。
| 项目 | 当前依据或建议值 | 需要维护者填写或核对的内容 |
|---|---|---|
| PyPI 分发名称 | rpkiparrot |
拟使用;尚未确认可创建 |
| Python 导入名 | rpkiparrot |
与当前库设计一致 |
| GitHub 仓库 | https://github.com/bgpglobal/rpkiparrot |
核对这是最终发布仓库,且自己具有设置权限 |
| 源码链接 | 同上 | 后续用于包的项目链接 |
| 问题反馈链接 | https://github.com/bgpglobal/rpkiparrot/issues |
核对 Issues 已启用 |
| 公开作者或维护者名称 | 待填写 | 选择愿意公开的个人名或项目署名 |
| 公开联系邮箱 | 待填写,也可不提供 | 与登录邮箱分别考虑;写入包元数据的邮箱会公开 |
| 许可证 | 仓库已有 Apache License 2.0 | 后续元数据与现有许可一致,使用 Apache-2.0 并打包许可文件 |
| 独立文档站地址 | https://rpkiparrot.bgp.global/docs/ |
源码生成的 API 参考与使用文档已部署 |
作者和公开联系邮箱属于可准备的展示资料,不是本项目要求注册账户时必须公开的凭据;具体元数据检查见 CI/CD 落地参考。
可查看 正式站的拟用项目地址 了解是否已有同名项目。即使页面不存在,也不能证明名称可用:名称可能被保留、被禁止或与已有项目冲突,最终由服务端判断。PyPI 名称帮助
pending publisher 不创建项目、不占有名称。 若其他人先创建同名项目,待启用配置会失效。首次发布前重新核对名称;若已是自己拥有的项目,使用下文的已有项目入口。pending publisher 的名称规则
3. 提前建立 GitHub 发布环境
建议本仓库使用以下命名,后续生成工作流时与手工配置保持一致:
| 配置 | 建议值 | 含义 |
|---|---|---|
| 发布工作流文件 | .github/workflows/release.yml |
计划中的文件,目前尚未创建 |
| 正式发布环境 | pypi |
正式站上传任务使用 |
| 测试发布环境 | testpypi |
测试站上传任务使用 |
打开仓库的 Settings → Environments,通过 New environment 分别创建两个环境。个人仓库需要所有者权限;组织仓库需要管理员权限。环境功能也取决于仓库可见性和 GitHub 套餐:公共仓库可用,当前仓库为私有,使用环境功能需要相应付费套餐;看不到入口时先核对这两项。GitHub 环境配置说明
针对本项目单人维护、直接在 main 开发的流程,建议初次接入采用以下设置:
- 两个环境的 Deployment branches and tags 选择 Selected branches and tags,添加类型为 Branch、名称为
main的规则。 - 发布工作流先采用在
main上显式手动触发的方式,并固定验收的提交;普通main推送只运行 CI。 - 如果后续采用版本 tag 触发,再增加类型为 Tag 的对应规则,例如
v*。工作流还须校验 tag 指向经完整验收的main提交;仅匹配 tag 名不足以保证来源正确。 - 不把第二名维护者审批作为发布前提,也不设置让唯一维护者无法完成发布的审批组合。这与当前主分支开发约定一致。
这里限制的是发布任务可以使用的环境,不改变日常直接推送 main 的方式。若套餐暂不支持环境,可先完成账户准备;环境字段在 PyPI 侧是可选项,但本方案建议保留,工作流落地时再明确可用配置,不把尚不存在的环境记作已验证。PyPI 环境字段说明
4. 分别填写 pending publisher
项目尚未创建时,登录后进入账户级入口:
- 正式站:PyPI → Publishing。
- 测试站:TestPyPI → Publishing。
选择 GitHub 发布者,按下表填写并添加。可以先约定工作流文件名,之后由 Codex 或 Claude Code 创建对应文件;无需为了配置发布身份先手工上传第一个包。PyPA 接入指南
| 表单字段 | PyPI 填写值 | TestPyPI 填写值 |
|---|---|---|
| PyPI Project Name | rpkiparrot,以最终名称为准 |
rpkiparrot,另行核对测试站可用性 |
| Owner | bgpglobal |
bgpglobal |
| Repository name | rpkiparrot |
rpkiparrot |
| Workflow name | release.yml |
release.yml |
| Environment name | pypi |
testpypi |
Owner 是 GitHub 仓库所有者,不是 PyPI 用户名。仓库名只填 rpkiparrot,不带完整 URL 或 .git。Workflow name 填文件名 release.yml,不填完整路径,也不填 YAML 中 name: 的展示文字。环境名与相应发布任务的配置保持一致。PyPI 发布者字段说明
添加后,分别查看两个站点的 pending publisher 列表,逐项核对字段。配置存在只证明已登记发布身份;首次上传成功后,平台才会创建项目并将其转为常规发布者。若项目已经由自己的账户拥有,则从 Your projects → Manage → Publishing 为已有项目添加发布者,不再走 pending 入口。新项目入口、已有项目入口
此方案使用 Trusted Publishing,由 GitHub Actions 通过 OIDC 获取短期发布身份,无需预先创建 PYPI_API_TOKEN 或 TEST_PYPI_API_TOKEN secret。账户登录仍使用自己的 2FA;两者用途不同。PyPI Trusted Publishing
5. 将非敏感配置交给代码生成工具
手工准备后,可复制下面的表单填写实际结果,用于后续工程初始化。它是交接模板;本文不维护账户操作进度或代码功能待办。
正式分发名称:rpkiparrot(或实际选定名称)
GitHub 仓库:bgpglobal/rpkiparrot
发布工作流文件:release.yml(或实际填写值)
正式 / 测试环境名:pypi / testpypi(或实际填写值)
两个站点的邮箱验证与 2FA:待填写完成情况
两个环境及允许的分支 / tag:待填写实际配置
两个站点的 pending publisher:待填写是否已添加,或说明已有项目
公开署名:待填写
公开联系邮箱:待填写,或明确不公开
其他配置差异:待填写
仓库、工作流或环境后来改名时,同步核对平台中的 Trusted Publisher 配置,避免生成代码使用另一套值。库功能与发布流水线的待实现事项继续使用 GitHub Issues 跟踪。
代码与验收就绪后的发布流程
上述手工准备不能证明包可以发布。仓库已建立 pyproject.toml、源码布局、版本与许可元数据,并通过 nox -s package 提供本地及 CI 制品检查。实际发布按以下流程执行:
- 核对最终提交的版本、许可、依赖及发布能力,执行已有构建与制品验收任务并保存报告。
- 选择显式手动 token 上传或自动 Trusted Publishing。后者需创建约定的工作流,分开构建、验收与上传任务;只给需要获取发布身份的任务授予
id-token: write,并绑定对应环境。PyPA 发布工作流指南 - 从明确的
main提交构建真实 wheel 与 sdist,完成 CI/CD 落地参考 规定的检查,再进行首次 TestPyPI 演练。 - 通过显式发布入口上传经过验收的同一批正式候选文件,检查项目页面、版本、下载哈希与干净环境安装;此时才能确认首次发布成功。
配置登记、测试站成功和正式站发布成功是不同的完成条件,应分别根据对应发布记录中的实际结果确认。