Загрузить в pypi из Gitlab Pipelines
Я пытаюсь загрузить пакет в pypi с помощью задания Gitlab CI, но не могу заставить его работать:/ У кого-нибудь есть рабочий пример?
Что я пробовал до сих пор в моем .gitlab-ci.yaml
(с моей локальной машины все они работают):
Шпагат с
.pypirc
файл- echo "[distutils]" >> ~/.pypirc - echo "index-servers =" >> ~/.pypirc - echo " pypi" >> ~/.pypirc - echo "" >> ~/.pypirc - echo "[pypi]" >> ~/.pypirc - 'echo "repository: https://upload.pypi.org/legacy/" >> ~/.pypirc' - 'echo "username: ${PYPI_USER}" >> ~/.pypirc' - 'echo "password: ${PYPI_PASSWORD}" >> ~/.pypirc' - python3 setup.py check sdist bdist # This will fail if your creds are bad. - cat ~/.pypirc - twine upload dist/* --config-file ~/.pypirc
То же, что и раньше, но с
$VARIABLE
[...] - 'echo "username: $PYPI_USER" >> ~/.pypirc' - 'echo "password: $PYPI_PASSWORD" >> ~/.pypirc' [...]
Два варианта, прежде чем использовать
python setup.py ... upload
twine upload dist/* -u $PYPI_USER -p $PYPI_PASSWORD
twine upload dist/*
WihtTWINE_USERNAME
а такжеTWINE_PASSWORD
переменные среды
... и всегда получаю 403 Client Error: Invalid or non-existent authentication information
, У меня заканчиваются варианты...
7 ответов
Я получил это работает, используя модифицированную версию вашего кода:
pypi:
stage: upload
script:
- pip install twine
- rm -rf dist
- echo "[distutils]" >> ~/.pypirc
- echo "index-servers =" >> ~/.pypirc
- echo " nexus" >> ~/.pypirc
- echo "" >> ~/.pypirc
- echo "[nexus]" >> ~/.pypirc
- echo "${PYPI_REPO}" >> ~/.pypirc
- echo "${PYPI_USER}" >> ~/.pypirc
- echo "${PYPI_PASSWORD}" >> ~/.pypirc
- python3 setup.py check sdist bdist # This will fail if your creds are bad.
- python setup.py sdist bdist_wheel
- twine upload -r nexus dist/*.tar.gz
Разница в том, что я не использовал "" и избавился от двоеточий в ямле; вместо этого я устанавливаю значения секретов, например, username: myuser
Я просто использую TWINE_USERNAME
а также TWINE_PASSWORD
переменные, это работало из коробки.
Это часть в gitlab-ci.yml
(замените изображение на желаемое):
pypi:
image: docker.km3net.de/base/python:3
stage: release
cache: {}
script:
- pip install -U twine
- python setup.py sdist
- twine upload dist/*
only:
- tags
И добавьте переменные среды в GitLab в Настройки->CI/CD-> Переменные ( https://your-gitlab-instance.oerg/GIT_NAMESPACE/GIT_PROJECT/settings/ci_cd):
Вот успешный конвейер:
Если возникают проблемы с EOF, обязательно измените Настройки / Репозиторий / Теги, чтобы они были защищены, чтобы они снова заработали. Я разместил здесь более полное описание.
Обратите внимание, что GitLab 12.10 (апрель 2020 г.) будет предлагать в своей версии Premium или более простой способ (опять же, не бесплатно).
Сборка, публикация и совместное использование пакетов Python в репозитории GitLab PyPI
Разработчикам Python нужен механизм для создания, совместного использования и использования пакетов, содержащих скомпилированный код и другой контент в проектах, использующих эти пакеты. PyPI, проект с открытым исходным кодом, поддерживаемый Python Packaging Authority, является стандартом для определения, создания, размещения и использования пакетов Python.
В GitLab 12.10 мы с гордостью предлагаем репозитории PyPI, встроенные непосредственно в GitLab! У разработчиков теперь есть более простой способ публиковать пакеты Python для своих проектов. Благодаря интеграции с PyPI, GitLab предоставит централизованное место для хранения и просмотра этих пакетов в том же месте, что и их исходный код и конвейеры.
В марте мы объявили, что репозиторий GitLab PyPI и поддержка других форматов диспетчеров пакетов будут переведены в открытый исходный код.
Вы можете следить за тем, как мы работаем над тем, чтобы сделать эти функции более доступными в эпопее.
См. Документацию и проблему.
Вы также можете загрузить пакет python на частный сервер Pypi в одну строку (я использую его с gilab-ci):
Установить переменные среды
PYPI_SERVER
,PYPI_USER
а такжеPYPI_PASSWORD
через настройки Gitlab CIВызов
twine upload --repository-url ${PYPI_SERVER} --username $PYPI_USER --password $PYPI_PASSWORDD $artifact
Примечание: мне пришлось использоватьtwine
из PIP
(pip3 install twine
), а не из моего пакета Ubuntu, поскольку версия 10 twine
похоже есть ошибка (zipfile.BadZipFile: File is not a zip file
).
Вы также можете изучить использование dpl: Вот как я это делаю:
pip:
stage: upload
script:
- apt-get update -qy
- apt-get install -y ruby-dev
- gem install dpl
- python setup.py sdist
- dpl --provider=pypi --user=$PIP_USERNAME --password=$PIP_PASSWORD --skip_existing=true
only:
- master
Вы можете установить $PIP_USERNAME
а также $PIP_PASSWORD
в разделе переменных для вашего проекта: settings -> CI/CD -> Variables
Я знаю, что это старый вопрос, но если вы используете
poetry
(Тестирую с версией
1.1.11
) вы можете сделать это довольно легко, например:
poetry config repositories.my_private_repo [URL_TO_YOUR_PYPI_REPO]
poetry config http-basic.my_private_repo [USERNAME] [PASSWORD]
poetry build
poetry publish --repository my_private_repo
В ветках разработки вы можете добавить
--dry-run
аргумент
poetry publish
так что на самом деле он не будет загружен