首页 > 后端开发 > Python教程 > 可信发布 - 发布 Python 包从未如此简单

可信发布 - 发布 Python 包从未如此简单

Barbara Streisand
发布: 2024-12-06 18:04:15
原创
512 人浏览过

发布 Python 包曾经是一项艰巨的任务,但现在不再是了。更好的是,它变得更加安全。依靠 CLI 工具同时处理用户名、密码或 API 令牌的日子已经一去不复返了。通过可信发布,您只需向 PyPI 提供 GitHub 存储库的详细信息,GitHub Actions 就会负责繁重的工作。

如何通过可信发布来发布 Python 包

我将介绍一个工作流程,当创建标签时(在开发分支上)将您的包发布到 TestPyPi,或者当您合并到主分支时将包发布到 PyPi。

准备发布包

确保您的 Python 包遵循 PyPI 的打包指南。您至少需要:

  • 定义包元数据的 setup.py 或 pyproject.toml 文件。
  • 结构正确的代码,具有清晰的目录布局。
  • 用于在 PyPI 上展示您的项目的自述文件。

有关详细清单,请参阅《Python 打包用户指南》。

在您的存储库中配置 GitHub 操作

让我们首先创建一个新的 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 环境

确保只有特定标签才会触发发布工作流程并保持对发布过程的控制。
通过导航到“设置”->“创建一个新的环境测试版本” GitHub 存储库中的环境。

设置环境并添加部署标签规则。

Trusted publishing ‐ It has never been easier to publish your python packages

Trusted publishing ‐ It has never been easier to publish your python packages

根据规则或命名模式限制哪些分支和标签可以部署到此环境。

Trusted publishing ‐ It has never been easier to publish your python packages

根据命名模式限制哪些分支和标签可以部署到此环境。

Trusted publishing ‐ It has never been easier to publish your python packages

配置目标标签。

Trusted publishing ‐ It has never been easier to publish your python packages

模式 [0-9]*.[0-9]*.[0-9]* 匹配语义版本控制标签,例如 1.2.3、0.1.0 或 2.5.1b3,但它排除任意标签,例如bugfix-567 或功能更新。

对发布环境重复此操作,以相同的方式保护主分支,但这次针对主分支。

Trusted publishing ‐ It has never been easier to publish your python packages

设置 PyPI 项目并链接您的 GitHub 存储库

如果您没有 TestPyPI 帐户,请创建一个帐户。
导航至您的帐户、发布并添加新的待定发布商。
通过提供名称、GitHub 用户名、存储库名称、工作流程名称 (test-build-publish.yml) 和环境名称 (test-release),将 GitHub 存储库链接到 PyPI 项目。

Trusted publishing ‐ It has never been easier to publish your python packages

在 PyPI 上重复上述操作,并将环境名称设置为release。

测试工作流程

现在,每当您在开发分支上创建标签时,它都会触发一个版本上传到 TestPyPI,并将开发分支合并到 main 会将版本上传到 PyPI。

未涵盖的内容

虽然本指南介绍了可信发布工作流程,但您还可以考虑实施其他步骤和最佳实践。例如,设置分支保护规则可以确保只有授权的协作者才能推送标签或合并到受保护的分支,例如 main 或development。您还可以在合并之前强制执行状态检查或要求进行拉取请求审查,从而添加另一层质量保证。

看看我的 python-repository-template,其中涵盖了对此工作流程的其他增强功能,例如要求通过单元和静态测试、使用 Pyroma 检查包以及使用 vercheck 确保您的标签与包的版本匹配。

概括

如果您一直不愿分享您的作品,那么现在是尝试可信出版的最佳时机。

  • 引入“受信任的发布者”Python 包索引博客强调了一种更安全的发布方法,不需要与外部系统共享长期密码或 API 令牌
  • 使用受信任的发布者发布到 PyPI 官方 PyPI 文档,帮助您开始在 PyPI 上使用受信任的发布者。
  • 在官方 GitHub 文档中构建和测试 Python。

以上是可信发布 - 发布 Python 包从未如此简单的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板