使用 Travis-CI 将多个发行版部署到 PyPI 时防止冲突

Posted

技术标签:

【中文标题】使用 Travis-CI 将多个发行版部署到 PyPI 时防止冲突【英文标题】:Preventing conflicts when deploying multiple distros to PyPI using Travis-CI 【发布时间】:2018-03-05 08:32:46 【问题描述】:

我希望 Travis CI 在新提交到达 master 分支时构建并部署以下工件到 PyPI:

Python 2 轮 Python 3 *** 来源

为了实现这一点,我已将以下内容添加到 .travis.yml

language: python
python:
  - '2.7'
  - '3.5'
  - '3.6'
deploy:
  on:
    branch: master
  provider: pypi
  distribution: bdist_wheel sdist

对于正常的构建/测试,配置效果很好。但是,它引入了一个竞争条件when deploying to PyPI:

Uploading distributions to https://upload.pypi.org/legacy/
Uploading PyOTA-2.0.0b1.tar.gz
HTTPError: 400 Client Error: File already exists. for url: https://upload.pypi.org/legacy/

我应该对 .travis.yml 进行哪些更改以让 Travis CI 将正确的工件部署到 PyPI?

【问题讨论】:

【参考方案1】:

我今天遇到了这个问题,最终发现了这个记录不足的 gem:

deploy:
  provider: pypi
  skip_existing: true
  ...

我在一个项目中使用skip_existing: true 来获得一次发布的源代码和***,即使我测试了几个不同的配置和 python 版本。便利。此resolved github issue 中的更多详细信息。我还提交了documentation diff。

【讨论】:

【参考方案2】:

有些日子我会跳出框框思考;其他日子它只是一个非常大的盒子。

以前,这个项目需要单独的 Python 2 和 Python 3 ***,所以我需要 Travis CI 来使用不同版本的 Python 构建***。

但最近我得到了正确构建通用***的项目,所以现在 Travis 可以使用任何一种 Python 版本构建所有部署工件。

我相应地修改了.travis.yml,而everything is working great:

deploy:
  on:
    branch: master
    python: '3.6'

【讨论】:

这是一个很好的答案。这不是我所期望的,但根据我的研究,这是正确的答案。我一直在寻找一种将构建和测试与部署分开的方法,这实现了这一点,但不是以我期望的方式。感谢您的帮助!和你一样,我已经在制造通用***了,但是是否值得更新你的回复,在 setup.py 中使用options='bdist_wheel': 'universal': True 包含你是如何做到这一点的? 啊,有趣;我不知道这是一个选择。我把它放在setup.cfg.

以上是关于使用 Travis-CI 将多个发行版部署到 PyPI 时防止冲突的主要内容,如果未能解决你的问题,请参考以下文章

使用Travis-CI自动化部署Hexo博客

github travis-ci持续部署hexo博客

TravisCI 部署找不到 setup.py

Travis-Ci 的 pypi 部署如何安全?

没有找到 setup.py 的任何发行版

CI/CD 平台迁移实践:从 Travis-CI 转移到 Github Action