繁体   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