如何将带有特定于 python 的轮子的包发布到 GitLab 包注册表和麻线

问题描述

我尝试使用 GitLab CI 来自动化包发布过程并将发布存储在 GitLab 包注册表中。我遵循了文档:

https://docs.gitlab.com/ee/user/packages/pypi_repository/

并设法设置 CI,以便它构建并将轮子推送到包注册表。

但是,当有多个管道构建不同版本的包时,我遇到了一个问题,特定于不同的 python 版本。当我在给定版本中有超过 1 个版本的轮子时,似乎包注册表索引与版本不正确匹配,只有上传注册表的最后一个文件(字面意思是最后一个,按照上传/推送顺序)可用/可以通过pip安装。

这是 GitLab 文档中 mypypipackage 示例的设置 - 扩展:

  1. 在我的 setup.py 中,我正在“烘焙”python:
import sys
import setuptools

# Set the required version of python.
__python_version__ = "=={}.{}.*".format(sys.version_info.major,sys.version_info.minor)

# Set python tag if building a wheel.
if "bdist_wheel" in sys.argv:
    if not any(arg.startswith('--python-tag') for arg in sys.argv):
        sys.argv.extend(['--python-tag',"py{}{}".format(sys.version_info.major,sys.version_info.minor)])

setuptools.setup(
    name="mypypipackage",version="0.1.3",author="tkornuta",description="A small example package",packages=setuptools.find_packages(),classifiers=[
        'Programming Language :: Python :: {}.{}'.format(sys.version_info.major,sys.version_info.minor),"License :: OSI Approved :: MIT License","Operating System :: OS Independent",],python_requires=__python_version__,)
  1. 我已经设置了 GitLab CI 来为三个不同的 Python 版本/容器构建三个轮子:
python36:
  image: "urm.nvidia.com/docker/python:3.6"
  script:
    - python -c "import sys; print('{}.{}.*'.format(sys.version_info.major,sys.version_info.minor))"
    - pip install twine
    - python setup.py bdist_wheel
    - TWINE_PASSWORD=${CI_JOB_TOKEN} TWINE_USERNAME=gitlab-ci-token python -m twine upload --repository-url  https://gitlab.example.com/api/v4/projects/<project_id>/packages/pypi dist/*

python37:
  image: "urm.nvidia.com/docker/python:3.7"
  script:
    - python -c "import sys; print('{}.{}.*'.format(sys.version_info.major,sys.version_info.minor))"
    - pip install twine
    - python setup.py bdist_wheel
    - TWINE_PASSWORD=${CI_JOB_TOKEN} TWINE_USERNAME=gitlab-ci-token python -m twine upload --repository-url  https://gitlab.example.com/api/v4/projects/<project_id>/packages/pypi dist/*

python38:
  image: "urm.nvidia.com/docker/python:3.8"
  script:
    - python -c "import sys; print('{}.{}.*'.format(sys.version_info.major,sys.version_info.minor))"
    - pip install twine
    - python setup.py bdist_wheel
    - TWINE_PASSWORD=${CI_JOB_TOKEN} TWINE_USERNAME=gitlab-ci-token python -m twine upload --repository-url  https://gitlab.example.com/api/v4/projects/<project_id>/packages/pypi dist/*
  1. 当 Ci 完成时,我可以在包注册表中清楚地看到这个版本 (0.1.3) 的三个版本的轮子:

enter image description here

  1. 安装“最新上传的”轮子(即 Python 3.8)文件时,它可以正常工作:
(p38) tkornuta@aaa:~$ pip install mypypipackage --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple
Looking in indexes: https://<personal_access_token_name>:****@@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple
Collecting mypypipackage
  Downloading https://bbb/mypypipackage-0.1.3-py38-none-any.whl (1.6 kB)
Installing collected packages: mypypipackage
Successfully installed mypypipackage-0.1.3
  1. 但是当我尝试使用不同的python版本安装wheel时,例如在使用 python 3.7 的 venv 中,pip 抛出错误
(p37) tkornuta@aaa$ pip install mypypipackage==0.1.3 --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple
Looking in indexes: https://<personal_access_token_name>:****@@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple
ERROR: Could not find a version that satisfies the requirement mypypipackage==0.1.3
ERROR: No matching distribution found for mypypipackage==0.1.3

我已经成功下载并手动安装了 python 3.6 和 3.7 版本的轮子 - 这里没有问题。我也做了一些实验并上传了例如3.7 只有一个轮子 - 并设法直接从包注册表中通过 pip 安装它,没有任何问题。

那我错过了什么?我做错了什么?

这是包注册表的一个问题,它无法为给定的发行版处理/提供给定轮子的多个版本吗?

谢谢, 托马斯

附言。 我也在 gitlab forum 上问过这个问题,希望在这里我可以接触到更广泛的受众,也许有人想出了解决这个问题的方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)