首頁 >後端開發 >Python教學 >可信任發布 - 發布 Python 套件從未如此簡單

可信任發布 - 發布 Python 套件從未如此簡單

Barbara Streisand
Barbara Streisand原創
2024-12-06 18:04:15509瀏覽

發布 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn