Загрузить в pypi из Gitlab Pipelines

Я пытаюсь загрузить пакет в pypi с помощью задания Gitlab CI, но не могу заставить его работать:/ У кого-нибудь есть рабочий пример?

Что я пробовал до сих пор в моем .gitlab-ci.yaml (с моей локальной машины все они работают):

  1. Шпагат с .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
    
  2. То же, что и раньше, но с $VARIABLE

    [...]
    - 'echo "username: $PYPI_USER" >> ~/.pypirc'
    - 'echo "password: $PYPI_PASSWORD" >> ~/.pypirc'
    [...]
    
  3. Два варианта, прежде чем использовать python setup.py ... upload

  4. twine upload dist/* -u $PYPI_USER -p $PYPI_PASSWORD
  5. twine upload dist/* Wiht TWINE_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):

  1. Установить переменные среды PYPI_SERVER, PYPI_USER а также PYPI_PASSWORD через настройки Gitlab CI

  2. Вызов

    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 так что на самом деле он не будет загружен

Другие вопросы по тегам