GitLab CI を使用してパッケージ リリース プロセスを自動化し、リリースを GitLab Package Registry に保存しようとしています。私はドキュメントに従いました:
https://docs.gitlab.com/ee/user/packages/pypi_repository/
CIをセットアップして、ホイールをビルドしてパッケージレジストリにプッシュすることができました。
ただし、異なる python バージョンに固有の、異なるバージョンのパッケージをビルドするパイプラインがいくつかある場合、問題に直面しました。特定のリリースに複数のバージョンの wheel がある場合、Package Registry インデックスがバージョンと正しく一致していないようで、レジストリにアップロードされた最後のファイル (文字通り最後、アップロード/プッシュの順序に従う) のみが利用可能です。 /pip経由でインストールできます。
セットアップは次のmypypipackage
とおりです-GitLabドキュメントの例の拡張:
- 私の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__,
)
- 3 つの異なる Python バージョン/コンテナー用に 3 つのホイールを構築するように GitLab CI をセットアップしました。
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/*
- Ci が完了すると、このリリース (0.1.3) のパッケージ レジストリに 3 つのバージョンのホイールがはっきりと表示されます。
- 「最新のアップロードされた」ホイール (つまり、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
- しかし、python 3.7 の venv など、異なる python バージョンで wheel をインストールしようとすると、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 用のホイールを 1 つだけアップロードしました。また、パッケージ レジストリから pip 経由で問題なくインストールできました。
それで、私は何が欠けていますか?私は何を間違っていますか?
特定のリリースの特定のホイールの多くのバージョンを処理/提供できないのは、Package Registry の問題ですか?
ありがとう、トマシュ
Ps。私はgitlab フォーラムでもこの質問をしました。ここでより多くの聴衆にリーチできることを願っています。誰かがこの問題を解決する方法を見つけたかもしれません。