发布 Python 包曾经是一项艰巨的任务,但现在不再是了。更好的是,它变得更加安全。依靠 CLI 工具同时处理用户名、密码或 API 令牌的日子已经一去不复返了。通过可信发布,您只需向 PyPI 提供 GitHub 存储库的详细信息,GitHub Actions 就会负责繁重的工作。
我将介绍一个工作流程,当创建标签时(在开发分支上)将您的包发布到 TestPyPi,或者当您合并到主分支时将包发布到 PyPi。
确保您的 Python 包遵循 PyPI 的打包指南。您至少需要:
有关详细清单,请参阅《Python 打包用户指南》。
让我们首先创建一个新的 GitHub 操作 .github/workflows/test-build-publish.yml。
name: test-build-publish on: [push, pull_request] permissions: contents: read jobs: build-and-check-package: name: Build & inspect our package. runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: hynek/build-and-inspect-python-package@v2
此操作将构建您的包,并将构建的轮子和源代码分发 (SDist) 作为 GitHub Actions 工件上传。
接下来,我们添加一个发布到 TestPyPI 的步骤。每当创建标签时都会运行此步骤,以确保上一步的构建已成功完成。将 PROJECT_OWNER 和 PROJECT_NAME 替换为适合您的存储库的值。
test-publish: if: >- github.event_name == 'push' && github.repository == 'PROJECT_OWNER/PROJECT_NAME' && startsWith(github.ref, 'refs/tags') needs: build-and-check-package name: Test publish on TestPyPI runs-on: ubuntu-latest environment: test-release permissions: id-token: write steps: - name: Download packages built by build-and-check-package uses: actions/download-artifact@v4 with: name: Packages path: dist - name: Upload package to Test PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: repository-url: https://test.pypi.org/legacy/
此步骤下载在构建过程中创建的工件并将其上传到 TestPyPI 进行测试。
最后一步,当拉取请求合并到主分支时,我们会将包上传到 PyPI。
publish: if: >- github.event_name == 'push' && github.repository == 'PROJECT_OWNER/PROJECT_NAME' && github.ref == 'refs/heads/main' needs: build-and-check-package name: Publish to PyPI runs-on: ubuntu-latest environment: release permissions: id-token: write steps: - name: Download packages built by build-and-check-package uses: actions/download-artifact@v4 with: name: Packages path: dist - name: Publish distribution ? to PyPI for push to main uses: pypa/gh-action-pypi-publish@release/v1
确保只有特定标签才会触发发布工作流程并保持对发布过程的控制。
通过导航到“设置”->“创建一个新的环境测试版本” GitHub 存储库中的环境。
设置环境并添加部署标签规则。
根据规则或命名模式限制哪些分支和标签可以部署到此环境。
根据命名模式限制哪些分支和标签可以部署到此环境。
配置目标标签。
模式 [0-9]*.[0-9]*.[0-9]* 匹配语义版本控制标签,例如 1.2.3、0.1.0 或 2.5.1b3,但它排除任意标签,例如bugfix-567 或功能更新。
对发布环境重复此操作,以相同的方式保护主分支,但这次针对主分支。
如果您没有 TestPyPI 帐户,请创建一个帐户。
导航至您的帐户、发布并添加新的待定发布商。
通过提供名称、GitHub 用户名、存储库名称、工作流程名称 (test-build-publish.yml) 和环境名称 (test-release),将 GitHub 存储库链接到 PyPI 项目。
在 PyPI 上重复上述操作,并将环境名称设置为release。
现在,每当您在开发分支上创建标签时,它都会触发一个版本上传到 TestPyPI,并将开发分支合并到 main 会将版本上传到 PyPI。
虽然本指南介绍了可信发布工作流程,但您还可以考虑实施其他步骤和最佳实践。例如,设置分支保护规则可以确保只有授权的协作者才能推送标签或合并到受保护的分支,例如 main 或development。您还可以在合并之前强制执行状态检查或要求进行拉取请求审查,从而添加另一层质量保证。
看看我的 python-repository-template,其中涵盖了对此工作流程的其他增强功能,例如要求通过单元和静态测试、使用 Pyroma 检查包以及使用 vercheck 确保您的标签与包的版本匹配。
如果您一直不愿分享您的作品,那么现在是尝试可信出版的最佳时机。
以上是可信发布 - 发布 Python 包从未如此简单的详细内容。更多信息请关注PHP中文网其他相关文章!