簡體   English   中英

GitHub 操作 - 發布到 TestPyPI 和 PyPI 失敗

[英]GitHub action - publishing to both TestPyPI and PyPI fails

我根據本指南設置了一個 GitHub 工作流,用於將我的 Python 項目發布到(測試)PyPI: https ://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions -ci-cd-workflows/導致此工作流程: https ://github.com/felixocker/ontor/blob/main/.github/workflows/publish-to-pypi.yml

每當我推送到主分支時,都會創建一個新的 TestPyPI 版本:

- name: Publish distribution to Test PyPI
  uses: pypa/gh-action-pypi-publish@master
  with:
    password: ${{ secrets.TEST_PYPI_API_TOKEN }}
    repository_url: https://test.pypi.org/legacy/

這工作得很好,cp。例如,提交 15a3bf6

當我使用標簽推送時,這應該像往常一樣推送到 TestPyPI,但標簽也應該觸發推送到 PyPI:

- name: Publish distribution to PyPI
  if: startsWith(github.ref, 'refs/tags')
  uses: pypa/gh-action-pypi-publish@master
  with:
    password: ${{ secrets.PYPI_API_TOKEN }}

但是,這會失敗並出現 400 錯誤,cp.,例如,提交 b450e0f:

ERROR    HTTPError: 400 Bad Request from https://test.pypi.org/legacy/
         File already exists. See https://test.pypi.org/help/#file-name-reuse
         for more information.

有趣的是,在推送到 TestPyPI 的步驟中已經發生錯誤,之后跳過推送到 PyPI。 此外,當我嘗試手動將最新版本上傳到 PyPI 時,我得到了同樣的錯誤。 不過,在那次手動嘗試之后,該版本可以通過 PyPI 獲得。

真的不確定我在這里缺少什么 - 所以非常感謝指針:)

################################################

編輯#1:

對於提交 15a3bf6 和 b5cade1,這種行為對我來說是有意義的,因為我沒有在此處更改版本號。

由於@Indra 的響應和操作概述,我剛剛意識到,工作流針對同一個提交執行了兩次:b450e0f 在運行 #33 和 #34
是否有兩次運行,因為標簽被視為自己的推送(可能由“v0.4.2”與“main”表示)?
我使用推送提交和相應的標簽

git push --atomic origin main <tag>

不過,這應該是同時的。
如果是這樣,有沒有辦法保持預期的行為:“只要我推送到 main,就發布到 TestPyPI,只要有標簽就發布到 PyPI”,假設我更新了版本,不需要兩次運行?

在您的錯誤消息中,應該清楚您的工作流程嘗試將相同的包版本上傳到 TestPyPI。 PyPI 不允許多次上傳相同版本的包。 這里 這就是為什么你得到File already exists錯誤。

在您的 TestPI 工作流程中:

- name: Publish distribution to Test PyPI
  uses: pypa/gh-action-pypi-publish@master
  with:
    password: ${{ secrets.TEST_PYPI_API_TOKEN }}
    repository_url: https://test.pypi.org/legacy/

每當您推送到存儲庫時,GitHub 操作都會將包上傳到 TestPyPI。 如果您的包在多次推送時指向同一個版本,則工作流將失敗,因為包已在第一次推送時上傳到 TestPyPI。

一切正常。 版本 0.3.7 已上傳到 GitHub 上的 TestPyPI 推送到主分支。

包版本仍然指向 0.3.7。 GitHub 推送到主分支觸發操作並嘗試將包重新上傳到 TestPyPI 並失敗,因為版本已經存在。

GitHub 操作跳過上傳到 PyPI,因為未標記提交。

包版本更改為 0.4.0。 第一次推送成功構建並上傳包到TestPyPI,但后續上傳失敗。 錯誤還是一樣,GitHub actions 嘗試上傳相同版本的包。

很快。

您可以將 TestPyPI 工作流程更改為僅在標記提交時上傳,或者您可以在推送到 GitHub 存儲庫時更改包版本。 第一個解決方案會更可行。

測試PyPI:

- name: Publish distribution to Test PyPI
  if: startsWith(github.ref, 'refs/tags')
  uses: pypa/gh-action-pypi-publish@master
  with:
    password: ${{ secrets.TEST_PYPI_API_TOKEN }}
    repository_url: https://test.pypi.org/legacy/

派皮:

- name: Publish distribution to PyPI
  if: startsWith(github.ref, 'refs/tags')
  uses: pypa/gh-action-pypi-publish@master
  with:
    password: ${{ secrets.PYPI_API_TOKEN }}

所以這就是發生的事情:
顯然,即使在使用時,GitHub 也會分別處理提交和標簽的推送

git push --atomic origin main <tag>

通過 SSH,請參閱此討論
這會導致 github 操作運行兩次,因為它是由每次推送觸發的。 版本號已在第一次運行時用於 TestPyPI,在第二次運行時產生文件已存在錯誤。

什么對我有用:
根據此討論,將推送到 TestPyPI 和 PyPI 的兩種情況設為獨占:

    - name: Publish distribution to Test PyPI
      if: ${{ !startsWith(github.ref, 'refs/tags') }}
      uses: pypa/gh-action-pypi-publish@master
      with:
        password: ${{ secrets.TEST_PYPI_API_TOKEN }}
        repository_url: https://test.pypi.org/legacy/
    - name: Publish distribution to PyPI
      if: startsWith(github.ref, 'refs/tags')
      uses: pypa/gh-action-pypi-publish@master
      with:
        password: ${{ secrets.PYPI_API_TOKEN }}

每當將不帶標簽的提交推送到 GitHub 時,都會觸發推送到 TestPyPI。 推送標簽時,版本會發布到 PyPI。 需要注意的是,提交必須由標記之前的操作處理,在我的情況下,這對提交 f732bda 不起作用。 此外,正如@Indra 所述,必須增加版本號才能使操作生效。 或者,可以如這里描述的那樣區分常規標簽和分層標簽,例如“v0.3.0/beta”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM