Публикация пакета в PyPi от Azure Devops зависает при загрузке шпагата - PullRequest
1 голос
/ 17 апреля 2020

Я хочу опубликовать sh встроенный пакет .whl на PyPi.org из нашего Azure конвейера выпуска Devops, но скрипт twine upload продолжает зависать без ошибок, завершения или истечения времени ожидания. Таким образом, фактическая загрузка нашего пакета (который очень мал) не работает.

Вот как он настроен:

Сборка yaml:

trigger:
- master
pr: none
pool:
  vmImage: 'ubuntu-latest'

steps:
- task: UsePythonVersion@0
  inputs:
    versionSpec: '3.7'
    addToPath: true
    architecture: 'x64'

- script: python -m pip install --upgrade pip setuptools wheel
  displayName: 'Install tools'

- script: pip install -r src/requirements.txt
  displayName: 'Install requirements'

- script: |    
    python src/setup.py bdist_wheel 
  displayName: 'Artifact creation'

- script: python -m pip install --upgrade twine
  displayName: 'Install Twine'

- task: TwineAuthenticate@1
  inputs:
    pythonUploadServiceConnection: 'AzureML PyPi feed'

- script: |
   python -m twine upload --config-file $(PYPIRC_PATH) dist/*.whl
  displayName: 'Publish to PyPi through Twine'

Подключение к услуге:

  • Метод аутентификации определяется Authentication Token.
  • Python URL хранилища для загрузки: https://upload.pypi.org/legacy
  • Имя конечной точки: azure-pypi
  • Имя служебного соединения: AzureML PyPi feed
  • [X] Предоставить разрешение на доступ ко всем конвейерам

Журналы деблокирования (наиболее важные части):

Шаг TwineAuthenticate :

Starting: TwineAuthenticate
==============================================================================
Task         : Python twine upload authenticate
Description  : Authenticate for uploading Python distributions using twine. Add '-r FeedName/EndpointName --config-file $(PYPIRC_PATH)' to your twine upload command. For feeds present in this organization, use the feed name as the repository (-r). Otherwise, use the endpoint name defined in the service connection.
Version      : 1.165.0
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/package/twine-authenticate
==============================================================================
75c64e89-xxxxxredactedxxxxx exists true
Adding authentication to configuration for registry azure-pypi
Successfully added auth for 0 internal feed and 1 external endpoint.
Finishing: TwineAuthenticate

Шаг публикации :

Starting: Publish to PyPi through Twine
==============================================================================
Task         : Command line
Description  : Run a command line script using Bash on Linux and macOS and cmd.exe on Windows
Version      : 2.164.0
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/command-line
==============================================================================
Generating script.
Script contents:
python -m twine upload --config-file /home/vsts/work/_temp/twineAuthenticate/Wv8nMR/.pypirc dist/*.whl
========================== Starting Command Output ===========================
/bin/bash --noprofile --norc /home/vsts/work/_temp/0d772e31-148f-4e3c-999b-b2a43a02b287.sh
Uploading distributions to https://upload.pypi.org/legacy/

Это остается неизменным в течение более 30 минут, поэтому я просто отмените мой выпуск без развертывания пакета. Есть идеи по этому поводу?

1 Ответ

0 голосов
/ 17 апреля 2020

У меня есть временный обходной путь:

Я пропустил использование файла конфигурации и вместо этого выполнил следующий код:

- script: |
   python -m twine upload --skip-existing --verbose -p $(pypi-api-token) -u __token__ --repository $(pypi-project-name) --repository-url https://upload.pypi.org/legacy/ dist/*.whl
  displayName: 'Publish to PyPi through Twine'

И там я заметил немного больше ( и лучше) регистрация исключений, которая указала мне на две вещи:

  1. Токен, который я использовал для моего файла конфигурации, был задан для области проекта с именем, отличным от проекта, который я указал в своем служебном подключении
  2. URL-адрес хранилища действительно должен заканчиваться буксируемым впереди sla sh, потому что в противном случае вы получите исключение RedirectDetected.

На основании приведенных выше результатов я обновил свой фрагмент yaml к следующему:

- script: |
   python -m twine upload --skip-existing --verbose --repository $(pypi-project-name) --config-file $(PYPIRC_PATH) dist/*.whl
  displayName: 'Publish to PyPi through Twine'

Но при выполнении этого я теперь получаю следующее сообщение об исключении в сборке:

Generating script.
Script contents:
python -m twine upload --skip-existing --verbose --repository arcus-azureml --config-file /home/vsts/work/_temp/twineAuthenticate/2QGKVH/.pypirc dist/*.whl
========================== Starting Command Output ===========================
/bin/bash --noprofile --norc /home/vsts/work/_temp/7605dac9-5fa9-4856-94af-e938018278a5.sh
Uploading distributions to https://upload.pypi.org/legacy/
Uploading arcus_azureml-0.0.2-py3-none-any.whl

  0%|          | 0.00/5.80k [00:00<?, ?B/s]
100%|██████████| 5.80k/5.80k [00:00<00:00, 52.4kB/s]HTTPError: 403 Client Error: Invalid or non-existent authentication information. See https://pypi.org/help/#invalid-auth for details for url: https://upload.pypi.org/legacy/

Content received from server:
<html>
 <head>
  <title>403 Invalid or non-existent authentication information. See https://pypi.org/help/#invalid-auth for details</title>
 </head>
 <body>
  <h1>403 Invalid or non-existent authentication information. See https://pypi.org/help/#invalid-auth for details</h1>
  Access was denied to this resource.<br/><br/>
Invalid or non-existent authentication information. See https://pypi.org/help/#invalid-auth for details

Я также вывел содержимое файла pypir c с помощью команды CAT содержимое файла выглядит следующим образом:

[distutils]
index-servers=arcus-azureml 
[arcus-azureml]
repository=https://upload.pypi.org/legacy/
username=build
password=***

Обновленное решение

Итак, исправление для размещения 403 состояло в том, чтобы изменить мой Service Con Отказ от использования имени пользователя и пароля в качестве метода аутентификации вместо токена аутентификации со следующими настройками:

  • Имя пользователя: __token__
  • Пароль: фактический токен API в качестве пароля

После выполнения этого все работало так, как я хотел.

...